Keresés

Aktív témák

  • czappa

    aktív tag

    válasz czappa #243 üzenetére

    Az előző postot tekintsétek semmisnek.
    Picit másként kezdtem el, most azt hiszem működik.

    (Olvassa még rajtam kívül valaki ezt a topicot?)

  • czappa

    aktív tag

    Most van időm c, c++t tanulni. El is kezdtem, az első lépés egy egyszerű kliens-server alkalmazás lenne.
    Miután megvan a socket foglalás és a bind a szerver oldalon, akkor egy végtelen ciklussal az accept-el várnám a klienseket.
    A lényeg, hogy az accept-től visszakapott azonosító egy ún. ClientHandler osztály konstruktorának egyik paramétere. Egy kliensre működik, de nekem majd több klienst kell kezelnem, ezért első lépésben a egy-egy ClientHandler példányt egy set-ben akarok eltárolni.
    Az eltárolás még megy, de...
    Előbb a kód:

    server.cpp:
    //az összehasonlitas a SET miatt kell, de nekem valójában nem kell a sorrend meghatározása ezért ilyen furcsa a Cmp
    class Cmp{
    public:
    bool operator()(const ClientHandler a, const ClientHandler b)
    {
    if (&a == &b) return false;
    else return true;
    }
    };

    ...

    cout << "Bind sikeres" << endl;
    cout << "Foprogram elott" << endl;
    set<ClientHandler, Cmp> clients; //a set


    while(1){
    listen(foglalat, 1);
    meret = sizeof(ugyfel);
    //új kliens
    uj=accept(foglalat, (struct sockaddr *)&ugyfel, (socklen_t*)&meret);
    if (uj<0){
    cout << "Accept sikertelen." << endl;
    }else{
    //az új kliensnek példányosítunk a ClientHandlerből
    ch = new ClientHandler(uj, ugyfel);
    cout << "Uj kapcsolat... " << endl;
    //ezt eltárolom a SET-be
    clients.insert(clients.begin(), *ch);
    //clients.empty() == true ? cout << "true" : cout<< "false"<<endl;
    //ez csak egy példa: törölném a set összes elemét egyesével, de elotte a ClientHandler kiirValamit fv.-ét meghívom
    while( !clients.empty() ) {
    //ez a hibás sor!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    cout << "Torol: " << (*clients.begin()).kiirValamit() << endl;
    clients.erase( clients.begin() );
    }
    //kilepeunk a vegtelen ciklusbol 1 kliens csatlakozasa utan
    break;
    }
    }

    if (close(foglalat) != 0)
    cout << "Close sikertelen." << endl;
    //delete ch;
    return 0;

    ...
    ClientHandler.cpp:

    char* ClientHandler::kiirValamit(){
    //cout << "kiir baromsagot" << endl;
    return "valami";
    }

    A hiba a "cout << "Torol: " << (*clients.begin()).kiirValamit() << endl;" sorral van:
    passing ‘const ClientHandler’ as ‘this’ argument of ‘char* ClientHandler::kiirValamit()’ discards qualifiers

    A hiba üzenet alapján keresgéltem google-n, elvileg az a gond - ha jól értem -, hogy egy const függvényből egy nem const-ot hívok.
    Az igaz, hogy ha "char* ClientHandler::kiirValamit() const{" -ot írok, akkor lefordul, de
    1) Nem látom, hogy én ezt milyen const függvényből hívom
    2) a kiirValamit még lehetne const, de a valódi alkalmazásban nem ezt a próba fv.-t hívnám meg, és a valódi fv.-nek hozzá kell férjen az osztály adattagjaihoz, hogy módosítsa azokat. (erre a "konstans fv." nem képes)

    A válaszokat előre is köszönöm!

  • czappa

    aktív tag

    válasz czappa #241 üzenetére

    No megoldódott:
    A hivatalos Qt tutorialt csinálom és abban az 5. lecke végének hatására egy saját esemény kezelést írtam (signal-slot modell-ben egy gomblenyomás).
    Csak annyi volt a gáz, hogy ehhez már kell a Q_OBJECT makró, míg a beépítettekhez nem, így a példában sem szerepelt.
    Utána már csak azzal szívtam egy keveset, hogy a KDevelop dist-clean-je mintha nem szedett volna le minden file-t és így újrafordításnál gondok adódtak.

  • czappa

    aktív tag

    Qt-ban akadtam el.
    Előbb a kód:

    #include <QApplication>
    #include <QFont>
    #include <QLCDNumber>
    #include <QPushButton>
    #include <QSlider>
    #include <QVBoxLayout>
    #include <QWidget>

    class MyWidget : public QWidget
    {
    public slots:
    void button1Clicked();

    public:
    QSlider *slider;
    QPushButton *button1;
    QPushButton *quit;
    QLCDNumber *lcd;
    MyWidget(QWidget *parent = 0);
    void init();
    };

    void MyWidget::button1Clicked(){
    slider->setValue(50);
    }

    void MyWidget::init(){
    quit = new QPushButton(tr("Quit"));
    button1 = new QPushButton(tr("Change"));
    quit->setFont(QFont("Times", 18, QFont:: Bold));

    lcd = new QLCDNumber(2);
    lcd->setSegmentStyle(QLCDNumber:: Filled);

    slider = new QSlider(Qt::Horizontal);
    slider->setRange(0, 99);
    slider->setValue(0);

    connect(quit, SIGNAL(clicked()), qApp, SLOT(quit()));
    connect(button1, SIGNAL(clicked()), this, SLOT(button1Clicked()));
    connect(slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)));

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(quit);
    layout->addWidget(lcd);
    layout->addWidget(slider);
    layout->addWidget(button1);
    setLayout(layout);
    }

    MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
    {
    init();
    }

    int main(int argc, char *argv[])
    {
    QApplication app(argc, argv);
    MyWidget *widget = new MyWidget();
    widget->show();
    return app.exec();
    }

    A probléma, hogy mikor lefordítom - akár manuálisan, akár Kdevelop-ból - ezt írja:
    Object::connect: No such slot QWidget::button1Clicked()

    Így persze hiába nyomogatom azt a gombot, nem csinál semmit. Próbáltam kiokoskodni a Kdevelop-os példából, de elvileg ugyan úgy csinálom és nem jó. (Gyakorlatilag nyilván elnézek valamit...)

    Már azt sem értem, hogy miért a QWidget::button1Clicked() keresi, holott ennek a MyWidget-ben kéne lennie.
    Előre is köszi.

  • czappa

    aktív tag

    válasz Metalwarrior #238 üzenetére

    A fork()-kal másolja le magát.
    Visszatérési érték:
    -ha kisebb mint 0, akkor gebasz történt;
    -0: a gyermek process
    -nagyobb mint 0: szülő.

    Alapesetben tehát egy if-fel vizsgálod, h 0, vagy több (vagy kevesebb).

    Saját processz azonossítója: getpid(),
    Szülőé getppid().
    Mindkettőhöz az unistd.h kell.

    Megj: A fork() a gyermek processz id-vel (pid) vissza, Tehát ha az nagyobb nullánál, akkor vagy a szülő folyamatban és ekkor a visszatérési érték a gyermek pid-je.

    mod.:
    "Ha lehet kis kommentet is hogy mi mit csinál mert ebből zokni vagyok."

    A zh-t ne írjuk meg helyetted? Nem nagyon akarlak piszkálni, de neked kell döntened, hogy megakarod-e tanulni, vagy sem. Viszont ha a válasz "sem" nem várd el, hogy más csinálja meg helyetted.

  • czappa

    aktív tag

    válasz doc #189 üzenetére

    Köszi a válasz!
    Azt hiszem értem, de hogy biztos legyek benne összefoglalom:
    Az stdlib és a többi a C része (std asszem a standard rövidítése), ha van fönn C fordítom akkor ezek is, ellenben pl. a math függvény gyűjteménynek nem is kell fenn lennie, ezért kell külön jelezzem a fordítónak, hogy keresse meg és linkelje. Mivel ez nem része a C-nek, külön kell linkelni.
    Valami ilyesmi ugye?

  • czappa

    aktív tag

    Van egy kérdés, ami régóta foglalkoztat, de nem találtam meg a választ,
    pl. ezeket include-oljuk:
    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>

    Az első kettővel nincs semmi "gond", viszont at utolsó header file-hoz, hogy használhassam, a linkernek meg kell mondjam, hogy linkelje a math.h-t (már ha jól értem...), így: gcc -lm progi.c

    Megtudná nekem valaki mondani, hogy miért van erre szükség? Illetve, hogy az első kettőnél miért nincs?
    Előre is köszi.

  • czappa

    aktív tag

    válasz doc #176 üzenetére

    Eszembe nem jutott volna, hogy dos-os sorvége jelek vannak benne. Köszi!

  • czappa

    aktív tag

    válasz doc #173 üzenetére

    Elkezdtem (volna) telepíteni:
    futtatási jog megadása, majd ./bootstrap
    Erre ezt írja:
    bash: ./bootstrap: /bin/sh^M: bad interpreter: Nincs ilyen fájl vagy könyvtár
    Debianos binary meg - már - nincs fenn ezen az oldalon:
    [link]
    Van ötleted, hogyan telepítsem?

    ui.: nem tudom miért rossz a link, idemásolom:
    http://wiki.codeblocks.org/index.php?title=Compiled_packages_of_Code::Blocks


    [Szerkesztve]

  • czappa

    aktív tag

    válasz doc #173 üzenetére

    Köszi! Most töltöm, megnézem.

    (Közben ha valaki tudja az Anjuta-s kérdésemre a választ ne tarsta magában.)

  • czappa

    aktív tag

    Azok segítségét szeretném kérni, akik Anjuta IDE-t haszználnak.

    Van 3 fileom:
    1)main.c
    #include <stdio.h>
    #include ''masodik.h''

    int main()
    {
    int c;
    c = atlag(2,5);
    printf(''%d'',c);

    return (0);
    }

    2)masodik_num.c
    #include ''masodik.h''

    int atlag(int a, int b){
    return ((a + b) / 2 );
    }

    3)masodik.h
    int atlag(int a, int b);

    Terminálban tökéletesen le tudom fordítani, gcc -c main.c ill. gcc -c masodik_num.c, majd gcc main.o masodik_num.o parancsokkal; majd a bináris fájlt tudom futattni.

    A gond az, hogy Anjuta IDE-ben nem megy. Eleinte mindenféle hibákat írt ki, de guglizással s aptitude-dal való letöltögetéssel előrébb léptem, de még mindig nem jó.
    Pontosan ugyan azt írja ki, mintha a fönti terminálos példánál rögtön gcc main.c-vel szerettem volna fordítani:
    main.o: In function `main':
    /home/czappa/Projects/masodik/src/main.c:10: undefined reference to `atlag'
    collect2: ld returned 1 exit status

    Gondolom a linkeléssel lehet baj, és biztos be kéne állítanom vmit az anjutában de nem tudom mit.
    Nehezíti a helyzetem, hogy bár több programozási nyelvet ismerek (valamennyire...) a c nincs köztük, és linuxszal sem foglalkozom túl rég óta.

    A segítségeket előre is köszi.

    [Szerkesztve]

Aktív témák

Hirdetés