IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
expoox
Tvůrce
Avatar
expoox:23.4.2016 12:59

Ahoj, mam v triede pretazeny operator= no ten sa ale nikdy nezavola, viete mi povedat ako ho k tomu prinutim ?
Vdaka

CData & operator=(const CData & a);
.....
CData * binFile;
.....
CData * binFileArch;
.....
backUp[numOfBackUps].binFileArch = binFile;
 
Odpovědět
23.4.2016 12:59
Avatar
B42P6
Člen
Avatar
Odpovídá na expoox
B42P6:23.4.2016 13:23

Operator= nieje zavolaný pretože binFileArch aj binFile sú ukazatele, a teda na poslednom riadku len meníš na čo ukazuje. Ak chceš aby sa operator= zavolal na objekte musíš získať objekt na ktorý pointer ukazuje.

*(backUp[numOfBackUps].binFileArch) = *binFile;
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
23.4.2016 13:23
'long long long' is too long for GCC
Avatar
expoox
Tvůrce
Avatar
Odpovídá na B42P6
expoox:23.4.2016 14:12

to mi nenapadlo, diky, nechce sa mi zakladat nove vlakno tak skusim tu este, nevies nahodou ako spravit hlboku kopiu tohto? takto mi to hadze segfaulty

class CData
{
    private:
        uint32_t version;
        uint8_t block[50];

    public:
        ....
        CData & operator=(const CData & a){
            version = a.version;
            for (int i = 0; i < 50; i++)
                block[i] = a.block[i];

            return *this;
        }
};
 
Nahoru Odpovědět
23.4.2016 14:12
Avatar
B42P6
Člen
Avatar
Odpovídá na expoox
B42P6:23.4.2016 14:26

Nevidím tam žiadny problém chyba musí byť niekde inde. Skontroluj si či máš správne inicializované ukazatele, či si ich náhodou neuvoľnil, atď.

Nahoru Odpovědět
23.4.2016 14:26
'long long long' is too long for GCC
Avatar
expoox
Tvůrce
Avatar
expoox:23.4.2016 14:38

no valgrind my hlasi chybu v tomto :

==8249== Use of uninitialised value of size 8
==8249== at 0x4020E2: CData::operator=(CDa­ta const&) (in /home/expoox/Do­kumenty/BI-PA2/du4/a.out)
==8249== by 0x40113D: CFile::AddVersion() (in /home/expoox/Do­kumenty/BI-PA2/du4/a.out)
==8249== by 0x401B62: main (in /home/expoox/Do­kumenty/BI-PA2/du4/a.out)
==8249==
==8249== Invalid write of size 4
==8249== at 0x4020E2: CData::operator=(CDa­ta const&) (in /home/expoox/Do­kumenty/BI-PA2/du4/a.out)
==8249== by 0x40113D: CFile::AddVersion() (in /home/expoox/Do­kumenty/BI-PA2/du4/a.out)
==8249== by 0x401B62: main (in /home/expoox/Do­kumenty/BI-PA2/du4/a.out)
==8249== Address 0x0 is not stack'd, malloc'd or (recently) free'd

ale nechapem co tym mysli kedze v konstruktore premennu version nulujem a zistil som ze to pada na riadku

version = a.version;
Editováno 23.4.2016 14:39
 
Nahoru Odpovědět
23.4.2016 14:38
Avatar
B42P6
Člen
Avatar
Odpovídá na expoox
B42P6:23.4.2016 15:01

Chyba nieje v "funkci-i" operator=, ale v tom že jeden z objektov ktoré používaš už neexistuje. Aby si to lepšie pochopil prikladám tento kód.

class CData
{
    private:
        uint32_t version;
        uint8_t block[50];

    public:
        CData & operator=(const CData & a){
            version = a.version;
            for (int i = 0; i < 50; i++)
                block[i] = a.block[i];

            return *this;
        }
};

int main()
{
        CData a;
        CData b;
        a = b; //Toto je v poriadku, to dokazuje ze chyba nieje v operator-e
        CData *ptr = NULL;
        CData &ref = *ptr; //referencia teraz ukazuje na nieco co neexistuje
        a = ref; //Chyba
        ref = a; //Chyba
}

Takže si musíš všetko skontrolovať (kde operator= voláš, kde inicializuješ pointr-e,atď..)

Nahoru Odpovědět
23.4.2016 15:01
'long long long' is too long for GCC
Avatar
expoox
Tvůrce
Avatar
Odpovídá na B42P6
expoox:23.4.2016 20:01

dobre mam to, chyba bola v tom ze som mal dynamicke pole dynamickych poli ale to vnutorne pole nebolo naalokovane, takze si mal pravdu, dakujem

 
Nahoru Odpovědět
23.4.2016 20:01
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.