- AMD GPU-k jövője - amit tudni vélünk
- OLED TV topic
- AMD vs. INTEL vs. NVIDIA
- Két új Ryzen közül választhatnak a kézikonzolok
- GeForce RTX 5050 VGA-k a Palit értelmezésében
- DUNE médialejátszók topicja
- Hobby elektronika
- Sony MILC fényképezőgépcsalád
- HiFi műszaki szemmel - sztereó hangrendszerek
- NVIDIA GeForce RTX 5070 / 5070 Ti (GB205 / 203)
Új hozzászólás Aktív témák
-
jattila48
aktív tag
válasz
jattila48 #4467 üzenetére
Azt hiszem, sikerült kisilabizálni a választ. Függvény nevek esetén a név dekoráció (vagy manglálás) azért kell, hogy a linker meg tudja különböztetni az overload-olt fv. neveket. Ez világos (és eddig is az volt). Függvény pointer nevek azonban nem overload-olhatók, ezért ott nincs szükség név dekorációra, így az extern "C" deklarációnak (ami elnyomja a C++ név dekorációt) sincs értelme. Gondoltam én. Csakhogy fv. pointer nevek esetén a dekorációt nem az overload-olás miatt használják, hanem a hívási konvenció miatt. A különböző TU-kban deklarált és definiált ugyanolyan nevű fv. pointereknek meg kell egyezni a hívási konvencióban. Eddig azt gondoltam, hogy nincs külön C és C++ hívási konvenció (mint ahogy MS fordítóknál nincs is), de elképzelhető, hogy más fordítóknál ez másképp van. Legalábbis a lehetőségét fenntartják.
érdekes olvasmány: [link]
Idézet a cppreference.com -ról:
"Since language linkage is part of every function type, pointers to functions maintain language linkage as well. Language linkage of function types (which represents calling convention) and language linkage of function names (which represents name mangling) are independent of each other"
Tehát a fv. típus és fv. név language linkage-e (mint pl. az extern "C") két különböző, és független dolog. Eszerint fv. pointer esetén a language linkage a pointer által mutatott fv. típusára utal (hívási konvenció), nem pedig a fv. pointer névre.
Elnézést a hosszú hozzászólásért, remélem azért érthető volt min problémáztam.
-
coco2
őstag
válasz
jattila48 #4467 üzenetére
A lentiek akkor tudnak neked magyarázatul szolgálni, ha legacy problémákba ütköztél bele.
A C és a C++ linkelések eltérőek. A legacy környezetekkel kompatibilis linkelés kötelezően támogatott mindegyik fordító által, de külön jelezned kell, ha azt kívánod használni.
A C++ linkelés néhány verziónként eltér, és nem lehet azok között átugrálni. Egy nagyon régi projekthez előrefordított C++ dll-t nem tudsz új projektekben betölteni. Próbáld ki, és meglátod. Forráskódot kell újrafordítani jelenkori verzió alatt. Ha azt meg tudod tenni, akkor értelmetlen a vacakolás - ahogy írtad. De ha csak bináris formában van rádhagyva egy régi C++ dll, és nincsen lehetőséged újrafordításra, akkor bizony workaround kell. Egyik lehetőségként visszatérhetsz régebbi C++ fordítóra, és használhatod a teljes projekthez. Feltéve, hogy a toolchain-ed nem kényszerít rád újabb verziót. Ha abba ütköztél bele, akkor rámicsodáltál. Egy régebbi C++ dll binárisa lehetségesen kuka. Egy C dll örökéletű. A C idejében még nem volt verziók közötti kompatibilitási gond, és a mai napig nincsen.
Ami probléma egy előrefordított C dll-el lenni tud, az a target cpu. Legacy C dll-ek várhatóan x86. De azóta már előfordul armv7 és x64 is. Eltérő platformokon nem tudsz keresztül linkelni.
-
cog777
őstag
válasz
jattila48 #4467 üzenetére
Azt hittem azt kerdezed hogy csak a declaraciora vonatkozik az extern "c" vagy az implementaciora is.
A fenti peldaban mindkettot ajanljak, ha tobbfele forditot hasznalsz.Ha a valtozora kerdezel ra, akkor igen lehet hasznalni arra is, ugyanabbol a celbol.
Language linkage - cppreference.com -
jattila48
aktív tag
-
cog777
őstag
válasz
jattila48 #4465 üzenetére
Nem kotelezo, de az okosok azt irjak hogy erdemes lehet hasznalni.
Utolso elotti hozzaszolas.
"We had always only added extern "C" to the header definitions, but this allows the C++ code to implement the function with a different signature via overloading without errors and yet it doesn't mangle the symbol definition so at link times it uses this mismatching function. If the header and the definition both have extern "C" then a mismatched signature generates an error with Visual Studio 2017 and with g++ 5.4." -
jattila48
aktív tag
-
cog777
őstag
válasz
jattila48 #4463 üzenetére
Funkcio nevet c-vel kompatibilissa teszi. Jol jon ha a library-t hozza akarod forditani mas c++ forditoban keszult projektel vagy akar mas nyelvben pl python akarod hasznalni.
Minden c++ forditobak megvan a maga formatuma, c viszont kompatibilis.
linux alatt vannak parancsok amivel ezt meg tudod nezni ha erdekel. -
jattila48
aktív tag
Meg tudná valaki mondani, hogy egy C++ kódban -function prototype kivételével- mi értelme van az extern "C" deklarációnak?
-
DrojDtroll
veterán
válasz
Steve_Brown #4461 üzenetére
Nem. Webes lesz. Sok mindent nem akarok, a háttérben prefetch-elem a szükséges értékeket, ebből egy statikus html oldalt készítek. Sok lesz az igen/nem kimenetelű mérés. Ezeket aggregálni szeretném, és csak a hibákat külön megjeleníteni. Ahol számértékek lesznek ott egyszerű táblázatok fogok használni az adatok megjelenítésére.
-
Steve_Brown
senior tag
válasz
DrojDtroll #4460 üzenetére
Qt-val csinálnád?
-
DrojDtroll
veterán
válasz
Steve_Brown #4459 üzenetére
Én most akarok belefogni egy hobby c++ projektbe. Akarok egy olyan dashboardot a homelab-hoz ami egy szempillantás alatt betölt.
-
Steve_Brown
senior tag
Elég kihalt ez a topik. Pedig a menők C++-ban programoznak.
-
cog777
őstag
https://godbolt.org/-ot nem is ismertem, asm-et mutat egy c++ programrol.
-
cog777
őstag
Tobb megoldast kaptam, itt lehet elolvasni.
Lenyeg: van lehetoseg trukkozni, de az tenyleg trukkozes, inkabb template specializaciot valasztanek.Ez a megoldas tetszett jobban:
#include <fmt/format.h>
#include <array>
#include <cstddef>
#include <mutex>
enum class thread_safety_mode {
safe,
unsafe,
};
template <typename T, std::size_t Size, thread_safety_mode Mode>
class circular_buffer;
template <typename T, std::size_t Size>
class circular_buffer<T, Size, thread_safety_mode::unsafe> {
public:
// Push an item to the tail
bool push(const T& item) {
if (is_full()) return false;
buffer_[head_] = item;
head_ = (head_ + 1) % buffer_.size();
return true;
}
// Pop an item from the head
bool pop(T& item) {
if (is_empty()) return false;
item = buffer_[tail_];
tail_ = (tail_ + 1) % buffer_.size();
return true;
}
// Check if the buffer is full
bool is_full() const { return (head_ + 1) % buffer_.size() == tail_; }
// Check if the buffer is empty
bool is_empty() const { return head_ == tail_; }
private:
std::array<T, Size> buffer_;
std::size_t head_{0};
std::size_t tail_{0};
};
template <typename T, std::size_t Size>
class circular_buffer<T, Size, thread_safety_mode::safe> {
public:
bool push(const T& item) {
std::lock_guard<std::mutex> lk(m);
fmt::println("locked for push()");
return unsafe_buffer.push(item);
}
// Pop an item from the head
bool pop(T& item) {
std::lock_guard<std::mutex> lk(m);
fmt::println("locked for pop()");
return unsafe_buffer.pop(item);
}
// Check if the buffer is full
bool is_full() const {
std::lock_guard<std::mutex> lk(m);
fmt::println("locked for is_full()");
return unsafe_buffer.is_full();
}
// Check if the buffer is empty
bool is_empty() const {
std::lock_guard<std::mutex> lk(m);
fmt::println("locked for is_empty()");
return unsafe_buffer.is_empty();
}
private:
circular_buffer<T, Size, thread_safety_mode::unsafe> unsafe_buffer{};
mutable std::mutex m{};
};
auto main() -> int {
//
circular_buffer<int, 42, thread_safety_mode::safe> cb{};
cb.push(43);
cb.push(44);
cb.push(45);
int val;
cb.pop(val);
fmt::println("val: {}", val);
cb.pop(val);
fmt::println("val: {}", val);
cb.pop(val);
fmt::println("val: {}", val);
} -
cog777
őstag
Masik kerdes.
Adja magat egy thread es egy nem thread safe verzioja a circual_buffer-nek.
Forditasi idoben meg tudom mondani hogy a mutex-es sorok letiltodjanak vagy engedelyezve legyenek template-et hasznalva?Valami ilyesmire gondoltam, ugyanakkor forditasi hibaim vannak:
#pragma once
#include <array>
#include <stddef.h>
#include <mutex>
enum class THREAD_SAFETY
{
THREAD_SAFE = 0,
NOT_THREAD_SAFE
};
template <typename T, size_t S, THREAD_SAFETY TH>
class circular_buffer
{
public:
explicit circular_buffer() {}
// Push an item to the tail
bool push(const T &item)
{
if constexpr (std::is_same<TH, THREAD_SAFETY::THREAD_SAFE>::value)
{
std::lock_guard<std::recursive_mutex> lk(m);
}
if (is_full())
return false;
buffer_[head_] = item;
head_ = (head_ + 1) % buffer_.size();
return true;
}
// Pop an item from the head
bool pop(T &item)
{
if constexpr (std::is_same<TH, THREAD_SAFETY::THREAD_SAFE>::value)
{
std::lock_guard<std::recursive_mutex> lk(m);
}
if (is_empty())
return false;
item = buffer_[tail_];
tail_ = (tail_ + 1) % buffer_.size();
return true;
}
// Check if the buffer is full
bool is_full() const
{
if constexpr (std::is_same<TH, THREAD_SAFETY::THREAD_SAFE>::value)
{
std::lock_guard<std::recursive_mutex> lk(m);
}
return (head_ + 1) % buffer_.size() == tail_;
}
// Check if the buffer is empty
bool is_empty() const
{
if constexpr (std::is_same<TH, THREAD_SAFETY::THREAD_SAFE>::value)
{
std::lock_guard<std::recursive_mutex> lk(m);
}
return head_ == tail_;
}
private:
std::array<T, S> buffer_;
size_t head_{0};
size_t tail_{0};
if constexpr (std::is_same<TH, THREAD_SAFETY::THREAD_SAFE>::value)
{
mutable std::recursive_mutex m;
}
};main.cpp-ben:
circular_buffer<int, 5, THREAD_SAFETY::THREAD_SAFE> buffer;
De sajnos hibakat ir ki:
/home/zoltan/dev/learning/CPP/algorithms/producer-consumer/circular_buffer.h:70:5: error: expected unqualified-id before ‘if’
70 | if constexpr (std::is_same<TH, THREAD_SAFETY::THREAD_SAFE>::value)
| ^~
/home/zoltan/dev/learning/CPP/algorithms/producer-consumer/circular_buffer.h: In member function ‘bool circular_buffer<T, S, TH>::push(const T&)’:
/home/zoltan/dev/learning/CPP/algorithms/producer-consumer/circular_buffer.h:21:66: error: type/value mismatch at argument 1 in template parameter list for ‘template<class, class> struct std::is_same’
21 | if constexpr (std::is_same<TH, THREAD_SAFETY::THREAD_SAFE>::value)Masreszt nem vagyok biztos hogy a constexpr if-ek valodi blokkent mukodnek, tehat a lock_guard mukodni fog-e...
-
cog777
őstag
Le tudna valaki csekkolni ezt a kodot? Tok mas teruleten dolgoztam mostanaban es radobbentem, hogy bizonytalan vagyok most ebben az alap kerdesben. Consumer-producer, thread safe circular buffer-rel + recursize mutex.
Lefordul, mukodik crash nelkul, de kivancsi vagyok hogy elszabtam-e valamit... koszi elore is.
Circular buffer kodja:
circular_buffer.h#pragma once
#include <array>
#include <stddef.h>
#include <mutex>
template <typename T, size_t S>
class circular_buffer
{
public:
explicit circular_buffer() {}
// Push an item to the tail
bool push(const T &item)
{
std::lock_guard<std::recursive_mutex> lk(m);
if (is_full())
return false;
buffer_[head_] = item;
head_ = (head_ + 1) % buffer_.size();
return true;
}
// Pop an item from the head
bool pop(T &item)
{
std::lock_guard<std::recursive_mutex> lk(m);
if (is_empty())
return false;
item = buffer_[tail_];
tail_ = (tail_ + 1) % buffer_.size();
return true;
}
// Check if the buffer is full
bool is_full() const
{
std::lock_guard<std::recursive_mutex> lk(m);
return (head_ + 1) % buffer_.size() == tail_;
}
// Check if the buffer is empty
bool is_empty() const
{
std::lock_guard<std::recursive_mutex> lk(m);
return head_ == tail_;
}
private:
std::array<T, S> buffer_;
size_t head_{0};
size_t tail_{0};
mutable std::recursive_mutex m;
};main.cpp
#include "circular_buffer.h"
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
circular_buffer<int, 5> buffer;
std::mutex mtx; // Mutex for protecting shared data
std::condition_variable empty, full; // Condition variables
void producer(int loops)
{
for (int i = 0; i < loops; ++i)
{
std::unique_lock<std::mutex> lock(mtx);
while (buffer.is_full())
{
empty.wait(lock); // Wait if buffer is full
}
buffer.push(i);
full.notify_one(); // Signal that buffer is not empty
std::cout << "Produced: " << i << std::endl;
}
}
void consumer(int loops)
{
for (int i = 0; i < loops; ++i)
{
std::unique_lock<std::mutex> lock(mtx);
while (buffer.is_empty())
{
full.wait(lock); // Wait if buffer is empty
}
int tmp;
buffer.pop(tmp);
empty.notify_one(); // Signal that buffer is not full
std::cout << "Consumed: " << tmp << std::endl;
}
}
int main()
{
int loops = 10;
std::thread prodThread(producer, loops);
std::thread consThread(consumer, loops);
prodThread.join();
consThread.join();
return 0;
} -
Archttila
veterán
válasz
Archttila #4452 üzenetére
Na, csak megoldottam
most viszont a decodernel problemazik (de legalabb mar kozelebb vagyok a vegehez)
Found ninja-1.11.1 at /usr/bin/ninja
[456/733] Compiling C++ object src/decoder/plugins/libdecoder_plugins.a.p/FfmpegIo.cxx.o
FAILED: src/decoder/plugins/libdecoder_plugins.a.p/FfmpegIo.cxx.o
clang++ -Isrc/decoder/plugins/libdecoder_plugins.a.p -Isrc/decoder/plugins -I../src/decoder/plugins -Isrc -I../src -I. -I.. -Isrc/lib/sacdiso -I../src/lib/sacdiso -I../src/lib/sacdiso/libdstdec -I../src/lib/sacdiso/libdstdec/binding -I../src/lib/sacdiso/libdstdec/decoder -Isrc/lib/dvdaiso -I../src/lib/dvdaiso -I../src/lib/dvdaiso/libmlpdec -I../src/lib/dvdaiso/libmlpdec/libavutil -I../src/lib/dvdaiso/libudf -I/usr/include/spa-0.2 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/sysprof-6 -I/usr/include/opus -I/usr/include/pipewire-0.3 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/libinstpatch-2 -I/usr/include/SDL2 -fdiagnostics-color=always -D_GLIBCXX_ASSERTIONS=1 -D_LIBCPP_ENABLE_ASSERTIONS=1 -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -Wextra -Wpedantic -std=c++2a -ffast-math -ftree-vectorize -Wcast-qual -Wdouble-promotion -Wmissing-declarations -Wshadow -Wunused -Wvla -Wwrite-strings -Wunreachable-code-aggressive -Wused-but-marked-unused -fno-threadsafe-statics -fmerge-all-constants -Wextra-semi -Wmismatched-tags -Woverloaded-virtual -Wsign-promo -Wno-non-virtual-dtor -Wcomma -Wheader-hygiene -Winconsistent-missing-destructor-override -Wsuggest-override -fvisibility=hidden -ffunction-sections -fdata-sections -D_GNU_SOURCE -march=native -O2 -pipe -fno-plt -fexceptions -Wp,-D_FORTIFY_SOURCE=3 -Wformat -Werror=format-security -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -Wp,-D_GLIBCXX_ASSERTIONS -g -ffile-prefix-map=/tmp/makepkg/mpd-sacd/src=/usr/src/debug/mpd-sacd -flto=auto -fPIC -pthread -D_REENTRANT -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -MD -MQ src/decoder/plugins/libdecoder_plugins.a.p/FfmpegIo.cxx.o -MF src/decoder/plugins/libdecoder_plugins.a.p/FfmpegIo.cxx.o.d -o src/decoder/plugins/libdecoder_plugins.a.p/FfmpegIo.cxx.o -c ../src/decoder/plugins/FfmpegIo.cxx
../src/decoder/plugins/FfmpegIo.cxx:28:10: error: use of undeclared identifier 'AVERROR_EOF'
28 | return AVERROR_EOF;
| ^
1 error generated. -
Archttila
veterán
Sziasztok!
Nem vagyok programozo, ezert szuksegem lenne egy kis segitsegre az alabbi program forditasahoz [link] ( PKGBUILD [link] )
Szoval a lenyeg, hogy miutan helyrepofoztam a fuggosegeket, ninja az alabbi hibaval eldobja az egeszet [link]
Abban bizom, hogy csak az env reszt kell kiegesziteni valamivel a PKGBUILD-be.)
env CC=clang CXX=clang++ arch-meson .. ${_opts[@]}
ninja
}
Az SACD tamogatas miatt lenne fontos hogy mukodjon.. -
cog777
őstag
válasz
Tomi_78 #4449 üzenetére
Koszi, az elsot nem tolti be. Igen, bar nekem evekkel korabban a Google sokszor nagyon alap kvizeket adott ki, ezt pl 25-bol 24-et sikerult eltalalnom, tul alap.
Most rakeresve "c++ quiz" kifejezesre, tobb tesztet talaltam, pl c++20 teszt. Bocs a zajt.
[link] , [link] , [link] -
cog777
őstag
Tud valaki c++ teszteket? Lehetoleg advanced level-t vagy magasabbat, akarok allas interjuzni a kozeljovoben es bizonyos dolgokban berozsdasodtam. Linkedin-en van par kurzus c++20-al kapcsolatban, de ugy erzem jo lenne teszteket csinalgatnom.
-
Tomi_78
aktív tag
válasz
dabadab #4446 üzenetére
Igen, 3.0.x.-essel már hiba nélkül működik; köszi a segítséget!
Azt hittem, a verzió kiválasztása a varázslóban csak amolyan tájékoztató jellegű, és ami fontos az az a mappa, amit én megadok, amiben a wxWidgets van. De úgy látszik, nem így van. Meg az is bekavart, hogy a legújabb CodeBlocks a legújabb wxWidgetst még nem ismeri. -
Tomi_78
aktív tag
válasz
dabadab #4444 üzenetére
Az a baj, hogy indításkor csak a wx3.1.x-ig kínálja fel a változatot. Ennek ellenére megkérdezi mindig az elérési mappáját, annak pedig jól megadom a 3.2.4-est, és erre már a képen látható hibát dobja fel, mikor beállítom neki a Configuration options-ban a dolgokat indításkor:
-
dabadab
titán
válasz
Tomi_78 #4443 üzenetére
Disclaimer: se CodeBlocksot, se wxWidgetset nem használtam soha.
Ez azt jelenti, hogy nem találja a wxmsw31ud.lib könyvtárat (gondolom ez lehet a wxWidgets). Ennek oka lehet pl. az, hogy a 3.2.4-es verzióban ez wxmsw32ud.lib néven fut (vagyis szólni kellene a Code Blocksnak, hogy ne 3.1-et akarjon használni) ésvagy nincs jól beállítva a CodeBlocksban a wxWidgets elérési útja.
-
Tomi_78
aktív tag
Sziasztok!
Van itt valaki, aki Code Blocks-t használ wxWidgets-szel C++ programozáshoz?
Azért kérdezem, mert én megpróbáltam volna ezt, és ehhez fel is telepítettem mindkettőt a számítógépemre (CB 20.03 és wxWidgets 3.2.4-et), megcsináltam a beállításokat, indítás után be is jön a GUI, de amikor futtatnám a programomat, mindig az
ld.exe cannot find -lwxmsw31ud
hibaüzenetet mutatja.
Mit jelent ez és hogyan javítható ki? -
pocokxx
Közösségépítő
válasz
dabadab #4441 üzenetére
Csak egy kódrészletet adtam; a deklarásokat most lespóroltam az elejéről... Azért adtam most ilyen nevet, hogy jobban átlátható legyen, hogy mit szeretnék kapni eredményképpen.
A linkelt feladatban mondjuk kérdés, hogy van-e negatív szám az adott halmazban, és ha van, akkor hányadik a sorban?
A "királyfi" 38, de most jutott el oda, hogy talán érdemes lenne foglalkozni kicsit mélyebben ezekkel a felszínkapargatás helyett... -
dabadab
titán
válasz
pocokxx #4440 üzenetére
gondolom ezért foglalkozunk csak így vele.
Hát... hány éves vagy, királyfi?...
A kiválasztás (eldöntés + keresés) típusalgoritmusnál használhatok for ciklust simán bool nélkül?
Szerintem nem értem a kérdést.
A mellékelt kódban nem látszik, hogy az elsonegativindexe* hogyan és hol lett inicializáva (már ha egyáltalán), márpedig az az értéke nem fog változni, mert ha a bevittadatok[i]* negatív, akkor a for a ciklusfeltétel miatt pont azelőtt megszakítja a ciklust, hogy értéket adnál neki.*: kódban ne használj magyar változóneveket és kommenteket. soha. tényleg soha.
-
pocokxx
Közösségépítő
válasz
dabadab #4439 üzenetére
Igen, valóban egyetemi jegyzet alapján dolgozom, és próbálom ezt megérteni. Igazából csak ebben a félévben kerül(t) elő, gondolom ezért foglalkozunk csak így vele.
De akkor jöjjön még egy ilyen fapados kérdés:A kiválasztás (eldöntés + keresés) típusalgoritmusnál használhatok for ciklust simán bool nélkül?
Mondjuk, ha el kell döntenem, hogy van-e a bevitt adatok között negatív szám, akkor ez az eljárás miért hoz fals eredményt?for (i=1; i <=n && bevittadatok[i]>=0; i++);
{ if (bevittadatok[i] < 0)
{ elsonegativindexe = i; }
}
cout << elsonegativindexe; -
dabadab
titán
válasz
pocokxx #4437 üzenetére
Azért javasoltam, hogy olvass el valamit, ami megadja az alapokat.
Ez, amit írtál, tulajdonképpen szintaktiailag helyes (a struct }-ja után mondjuk hiányzik egy pontosvessző meg a két utolsó cin után hiányzik a >>), meg lefordul, meg azt is csinálja, amit szeretnél (kivéve, ha pl. a user százegynél több nevet akar megadni (mert valamiért nem a MAX_NEVEK számára foglalsz tömböt, hanem annál eggyel többre)) - csak hát így nem írunk C++-t.
A "const" az inkább "constexpr" kellene, hogy legyen, mert az jól láthatóan fordítási idejű konstans, de nincs is rá szükség, mert a C stílusú tömbök azok pont ugyanannyira nem valók C++ kódba, mint a goto, tessék az STL-t használni, a vector<string> tökéletes ide.
Na, és ezek miatt kellene valami rendes anyag, amit használsz és kifejezetten friss, up-to-date kell (amit csinálsz az ránézésre valami magyar egyetemi jegyzetből lehet, mert a negyedévszázados C++ fejlesztői karrierem során csak ott találkoztam azzal, hogy stdin-ről olvasnak be dolgokat), mert a C++ dinamikusan fejlődő nyelv.
-
pocokxx
Közösségépítő
válasz
dabadab #4436 üzenetére
Igen, tényleg nagyon hiányoznak az alapok, de tényleg szeretném megérteni...
Ilyesmi sorokról beszélek:struct NEV {
string keresztnev;
string csaladnév;
}
...
const int MAXN=100
string NEV NEVEK [MAXN+1]Beolvasásnál meg
cout << "Mennyi nev lesz?" ;
cin >> n;
for (i=1; i<=n; i++) {
cout << i << ". keresztnev: ";
cin Nevek[i].keresztnev;
cout << i << ". csaladnev:";
cin Nevek[i].csaladnev";}Ez így jó, vagy nagyon zagyva?
-
dabadab
titán
válasz
pocokxx #4435 üzenetére
Hajjaj
A struct változót
A struct az nem változó, hanem egy típus leírása, pont úgy, ahogy a class is. Az ott csak a típusleírás, abból önmagában még nem keletkezik semmiféle változó.
Nálad valószínűleg azért kell odaraknod, mert a C++ fordító a fordítási egységben fentről lefele halad és ha azelőtt használsz egy típust, mielőtt megmondtad volna, hogy mi az, akkor az fordítási hibát okoz.
A struct mellé tömböt is deklarálni kell const paranccsal, aminek kötelező másik nevet adni?
A const nem parancs, hanem kulcsszó és a const tulajdonságot adja hozzá az adott deklarációhoz/definícióhoz (hogy az konkrétan mit jelent, az attól függ, hogy konkrétan mihez adod hozzá, változóknál pl. azt, hogy a kezdeti értékadáson túl nem lehet megváltoztatni az értéküket).
Egyébként amit ott csinálsz, az az, hogy létrehozod ténylegesen egy változót (amit a struct ugye nem csinál meg). Ennek nem kell feltétlenül tömbnek lennie (sőt, C++-ben a C stílusú tömbök leginkább kerülendők, mert csak a baj van velük), lehet egy sima változó is vagy valamilyen STL-es container, akármi.
Nem kötelező másik nevet adni, mert a C++ fordító van annyira okos, hogy tudja, hogy hol számíthat változó- és hol típusnévre, de nagyon érdemes, hogy ne legyen belőle keveredés (az elég bevett konvenció, hogy a típusnevek nagybetűvel kezdődnek, a változók meg kisbetűvel).
De a kérdéseid alapján az látszik, hogy az alapok nagyon hiányoznak nálad, érdemes lenne legalább az elején elolvasni valami bevezető anyagot, pl. akár ezt (ez már csak azért is jó, mert ott a weboldalon a c++ fordító is, azzal nem kell külön vacakolni az elején, amikor még amúgy is minden nagyon zavaros).
-
pocokxx
Közösségépítő
Sziasztok!
Egy-két amatőr kérdéssel fárasztanám a társaságot. Codeblocks-sal proóbálkozom.
A struct változót miért kell az int main() elé írni?
A struct mellé tömböt is deklarálni kell const paranccsal, aminek kötelező másik nevet adni? -
cog777
őstag
cmake kerdesem van. Egy eleg nagy projektben (600 cmakefiles) kell egy uj ficsort keszitenem. A problema a korkoros dependency.
Szoval protokol modul hasznalta a driver-t. Driver object-kent volt, protocol static-kent forditva.
Most az uj ficsor a driver-bol hasznal protokolt. Igy cmake kiirta hogy ez biza cyclic dependency es legalabb 1 target nem static.Valoban, driver nem az.
Nosza allittsuk at object-rol static-ra.
Lefordul, orom bodotta.
Vazz, a ficsor kodja lefordul, latom a logban de nem linkelodik ossze es nem is tudok breakpoint-ot tenni ra. Mikor objectkent volt linkelve akkor breakpoint mukodott.
Persze, megallapitottuk hogy ezt a reszt ujra kellene strukturalni, de most 1 ideiglenes megoldast kell csinalnom.
Megkoszonom ha valaki hozza tudna szolni a szituaciohoz es adni tanacsot -
kispx
addikt
válasz
MiniXD55 #4431 üzenetére
vector<string> virag_szine(agyasokszama, "");
vector<int> virag_sorszam(agyasokszama, 0);
De linkelek egy tutorialt hozzá: https://www.codeguru.com/cplusplus/c-tutorial-a-beginners-guide-to-stdvector-part-1/ [link] , mert az eszközöket ismerete nélkül nem lehet programot írni.
-
MiniXD55
tag
válasz
MiniXD55 #4426 üzenetére
bool ultetve[darab];
for (int i = 0; i < darab; i++) ultetve[i] = false; // kezdetben nincs egyikse ültetve
int beultetes = 0;
int felajanlasok = 0;
int seged5;
int i = 0;
for (i = 0; i < darab; i++)
{
//cout << kezdet[i] << " " << veg[i] << endl;
if (kezdet[i] < veg[i]) seged5 = 0;
else seged5 = kezdet[i];
//cout << seged5 << endl;
if (veg[i] >= kezdet[i])
for (int l = kezdet[i]; l < veg[i] + 1; l++)
{
felajanlasok++;
//cout << kezdet[i];// pl 1-3 esetén csak kkettőig futna le, mivel 3 nem kisebb mint 3
ultetve[i - 1] = true;
}
}
for (int i = 0; i < darab; i++) cout << ultetve[i] << " " ;
for (int i = 0; i < darab; i++) if (ultetve[i]) beultetes++;
{
//cout << beultetes;
if (darab == beultetes) cout << "Minden agyas beültetésére van jelentkezo.";
else if (felajanlasok >= darab) cout << "Atszervezessel megoldhato a beultetes.";
else cout << "A beultetes nem oldhato meg.";
}
string virag_szine[agyasokszama] = {""};
int virag_sorszam[agyasokszama] = { 0 };
for (int i = 0; i < agyasokszama; i++)
{
virag_szine[i] = "#";
virag_sorszam[i] = 0;
}
for (int m = 0; m < darab; i++)
{
for (int n = 0; n < agyasokszama; i++)
{
if (virag_szine[n] == "#")
{
if (n >= kezdet[m])
{
virag_szine[n] = szin[m];
virag_sorszam[n] = m + 1;
}
}
}
}
for (int i = 0; i < darab; i++)
{
cout << virag_szine[i] << " " << virag_sorszam << endl;
}
return 0;
} -
CPT.Pirk
Jómunkásember
válasz
dabadab #4423 üzenetére
Hű, szerintem .-al írtam, de ez most jó kérdés.
Egyébként a google-ös találatok miszerint static_cast<int16_t> -al kellene castolni float-ból int-be, az stimmel? Ezt a floor() dolgot megpróbálom holnap, csak közben lebetegedtem kicsit, a cucc meg bent van így távgyógyítás lesz...
-
CPT.Pirk
Jómunkásember
Sziasztok,
Arduino alatt működő, stewart platform koordináta transzformáló kód részletet szeretnék átvinni az őt irányító Raspberry-re, mert egyszerűen nem végez időben a gyenge kis Arduino a számításokkal.
Az Rpi-n fut a szerkezet vezérlő programja, ahová ebben a formában beépítettem: https://pastebin.com/PHkg33Xh
Nincs fordítási hibám, de mikor ehhez a sorhoz ér a kód futása, akkor elszáll a program hibaüzi nélkül:platEnd[motor].x = rotationMatrix[0] * (platStart[motor].x - poi.x) + rotationMatrix[1] * (platStart[motor].y - poi.y) + rotationMatrix[2] * (platStart[motor].z - poi.z) + x + (platStart[motor].x - poi.x);
Akkor is, ha csak ennyi van ott:platEnd[motor].x = rotationMatrix[0];
A baloldali rész az int16, az egyenlőség jobb oldalán float van.Próbáltam castolni igy, de elhal így is:
platEnd[motor].x = static_cast<int16_t>rotationMatrix[0];
Viszont ha kézzel odaírok egyplatEnd[motor].x = 12,3;
-at, akkor azzal semmi baja.
-
MiniXD55
tag
válasz
dabadab #4414 üzenetére
Beszéltem a tanárommal, aki tanítja nekem ezt az egészet, jelenleg úgy fogalmazott hogy ilyen rövid időn belül, amely rendelkezésünkre áll, a vizsgáig nem gondolja, hogy szükséges.
Ez a kód amit beküldtem, codeblocks-ban teljesen szuperül lefut, a vs amin futtatnám egy teljesen szűz vs. -
-
daninet
veterán
válasz
DrojDtroll #4417 üzenetére
Igen, meg az első homingnál lehetne az időt mérni, mert ugye mindig máskor kapcsolom ki. Vannak elméleti ötleteim. Ezt egy arduinonál még lehet megoldanám, csak itt bőven meghaladja a képességeimet.
Azt is elfogadom válasznak, ha nem lehet ennyivel megoldani, valamiért azt várom picit lesz valaminegysoros akármi amit oda berakhatok és menni fog. De azt is elfogadom válasznak ha nincs ilyen. -
daninet
veterán
válasz
dabadab #4415 üzenetére
Elvileg C++, igen (70%-ban, 30-ban C). De javíts ki ha nem, átrakom másik topikba. Marlin firmware-t akarom módosítani. Volt már itt téma, akkor te segítettél, de az igényeim alacsonyabbak voltak
, csak újra akartam indítani a sorozatot, működött is.
Szóval alant a kódban a random(2,10); függvényt használtam, de mint írtátok, ez ugyanazt a sorozatot generálja mindig, nekem ez nem jó.
Hogy értsétek, erről a homokba rajzolós asztalról van szó. SD kártyán vannak a minták, indításnál az auto0.g fájl tartalmazza a homing sequence-t, a többi auto1.g - auto9.g a mintákat amiket rajzol. Mivel ezek órákig mennek nem poén, ha mindig bekapcsolom és ugyanazzal indul. Jó lenne, ha random választana egy számot 2-10ig (függvényben alul van egy x-1) és akkor valamelyik mintát elkezdené rajzolni.
Kontextusnak annyi, hogy elkezdi beolvasni az SD kártya tartalmát a program, és ha nincs ott egy fájl amit áramkimaradás esetén akkor kezdi a kód szerint az auto0.g-tmod: elég rossz itt a kódformázás, itt egy pastebin link: https://pastebin.com/zFwjc0y9
#if DISABLED(NO_SD_AUTOSTART)
/**
* Run all the auto#.g files. Called:
* - On boot after successful card init.
* - From the LCD command to Run Auto Files
*/
void CardReader::autofile_begin() {
autofile_index = 1;
(void)autofile_check();
}
/**
* Run the next auto#.g file. Called:
* - On boot after successful card init
* - After finishing the previous auto#.g file
* - From the LCD command to begin the auto#.g files
*
* Return 'true' if an auto file was started
*/
bool CardReader::autofile_check() {
if (!autofile_index) return false;
if (!isMounted())
mount();
else if (ENABLED(SDCARD_EEPROM_EMULATION))
settings.first_load();
// Don't run auto#.g when a PLR file exists
if (isMounted() && TERN1(POWER_LOSS_RECOVERY, !recovery.valid())) {
char autoname[10];
sprintf_P(autoname, PSTR("/auto%c.g"), '0' + autofile_index - 1);
if (fileExists(autoname)) {
cdroot();
openAndPrintFile(autoname);
// Generate a random number between 2 and 10
int randomNumber = random(2,10);
autofile_index = randomNumber;
//
return true;
}
}
autofile_cancel();
return false;
}
#endif
-
dabadab
titán
válasz
MiniXD55 #4411 üzenetére
Hát, akkor ideje lenne megismerkedni a C++-os konténerekkel
Mondjuk az std::vector használatához alig valami kell változtatni.
-
sztanozs
veterán
válasz
daninet #4412 üzenetére
Amit tudsz csinalni az az, hogy eltarolod az utolso erteket az epromban es a kovetkezo inditaskor azt hasznalod seednek... mondjuk ez eleg gyorsan le tudja gyilkolni az epromot, de ha van egy barmi mas (irast jobban turo) perzisztens memoriad, akkor az mar jobb lehet...
-
daninet
veterán
Sziasztok!
Teljesen noob kérdés:
Random int számot kellene generálnom egy mikrokontrolleren, de nincs órája és limitált a memória. Szóval kóddal kellene megoldalni anélkül, hogy behívok bármilyen library-t.
Végignéztem a keresőben egy csomó találatot de mindenhol az órával variálnak. Nekem ugyanez kóddal kell, valami memória hash-elős akármilyen trükkel.
Hogyan oldható ez meg? -
MiniXD55
tag
Sziasztok!
Újra én lennék az akinek segíteni kellene, mellékelek egy képet illetve a kódot is amit írtam:#include <iostream>
#include <fstream>
#include <math.h>
#include <iomanip>using namespace std;
int eltelt(int ido1, int ido2);
int main()
{
int ora[1000];
int perc[1000];
int mperc[1000];
int xkor[1000];
int ykor[1000];
int ido[1000];
int darab=0;
cout << "1. feladat" << endl;ifstream befajl;
befajl.open("jel.txt");
while(!befajl.eof())
{
befajl >> ora[darab] >> perc[darab] >> mperc[darab] >> xkor[darab] >> ykor[darab];
darab++;
}
for(int i=0; i<darab-1;i++)
{
ido[i]=ora[i]*3600 + perc[i]*60 + mperc[i];
//cout << ora[i] << perc[i] << mperc[i] << xkor[i] << ykor[i] << endl;
//cout << ido[i] << endl;
}
befajl.close();cout << "2. feladat" << endl;
int sorszam;
cout << "Adja meg a jel sorszámát! ";
//cin >> sorszam;
sorszam = 3;
cout << "x=" << xkor[sorszam-1] << " y=" << ykor[sorszam-1];
int eltelt_ido=eltelt(ido[0],ido[darab-2]);
cout << "4. feladat\nIdotartam: " << eltelt_ido/3600 << ":" << eltelt(ido[0],ido[darab-2])/60%60 <<":" << eltelt(ido[0],ido[darab-2])%60;cout << "5. feladat" << endl;
int min_x=xkor[0];
int min_y=ykor[0];
int max_x=xkor[0];
int max_y=ykor[0];
for(int i=0; i<darab-1;i++)
{
if (min_x>xkor[i]) min_x=xkor[i];
if (min_y>ykor[i]) min_y=ykor[i];
if (max_x<xkor[i]) max_x=xkor[i];
if (max_y<ykor[i]) max_y=ykor[i];
}
cout << "Bal alsó: " << min_x << " " << min_y << ", jobb felsõ: " << max_x << " " << max_y;cout << "6. feladat" << endl;
float elmozdulas=0.000;
for(int i=0; i<darab-2;i++)
{
elmozdulas+=sqrt(pow(xkor[i]-xkor[i+1],2)+pow(ykor[i]-ykor[i+1],2));
//cout << elmozdulas << endl;
}cout << round(elmozdulas);
return 0;
} -
MiniXD55
tag
Sziasztok!
Szeretnék segítséget kérni, visual studio 2019-el kezdek programozni, és jelenleg egy olyan problémába futok bele minden egyes feladatnál, hogy a visual studio nem akarja megnyitni az adott txt file-t. A következő error kódot kapom: MSB8020 BUILD TOOLS V143.
Tudnátok ebben segíteni, hogy mi lehet a probléma?
Próbáltam a debug mappába berakni a fájlt, de ott se találja illetve próbáltam manuálisan tallózni, de akkor se akarta.
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main()
{
string datum[400];
string nev[400];
string resz[400];
int hossz[400];
int latta[400];
int n = 0;
ifstream be;
be.open("lista-1.txt",);
while(!be.eof())
{
be >> datum[n] >> nev[n] >> resz[n] >> hossz[n] >> latta[n];
n++;
} -
Tomi_78
aktív tag
Sziasztok ismét, szakértők!
Felmerült még pár hiba kicsiny programom fejlesztése közben, amit segítség nélkül nem tudok megoldani.
Az első, hogy így íratok ki szöveget:static const WCHAR pontszoveg[]= L"PONTJAID:";
TextOut(Memhdc,80,4,pontszoveg,wcslen(pontszoveg));
ami így jó is, viszont számokat már nem tudok kiíratni, mert pl. erre:char jatpontjai[3];
itoa(jatekospontjai,jatpontjai,10);
TextOut(Memhdc,80,4+28,jatpontjai,wcslen(jatpontjai));
már ezt a hibaüzenetet kapom:
|911|error: cannot convert 'char*' to 'const wchar_t*' for argument '1' to 'size_t wcslen(const wchar_t*)'|
A második kérdésem, hogy meg lehet-e határozni és ha igen, akkor hogyan egy ilyen szöveg képpontokban mért szélességét, hogy a képernyő közepére lehessen kiírni:static const WCHAR cimszoveg[]= L"Játék címe";
TextOut(Memhdc, ablakszel/2,4,cimszoveg,wcslen(cimszoveg));
és végül, le lehet-e valahogy tiltani a játékablak átméretezhetőségének lehetőségét, hogy a felhasználó csak egy fix, teljesképernyős módban használhassa a programot?
Új hozzászólás Aktív témák
Hirdetés
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Asus Zenbook flip13 2in1 touch screen
- Dell Latitude 5450 Intel Core Ultra 5 135U 4nm 32GB DDR5 érintőképernyős laptop Dell gari 2027.09.hó
- PlayStation 4/5 kontroller analóg cseréje HALL TMR érzékelősre, 1 év garancia!!! Nincs többé drift!!
- PlayStation 5/4 kontroller analóg cseréje HALL TMR érzékelősre, 1 év garancia!!! Nincs többé drift!!
- XBOX ONE/Series kontroller analóg cseréje HALL TMR érzékelősre, 1 év garancia!!! Nincs többé drift!!
- BESZÁMÍTÁS! Gigabyte B650M R7 7700 32GB DDR5 1TB SSD RTX 5070 12GB BE QUIET! Pure Base 500DX 650W
- Ikea Eilif Paraván - Asztali elválasztó
- Lenovo V130-15IGM laptop (Pentium Silver N5000/8GB/256GB SSD
- Dell E5450 nagyon szép állapot i5, FHD IPS, 8GB, 256GB SSD, NVIDIA,Világítós HU billentyűzet
- Menő retró konfig: Q9550, Gigabyte P43, 4GB RAM, ASUS GT730,
Állásajánlatok
Cég: Promenade Publishing House Kft.
Város: Budapest
Cég: CAMERA-PRO Hungary Kft
Város: Budapest