Új hozzászólás Aktív témák

  • FuRiONight
    addikt

    Sziasztok!

    Új ambiciózus projekthez keresek fejleszőket/grafikusokat!

    Kérlek minnél többen töltsétek ki!

    Ha érkelne a projekt privát üzenetben több infó! :R

    A digitális evolúció veled kezdődik

  • spagetti_8
    csendes tag

    Elég kihalt ez a topik. Pedig a menők C++-ban programoznak.

    Az álláshirdetések is egyre fogynak a C++-területen (legalábbis itt Hungary-ben) :(

  • jattila48
    aktív tag

    Ennek az idézett mondatnak nem sok értelme van, de különben is function prototype-ról ír. A kérdés továbbra is az, hogy van-e értelme az extern"C" deklarációnak nem fv. név esetén. Én fv. pointernél láttam, de szerintem ott se kell. Persze az extern igen, de a "C" nem.

    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

    Ennek az idézett mondatnak nem sok értelme van, de különben is function prototype-ról ír. A kérdés továbbra is az, hogy van-e értelme az extern"C" deklarációnak nem fv. név esetén. Én fv. pointernél láttam, de szerintem ott se kell. Persze az extern igen, de a "C" nem.

    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

    Ennek az idézett mondatnak nem sok értelme van, de különben is function prototype-ról ír. A kérdés továbbra is az, hogy van-e értelme az extern"C" deklarációnak nem fv. név esetén. Én fv. pointernél láttam, de szerintem ott se kell. Persze az extern igen, de a "C" nem.

    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

    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."

    Ennek az idézett mondatnak nem sok értelme van, de különben is function prototype-ról ír. A kérdés továbbra is az, hogy van-e értelme az extern"C" deklarációnak nem fv. név esetén. Én fv. pointernél láttam, de szerintem ott se kell. Persze az extern igen, de a "C" nem.

  • cog777
    őstag

    Írtam, hogy function prototype kivételével. Függvény névnél tudom mire való, ahogy te is írtad. A kérdésem az volt, hogy nem fv. név esetén van-e értelme, és mi az, mert láttam már ilyet. Lehet, hogy akkor fölöslegesen írták ki az extern "C"-t? Szerintem igen.

    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

    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.

    Írtam, hogy function prototype kivételével. Függvény névnél tudom mire való, ahogy te is írtad. A kérdésem az volt, hogy nem fv. név esetén van-e értelme, és mi az, mert láttam már ilyet. Lehet, hogy akkor fölöslegesen írták ki az extern "C"-t? Szerintem igen.

  • cog777
    őstag
    A megválaszolt hozzászólás már nem elérhető.

    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.

  • DrojDtroll
    veterán

    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

    Én most akarok belefogni egy hobby c++ projektbe. Akarok egy olyan dashboardot a homelab-hoz ami egy szempillantás alatt betölt.

    Qt-val csinálnád?

  • DrojDtroll
    veterán

    Elég kihalt ez a topik. Pedig a menők C++-ban programoznak.

    Én most akarok belefogni egy hobby c++ projektbe. Akarok egy olyan dashboardot a homelab-hoz ami egy szempillantás alatt betölt.

  • 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. :R

    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

    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.

    Lefordult :))

  • Archttila
    veterán

    Arra tudok meg gondolni, hogy valami regebbi clang verzioval kmpatibilis a kod.

    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..

    Arra tudok meg gondolni, hogy valami regebbi clang verzioval kmpatibilis a kod.

  • 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

    Valami ilyesmikre gondoltál, mint:
    [link]
    vagy:
    [link] ?
    Nem tudom, milyen szintűek, de többek között ezeket adta ki a Google a "c++ programozás teszt" keresőszavakra.

    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]

  • Tomi_78
    aktív tag

    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.

    Valami ilyesmikre gondoltál, mint:
    [link]
    vagy:
    [link] ?
    Nem tudom, milyen szintűek, de többek között ezeket adta ki a Google a "c++ programozás teszt" keresőszavakra.

  • 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

    Hát, akkor a jelek szerint le kell vadásznod valahonnan egy 3.1.x-es wxWidgetset, mint legkézenfekvőbb megoldás.

    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.

  • dabadab
    titán

    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:

    Hát, akkor a jelek szerint le kell vadásznod valahonnan egy 3.1.x-es wxWidgetset, mint legkézenfekvőbb megoldás.

  • Tomi_78
    aktív tag

    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.

    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

    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?

    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ő

    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.

    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

    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;

    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ő

    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 :DDD ), mert a C++ dinamikusan fejlődő nyelv.

    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

    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?

    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 :DDD ), mert a C++ dinamikusan fejlődő nyelv.

  • cog777
    őstag

    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?

    Itt van egy lehetseges megoldas: [link]
    Nagyon ajanlom az online szerkesztoket, meg debuggolni is lehet bennuk. Neha en is itt nezek meg ezt azt, amit regen hasznaltam es elfelejtettem.

  • pocokxx
    Közösségépítő

    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).

    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

    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?

    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 :R

    Szerencsere dobtuk az otletet. :C

  • 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 :R

  • kispx
    addikt

    Teljesen suta vagyok a vektorokkal kapcsolatban, így gondoltad?

    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.

  • string virag_szine[agyasokszama] = {""};
    int virag_sorszam[agyasokszama] = { 0 };

    Ezt a két sor is át kell írni std:vectorra vagy dinamikusan allokált tömbre.
    Ha átvan, akkor milyen hibaüzenetet ír ki a fordító?

    Teljesen suta vagyok a vektorokkal kapcsolatban, így gondoltad?

  • kispx
    addikt

    Értem, de nem csak a bool-al van problémája hanem int-ekkel is

    string virag_szine[agyasokszama] = {""};
    int virag_sorszam[agyasokszama] = { 0 };

    Ezt a két sor is át kell írni std:vectorra vagy dinamikusan allokált tömbre.
    Ha átvan, akkor milyen hibaüzenetet ír ki a fordító?

  • Amit használni szeretnél, azt úgy hívják, hogy Variable Length Array (VLA). Az MSVC++ nem támogatja.
    Használhatsz helyette dinamikusan allokált tömböt: bool* ultetve = new bool[darab];
    Vagy az std::vector osztályt

    Értem, de nem csak a bool-al van problémája hanem int-ekkel is

  • Ha kikommentelem a bool utáni rész a program teljesen szuperül lefut.

    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;
    }

  • kispx
    addikt

    Mint kiedrült, ennek a dll a pótlásával sikerült megbírkoznom, de onnan jött a következő menet, jelenleg ebbe a hibába ütközöm:

    Amit használni szeretnél, azt úgy hívják, hogy Variable Length Array (VLA). Az MSVC++ nem támogatja.
    Használhatsz helyette dinamikusan allokált tömböt: bool* ultetve = new bool[darab];
    Vagy az std::vector osztályt

  • Mint kiedrült, ennek a dll a pótlásával sikerült megbírkoznom, de onnan jött a következő menet, jelenleg ebbe a hibába ütközöm:

    Ha kikommentelem a bool utáni rész a program teljesen szuperül lefut.

  • Hiába írom át, ugyan ezt dobja fel

    Mint kiedrült, ennek a dll a pótlásával sikerült megbírkoznom, de onnan jött a következő menet, jelenleg ebbe a hibába ütközöm:

  • CPT.Pirk
    Jómunkásember

    A 12,3 az sima int, konkrétan 3 :)
    A 12.3 (ponttal) a float.
    Ha floor()-ral gyártasz intet floatból, az jó? a

    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... :)

  • dabadab
    titán

    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 egy platEnd[motor].x = 12,3; -at, akkor azzal semmi baja.

    A 12,3 az sima int, konkrétan 3 :)
    A 12.3 (ponttal) a float.
    Ha floor()-ral gyártasz intet floatból, az jó? a

  • 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 egy platEnd[motor].x = 12,3; -at, akkor azzal semmi baja.

  • Hát, akkor ideje lenne megismerkedni a C++-os konténerekkel :)

    Mondjuk az std::vector használatához alig valami kell változtatni.

    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.

  • Hát, akkor ideje lenne megismerkedni a C++-os konténerekkel :)

    Mondjuk az std::vector használatához alig valami kell változtatni.

    Írtam privátüzenetet, láttad esetleg?

  • kispx
    addikt

    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 :DDD , 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-t

    mod: 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

    A mikrokontroller azt se tudja megmondani, hogy a bekapcsolás után hány milliszekundum telt el? Ha jól gondolom, akkor a homing sequence nem milliszekundum pontosan fog lefutni, és utána ezzel az értékkel lehetne inicializálni egy random szám generátort.

  • Valamelyik ananlog pinre akasztanek egy szenzort, es azt hasznalnam emtropiakent.

    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.

  • DrojDtroll
    veterán

    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 :DDD , 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-t

    mod: 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

    Valamelyik ananlog pinre akasztanek egy szenzort, es azt hasznalnam emtropiakent.

  • A tök sima random seedelés nélkül nem jó? Annyi hátránya van, hogy a program minden újraindítása után ugyanazt a számsorozatot generálja, de nem tudom, hogy ez nálad baj-e.

    És biztos, hogy ezt a C++ topikban akartad kérdezni? :)

    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 :DDD , 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-t

    mod: 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

    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?

    A tök sima random seedelés nélkül nem jó? Annyi hátránya van, hogy a program minden újraindítása után ugyanazt a számsorozatot generálja, de nem tudom, hogy ez nálad baj-e.

    És biztos, hogy ezt a C++ topikban akartad kérdezni? :)

  • dabadab
    titán

    wait, miért nőtt meg a darab is?

    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

    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?

    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...

  • 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?

  • A screenshot szerint 1459 sort olvasol be (darab változó értéke), de csak 100 elemszámú tömböket hozol létre.

    Hiába írom át, ugyan ezt dobja fel

  • cattus
    addikt

    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;
    }

    int eltelt(int ido1, int ido2)
    {
    return abs(ido2-ido1);
    }

    A screenshot szerint 1459 sort olvasol be (darab változó értéke), de csak 100 elemszámú tömböket hozol létre.

  • 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;
    }

    int eltelt(int ido1, int ido2)
    {
    return abs(ido2-ido1);
    }

  • dabadab
    titán


    Én itt nem látom sehol

    Akkor állítsd át a solutiont, hogy v142-vel forduljon (a Solution Explorerben a solution nevén jobb klikk, "Retarget solution").

  • Az MSB8020 hibakód azt jelenti, hogy a v143 build toolst nem találja.

    Indítsd el a Visual Studio Installert és ott ikszeld be, hogy felrakja.


    Én itt nem látom sehol

  • dabadab
    titán

    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++;
    }

    Az MSB8020 hibakód azt jelenti, hogy a v143 build toolst nem találja.

    Indítsd el a Visual Studio Installert és ott ikszeld be, hogy felrakja.

  • 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

    Hű, köszönöm szépen, Kispx!
    Így már működik a számváltozók kiíratása:
    WCHAR jateleteidb[3];
    _itow(jatekoseletei,jateleteidb,10);
    TextOut(Memhdc,4,4+28,jateleteidb,wcslen(jateleteidb));

    A másik kettőt még próbálom kibogozni... :K

  • kispx
    addikt

    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?

  • 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