Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Ne znam zasto puca (char**)

[es] :: C/C++ programiranje :: Ne znam zasto puca (char**)

[ Pregleda: 3849 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.228.eunet.yu.



+9 Profil

icon Ne znam zasto puca (char**)08.09.2005. u 21:42 - pre 196 meseci
Zasto ovo puca? Obratite paznju na matrix promenljivu...dolazi do problema kada pokusam da oslobodim mem. u desktruktoru...sta se desava?
Ako mozete..najbolje je da iskompajlirate sa gcc-om. Koristim gcc3.3.4.

Code:

#include<iostream>
#include<fstream>
using namespace std;

class field
{
    public:
        field(int n, int m);
        ~field();
        void set(int n, int m, char v);
        char get(int n, int m);
    private:
        char **matrix;
        int x,y;
};

void generate_map(int density, field &rf);
char random_trees(int density);

int main(int argc, char *argv[])
{
    field pf(10,10);
}

field::field(int n, int m)
{
    matrix = new char*[n-1];
    for(int i=0;i<n;i++) matrix[i] = new char[m-1];
    x = n; y = m;
}

field::~field()
{
    for(int i=0;i<x;i++) delete[] matrix[i];
}

inline void field::set(int n, int m, char v)
{
    if((n<1 || m<1) || (n>x || m>y)) return;
    matrix[n-1][m-1] = v;
}

inline char field::get(int n, int m)
{
    if((n<1 || m<1) || (n>x || m>y)) return(-1);
    return(matrix[n-1][m-1]);
}

void generate_map(int density, field &rf)
{
    if(density<2) density=2;
    if(density>9) density=9;
}

char random_trees(int density)
{
    char ret_val;
    fstream rnd("/dev/urandom",ios::in|ios::binary);
    rnd.read((char*)&ret_val,sizeof(char));
    rnd.close();
    if(ret_val%density==0) return('*');
    return(' ');
}
 
Odgovor na temu

igac
Banjaluka

Član broj: 415
Poruke: 562
*.dip.urc.bl.ac.yu.



+2 Profil

icon Re: Ne znam zasto puca (char**)08.09.2005. u 22:01 - pre 196 meseci
ne znam... meni ne puca gcc 3.3.1 iz dev-cpp4.9.9.1
"nice town, i'll take it..."
 
Odgovor na temu

Reljam
Relja Markovic
San Francisco

Član broj: 531
Poruke: 1793
*.microsoft.com.



+18 Profil

icon Re: Ne znam zasto puca (char**)08.09.2005. u 22:09 - pre 196 meseci
Los ti je konstruktor. Za n=1, ocigledno ne radi. Treba da promenis red:

matrix = new char*[n-1];

u

matrix = new char*[n];
 
Odgovor na temu

yooyo

Član broj: 4891
Poruke: 1101
195.252.89.*



Profil

icon Re: Ne znam zasto puca (char**)08.09.2005. u 22:14 - pre 196 meseci
Ovde je greska...

Code:

field::field(int n, int m) // neka su n i m = 10
{
    matrix = new char*[n-1]; // alociras 9 elementata i to sa indexima 0..8
    for(int i=0;i<n;i++) matrix[i] = new char[m-1]; // kada i postane 9, bombardujes memoriju jer za matrix[9] nije alociran prostor.
    x = n; y = m;
}


Pravilno bi bilo:
Code:

field::field(int n, int m)
{
    matrix = new char*[n];
    for(int i=0;i<n;i++) matrix[i] = new char[m];
    x = n; y = m;
}


yooyo
 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.99.EUnet.yu.



+9 Profil

icon Re: Ne znam zasto puca (char**)08.09.2005. u 22:34 - pre 196 meseci
Hvala Reljo, hvala Yooyo...to je to. I sada je samo potrebno da udarim glavom o zid, zato sto sam pomislio da ako se kaze x = new char[9], x ima indekse...x[0],x[1]....x[9]!
Uzas...
Jos jednom vam hvala.
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
*.bar.novatv.hr.



+9 Profil

icon Re: Ne znam zasto puca (char**)09.09.2005. u 10:12 - pre 196 meseci
Možda bi bilo dobro da uzmeš u obzir i eventualnu neuspjelu dinamičku alokaciju, pa postaviš i neku poruku i za slučaj toga...
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.bowneglobal.com.



+6 Profil

icon Re: Ne znam zasto puca (char**)09.09.2005. u 13:17 - pre 196 meseci
A i destruktor ti nije kompletan, mada to ne može da izazove pucanje programa, već samo curenje memorije.

Uzgred, pogledaj ovo: http://www.boost.org/libs/multi_array/doc/user.html
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.bowneglobal.com.



+6 Profil

icon Re: Ne znam zasto puca (char**)09.09.2005. u 13:22 - pre 196 meseci
I još nešto:

Šta se desi kad uradiš nešto kao:

field a(10,10), b(10,10);
a = b;


 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.124.EUnet.yu.



+9 Profil

icon Re: Ne znam zasto puca (char**)09.09.2005. u 15:27 - pre 196 meseci
Posto nisam definisao copy constructor mogu da se dese sledece stvari..mozda sam nesto izostavio..

kopiraju se samo vrednosti x i y
a za matricu se kopiraju samo vrednosti pokazivaca, a ne i cele matrice
i plus.. ako se objektu sa vecom matricom dodeli objekat sa manjom matricom ostatak pokazivaca ce 'izvisiti'

Nego, sta sam izostavio u destruktoru?... ispravi me ako gresim, ali mislim da je potrebno obrisati samo clanove kojima je dinamicki dodeljena memorija.
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.bowneglobal.com.



+6 Profil

icon Re: Ne znam zasto puca (char**)09.09.2005. u 16:59 - pre 196 meseci
Citat:
Goran Arandjelovic: Posto nisam definisao copy constructor mogu da se dese sledece stvari..mozda sam nesto izostavio..

kopiraju se samo vrednosti x i y
a za matricu se kopiraju samo vrednosti pokazivaca, a ne i cele matrice
i plus.. ako se objektu sa vecom matricom dodeli objekat sa manjom matricom ostatak pokazivaca ce 'izvisiti'


Tako je, ali još gore je što na tako kopirane pointere pozivaš dva puta delete u destruktorima objekata, a to može da dovede to kraha.

Citat:
Goran Arandjelovic
Nego, sta sam izostavio u destruktoru?... ispravi me ako gresim, ali mislim da je potrebno obrisati samo clanove kojima je dinamicki dodeljena memorija.


Pa kad pozoveš
Code:
for(int i=0;i<x;i++) delete[] matrix[i];

to oslobađa memoriju alociranu sa
Code:
for(int i=0;i<n;i++) matrix[i] = new char[m];


Međutim, deo alociran sa
Code:
matrix = new char*[n-1];

nigde nije obrisan.

Generalno savetujem ljudima da se klone tih new-delete petljancija i koriste gotove klase (STL, Boost, MFC, Borland,... ko šta voli) osim kad se baš mora.

[Ovu poruku je menjao Dragi Tata dana 09.09.2005. u 18:00 GMT+1]
 
Odgovor na temu

Reljam
Relja Markovic
San Francisco

Član broj: 531
Poruke: 1793
*.hsd1.wa.comcast.net.



+18 Profil

icon Re: Ne znam zasto puca (char**)09.09.2005. u 17:17 - pre 196 meseci
Nisi obrisao sam matrix:
delete[] matrix;
 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.140.EUnet.yu.



+9 Profil

icon Re: Ne znam zasto puca (char**)09.09.2005. u 18:07 - pre 196 meseci
Aha..jasno, jasno.

@Dragi Tata
I u pravu si...koriscenje nekih biblioteka bi olaksalo zivot, ali bi takav slucaj brisanja mogao verovatno da se obradi izuzecima :))
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.americas.bgsinternal.com.



+6 Profil

icon Re: Ne znam zasto puca (char**)09.09.2005. u 18:28 - pre 196 meseci
Citat:
Goran Arandjelovic: ali bi takav slucaj brisanja mogao verovatno da se obradi izuzecima :))


Hmmm, mislim da Standard ne zahteva da se kod duplog brisanja baci izuzetak. Tu ja vidim tri rešenja:

1) Da implementiraš copy konstruktor i operator = tako da napravi kopiju matrica a ne samo pointera.

2) Da deklarišeš gorepomenute funkcije kao privatne, pa će onda kompajler da te spreči da uradiš ono što sam ja gore napisao.

3) Da udariš neki reference counting pa da tek poslednji destruktor pozove delete.

Ali ja ti ipak savetujem boost::multi_array ;)
 
Odgovor na temu

[es] :: C/C++ programiranje :: Ne znam zasto puca (char**)

[ Pregleda: 3849 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.