Keresés

Hirdetés

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

  • Jester01

    veterán

    válasz ktg3 #62 üzenetére

    // main
    void main ()
    ... helyett ...
    int main (int, char**)
    (és persze return 0; a végére)

    for(int i=0;i=9;i++)
    ... helyett ...
    for(int i=0;i<=9;i++)

    // fifo.cpp
    tmp[elementnum-1]=n;
    ... helyett ...
    tmp[elementnum]=n;

    fifo::pop ()
    ... helyett ...
    int fifo::pop ()

    x=t[elementnum];
    ... helyett ...
    x=t[elementnum - 1];

    Jester

  • Jester01

    veterán

    válasz ktg3 #65 üzenetére

    Rengeteg baj van vele, sört nem szeretem és azt se ha valaki több topikba is beírja ugyanazt.

    Mindenesetre az elsõ 2 probléma (futásidei sorrendben)
    1) v1.erase(12) miatt exception lesz hiszen csak 10 elem van a vektorban (szerintem tévedésbõl felcserélted a 2 sort)
    2) az Exception osztályodnak nincs copy constructora, emiatt (és mert nem dinamikus példányt hozol létre) a message kétszer lesz felszabadítva.

    Jester

  • Jester01

    veterán

    válasz ktg3 #67 üzenetére

    Az Exception osztálynak nincs olyan konstruktora, ami egy másik Exception-t fogad paraméternek. A copy constructor szignatúrája így néz ki:
    Exception(const Exception& source)

    MOD: ha te nem csinálsz ilyet akkor a fordító generál egyet. De az tagonkénti értékadás lesz így aztán több példány is ugyanazt a message tagot fogja használni és mindegyik fel akarja szabadítani. Le kell másolni.

    [Szerkesztve]

    Jester

  • bpx

    őstag

    válasz ktg3 #90 üzenetére

    ezt még fordítani sem tudom, egyszerűbb ha felteszed a forrásfájlt vhova :D
    (smile-kat + stringkonstansokat még visszairogattam, de így is elég sok errort dob, pl. char*-nak adsz chart értékül, vagy char*-ot hasonlítasz össze char-ral)

    vagy pl. egy helyen így inicializál stringet:

    String::String(char c, unsigned int times)
    {
    elementsNum=times;
    pData=new char[elementsNum+1];
    for(unsigned int i=0;i<elementsNum;i++)
    pData=c; // pData az char* típusú
    // esetleg pData = c; a fenti helyett :D
    pData[elementsNum]='\0';
    }


    [Szerkesztve]

  • Jester01

    veterán

    válasz ktg3 #126 üzenetére

    Ezzel millió baja volt a fordítónak, de azokat javítva valamit csinál.
    Mi a problémád konkrétan?

    Jester

  • Jester01

    veterán

    válasz ktg3 #128 üzenetére

    Az a <class T> az olyan mint a függvényeknek (vagy makróknak) a paramétere. Tehát a T az tetszõleges név lehet. Az egész úgy mûködik, hogy a T helyére a példányosítás során adott osztályokat (típusokat) helyettesít be. A te kódodban Vector osztály nem létezik, az csak egy minta (template). Tehát igazából sehova sem írhatod azt, hogy Vector, mindenhol meg kell adnod a behelyettesítendõ típust vagy konkrétan vagy pedig template paraméterrel (ez alól azt hiszem vannak kivételek, de olyanról nem tudok, hogy ne lehetne kiírni -- vagyis az a biztos ha mindenhová kiírod).

    Ezen felül csak annyi hiba volt a progiban, hogy hiányzott az assert.h és az operator<< visszatérési típusánál egy helyen lemaradt az & jel, valamint a friend deklarációnál is kell a template kulcsszó.

    Jester

  • caddie

    csendes tag

    válasz ktg3 #126 üzenetére

    Azt hiszem, hogy a problemak egy reszet mar leirtak, en meg javasolnek 1-2 dologt:

    - nagyon nem illik a headerekbe a using namespace std;-t beleirni
    - a standard konyvtar definial egy vector template osztalyt, majdnem azonos neven
    - a kiiro operator definialasakor te igazabol egy free (''globalis'') fuggvenyt definialsz, amely egyik parametere template osztaly. ebbol kifolyolag az altalad definialt kiiro operatornak is templatenek kell lennie (alatta ki is van kommentezve)
    - konstruktoroknal erdemes hasznalni az inicializalasi listat (ezzel kikerulheto a telejsen felesleges default konstrualas es az ezuatni ertekadas)
    - unsigned int-ek helyett, erdemes hasznalni az STL-hoz hasonloan a size_t tipust
    - ertekado operatorok tipikusan T& ternek vissza a lancbafuzes tamogatasa miatt, de persze lehet, neked pont az volt a celod, hogy ilyen dolgokat ne engedj meg
    - mivel letezik a vektor meretenek lekerdezesere kialakitott interface (size()), ezert velemenyem szerint felesleges a kiiro template operatort friendkent deklaralni
    - a NULL nem szabvanyos! nullat hasznalj helyette
    - a copy konstruktort biztos igy akartad csinalni?


    {
    Vector<int> a;
    // a-t feltoltod elemekkel

    Vector<int>b(a);
    }
    // megsemmisul a, felszabadul a.pData;
    // felszabadul(na) b.pData;
    // de mivel a.pData == b.pData ami mar megsemmisult,
    // ehelyett katasztrofa lesz


    // alternativ eset

    a.clear(); // felszabadul a.pData (b.pData is oda mutat)
    b[5];
    // szerencses esetben elcrachel a programod
    // peches esetben pedig fut tovabb csak hulyeseg irodik ki
    // megpechesebb esetben jo irodik ki
    // klasszikus undefined behaviour



    - copy konstruktor egyertelmuen hibas
    - assert.h helyett majd inkabb cassert-et hasznald
    - erase eseten, ha egy elemed volt akkor -1-re alitod az elemenNum-t
    - postfix increment / decrementalas helyett erdemes a prefixet hasznalni (ahol persze azonos a ketto funkcionalitasa)
    - erase eseteben a torlendo elem kihagyasa nem tul elengas, sott gyanus, hogy a for ciklusnal a ciklusfeltetel tulindexelest fog eredmenyezni
    - insert-nel erdemes lenne const T& -et atadni
    - ennek nem latom sok ertelmet:


    if(elementNum==UINT_MAX)
    {
    return false;
    }


    de ha mar ilyenekre figyelsz, akkor erdemes lenne inkabb a C++ std altal biztositott dolgokat hasznalni, tovabba inkabb a new sikeres memoriafoglalasat ''leellenorizni''* (bar egy beadando eseteben egyiknek sincs tul sok jelentosege)

    * erdemes eszrevenni, hogy alap esetben std::bad_alloc exceptiont dob, de nothrow-os valtozat hasznalataval ra lehet venni arra is, hogy nullpointert adjon vissza sikertelen foglalas eseten


    - insertnel megint az kell, hogy modnjam, hogy ez nem tul elegans modja az elem beszuarasanak
    - insertnel ha pos > mint az aktualis vektor merete, akkor ne egyenkent toltsd fel nullaval, hanem default konstruald nullaval inkabb
    - insertnel nem latom pontosan, hogy miert pos + 1 meretu tombot foglalsz
    - [] operator eseteben az az altalanos STLes megkozelites, hogy [] nem ellenoriz indexhatarokat, csak at teszi azt, igy az at fuggvenyt a [] segitsegevel valositjak meg.
    - eddig sem lattam sok ertelmet az asserteknek, az amlitett dolgok nem olyan hibak amiert le kene shutdownolni az egesz programot, de ertekado operator eseteben egyenesen a jozan esz ellen megy. Abban az esetben inkabb egy return *this; kellene, amennyiben onertekadasrol lenne szo



    Igy elso atfutasra en ezeket a furcsasagokat vettem eszre, nehany kozulok talan csak sznobizmus, de azert akadt kozottuk par tervezesi hiba es eletveszelyes undefined behaviour is.

    [Szerkesztve]

    ''C++ : Where friends have access to your private members.'' — Gavin Russell Baker.

  • Jester01

    veterán

    válasz ktg3 #213 üzenetére

    * Az strcmp az nem boolean visszatérési értékű kellene legyen. Ha a compare viszont igen, akkor az nyugodtan hívhatja az strcmp-t.
    * Az strcmp-ben a if (i==s1.elementsNum-1) feltétel elég borzasztó, elég lenne a ciklus után visszaadni igaz értéket
    * rendszeresen nem szabadítod fel az előző tartalmat
    * hiányzik a lezáró 0 byte a concatenate fvben
    * if(not) return false; else return true; ilyet ne csinálj már :Y
    * strchr nem mindig ad vissza értéket, de ha igen, akkor biztos, hogy kell a +1 ?
    * az strstr gyakorlatilag halvaszületett

    Első ránézésre ennyi.

    Jester

  • Jester01

    veterán

    válasz ktg3 #217 üzenetére

    strcmp: <0 =0 >0 értéket add vissza attól függően, hogy az első string kisebb, egyenlő vagy nagyobb mint a második. compare fv-t nem tudom honnan vetted, nincs a feladatban.

    strstr igazából az strchr-hez hasonlóan pozíciót kellene visszaadjon mivel a te implementációdban a char*-nak szerintem semmi értelme.

    Jester

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