Keresés

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

  • Sk8erPeter

    nagyúr

    válasz dani0907 #1020 üzenetére

    Hehe, csak nem "Szoftver laboratórium 2." BME-n? :DD

    Az első mondat annak idején nálam is ugyanez volt, csak nekem a tail programot kellett elkészítenem.
    A tetszőleges hosszúságú sorokból álló szöveges állományt reprezentáló objektum vizsgálgatásához én cirkuláris buffert készítettem, ami tulajdonképpen egy olyan tároló, amibe folyamatosan pakolgatod bele az elemeket (én a tároló egy adott "rekeszében" a sorokat tároltam \n-ig), és amikor a tároló megtelt, akkor elkezded újból elölről feltöltögetni a tárolódat, és ezen végezgeted a grep-vizsgálatot. Ez azért jó, mert tulajdonképpen tetszőleges hosszúságú sorokból álló szöveges állományt tudsz vizsgálgatni, nem állhat elő olyan helyzet, hogy már olyan brutálisan sok memóriát foglaltál, hogy egyszerűen nincs több szabad memória (mert mondjuk minden szart eltárolsz), viszont talán egész hatékonynak mondható módja a tárolásnak.
    Ja, és gondolom nálatok is úgy van, hogy STL-t nem lehet használni, így saját tárolót kell írni.

    A grep mondjuk elég összetett, ahogy a példa írja, válassz ki néhány megvalósítandó funkciót, ami nem tűnik olyan brutálnak (vagy ahogy érzed :D), amikhez a megfelelő kapcsolók tartoznak, és azokat írd meg. Kezdd el írni, és ha elakadtál, konkrétan kérdezz rá, hogy mire gondoltál, mi nem megy, hogy szeretnéd megvalósítani, és akkor tovább is tudunk segíteni remélhetőleg.

    Sk8erPeter

  • Sk8erPeter

    nagyúr

    válasz dani0907 #1024 üzenetére

    Hát amit én annak idején megcsináltam operátor-átdefiniálással, az a sorok tárolására szolgáló osztályban a következő:

    string& operator[] (int n) // Indexoperátor a tároló megadott elemének elérésére (pl. itt egy adott sor)
    Ez_a_te_taroloosztalyod& operator= (const Ez_a_te_taroloosztalyod&) // egyenlőség operátor a másik tároló lemásolására

    a tárolóosztályon belüli belső iterátor osztályban ezek lehetnek:

    void operator++ () // pre-increment növelés
    void operator++ (int n) // post-increment növelés
    bool operator== (const iterator &other) const // egyenlő-e a két iterátor
    bool operator!= (iterator &other) // egyenlő-e a két iterátor
    string & operator* () // iterátor indirekció

    Tehát mint látható, igazából az iterátor osztályhoz kell pár operátor-átdefiniálással járó cucc, de amúgy tényleg nem kell annyira erőltetni.
    Legalábbis nekem most épp nem jut eszembe más, de aztán amikor a feladatot megoldogatod, küldözgethetsz ide státuszjelentéseket, ha nem klappol valami, vagy eszedbe jutott újabb dolog, és akkor lehet, hogy még felmerül, hogy mégis kéne valami operátor-átdefiniálós metódus.

    Egykori előadónk honlapján megtalálsz egy konkrét példát az iterátor osztályról: [link]

    Bár feltételezem a feladatleírásból, Te is BME-re jársz, Szebihez, vagy tévednék? :)

    [ Szerkesztve ]

    Sk8erPeter

  • Sk8erPeter

    nagyúr

    válasz dani0907 #1049 üzenetére

    Nem láttam még a kódodat (amúgy elég bátor dolog felrakni pastebin-re, később ezzel vigyázz, mert "Számítógépes grafika és képfeldolgozás" tárgyból emiatt könnyen plágiumvád érhet! - még ha a Te kódod is került fel netre...), DE
    ide pont leírtam, hogyan lehet detektálni a memóriaszivárgás forrását: [link]

    Szerk.: félreértés ne essék, pastebin-re felrakni a kódot egyébként nagyon is jó dolog, csak ha para lehet belőle mondjuk házinál vagy egyéb esetben, akkor nem biztos, h jó ötlet.

    [ Szerkesztve ]

    Sk8erPeter

  • Sk8erPeter

    nagyúr

    válasz dani0907 #1051 üzenetére

    És gondolod, a levlistás emberkék nem olvassák ezt a fórumot? :DD (Én is BME-s vagyok, simán lehetnék akár évfolyamtársad is. :DDD)

    Igen, Cporta elég háklis bárminemű hibára, mert Linuxos fordító. :) Megpróbálhatnád esetleg Te is azzal.
    Nekem most sajnos nincs időm debuggolgatni, de remélem, valaki rá tud nézni a kódodra! :K

    Még egy:
    "Egyébként, benne van a #define _CRTDBG_MAP_ALLOC #include <stdlib.h> #include <crtdbg.h>"
    És a többi dolog, ami a linkelt hsz.-ben látszik? :F
    Lehet, hogy nem ártana az sem.

    Amúgy mi az egész pontos hibaüzenet? Vagy csak ennyi, h memóriaszivárgás? Én már nem emlékszem, kaptunk-e valami egzaktabb hibaüzit. :D Mondjuk asszem nem. :DDD

    [ Szerkesztve ]

    Sk8erPeter

  • Gyuri16

    senior tag

    válasz dani0907 #1049 üzenetére

    megneztem valgrind-dal ( valgrind --leak-check=yes -v ./strc ), eredmeny:

    ==6235== 871 errors in context 1 of 1:
    ==6235== Mismatched free() / delete / delete []
    ==6235== at 0x4023881: operator delete(void*) (vg_replace_malloc.c:387)
    ==6235== by 0x8048D80: stringc::operator=(stringc) (stringc.hpp:61)
    ==6235== by 0x8048F98: load(_IO_FILE*, stringc) (stringc.hpp:103)
    ==6235== by 0x8049073: test_1() (strc.cpp:17)
    ==6235== by 0x80491C0: main (strc.cpp:42)
    ==6235== Address 0x42c5f20 is 0 bytes inside a block of size 1 alloc'd
    ==6235== at 0x40243B0: operator new[](unsigned int) (vg_replace_malloc.c:299)
    ==6235== by 0x8048C46: stringc::stringc(stringc const&) (stringc.hpp:46)
    ==6235== by 0x804905A: test_1() (strc.cpp:17)
    ==6235== by 0x80491C0: main (strc.cpp:42)

    (sorszamok nem fognak egyezni, mert kivettem belole az ifdefeket)

    ebben a fuggvenyben:

    stringc stringc::operator=(stringc s){
    if(this == &s)
    return *this; //önmagába nem másol
    delete p;
    h=s.h;
    p= new char[h+1];assert(p!=0);
    strcpy(p,s.p);
    return *this;
    }

    delete p; helyett delete [] p; kell.

    Nem vagyok egoista, csak uborkagyalu!

  • Gyuri16

    senior tag

    válasz dani0907 #1055 üzenetére

    nincs mit. :)
    amugy ajanlom hasznalni valgrindot, nekem mar segitett parszor.

    Nem vagyok egoista, csak uborkagyalu!

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