2010-03-22 11 views
5

Sto modificando un pezzo di codice, che fa parte di un grande progetto, che utilizza "const" per inizializzare un gruppo di matrici. Poiché voglio parametrizzare questi const, devo adattare il codice per usare "malloc" per allocare la memoria. Sfortunatamente c'è un problema con le strutture: non sono in grado di allocare memoria dinamica nella struttura stessa. Eseguirlo fuori causerebbe molte modifiche al codice originale.Memoria dinamica all'interno di una struttura

Ecco un piccolo esempio:

int globalx,globaly; 
struct bigStruct{ 
    struct subStruct{ 
      double info1; 
      double info2; 
      bool valid; 
    }; 
    double data; 

    //subStruct bar[globalx][globaly]; 
    subStruct ** bar=(subStruct**)malloc(globalx*sizeof(subStruct*)); 
    for(int i=0;i<globalx;i++) 
      bar[i]=(*subStruct)malloc(globaly*sizeof(subStruct)); 


}; 
int main(){ 
    globalx=2; 
    globaly=3; 
    bigStruct foo; 
    for(int i=0;i<globalx;i++) 
      for(int j=0;j<globaly;j++){ 
        foo.bar[i][j].info1=i+j; 
        foo.bar[i][j].info2=i*j; 
        foo.bar[i][j].valid=(i==j); 
      } 

    return 0; 
} 

Nota: nel codice del programma sto modificando globalx e globaly erano const di in uno spazio dei nomi specificato. Ora ho rimosso "const" in modo che possano agire come parametri impostati esattamente una volta.

Riepilogato: come è possibile allocare correttamente la memoria per il sottostruttura all'interno della struttura? Grazie mille!

Max

+3

Sei sicuro che questo è 'C++' e non 'c'? –

+2

** Non usare ** malloc' o 'free' sugli oggetti. Il costruttore e il distruttore non saranno chiamati. Usa 'new' e' delete' – Yacoby

+0

Questo è ciò che si chiama cattivo stile C++. I bambini, non lo fanno mai. –

risposta

4

È questo codice C o C++. I tag dicono C++ ma il codice sembra proprio come C. Perché stai usando malloc invece di new?

Per rispondere alla tua domanda. Dare alla struct un costruttore per allocare la memoria e un distruttore per eliminarlo.

Ricorda, in C++ l'unica differenza tra classi e strutture è che i membri sono privati ​​per impostazione predefinita in una classe e pubblico per impostazione predefinita in una struttura.

+0

Voi ragazzi avete ragione . Cambiare la struct in una classe e usare un costruttore fa il trucco. In questo modo devo aggiungere minime modifiche al codice. – Maximilien

+0

@Maximilien, non devi nemmeno cambiarlo in una classe. le strutture possono avere costruttori e distruttori. Funzionerà solo l'aggiunta di un costruttore/distruttore alla tua struttura. (a condizione che questo sia C++ e non il codice C, ovviamente) – Glen

1

utilizzare costruttori per fare tutto di inizializzazione (compresa l'allocazione della memoria), e distruttori per liberare memoria. E non utilizzare malloc dato che hai taggato la tua domanda con il tag C++. malloc assegna solo la memoria, non inizializzerà gli oggetti. Il seguente esempio mostra come potrebbe apparire in C++:

struct bigStruct{ 
    struct subStruct{ 
      double info1; 
      double info2; 
      bool valid; 
    }; 

    // constructor 
    bigStruct(size_t num_of_subs) : bar(num_of_subs) 
    { 
    } 
    // destructor 
    ~bigStruct() 
    { 
    }   


protected: 
    double data;  
    std::vector<subStruct> bar; 
}; 
+0

Questo sembra buono, ma dal momento che non voglio modificare molto codice non posso usare il vettore, quindi devo usare un array bidimensionale .. – Maximilien

6

Sospetto che tu abbia poca esperienza con C++. La soluzione logica è allocare la memoria nel costruttore . Sarebbe piuttosto complesso iniziare a insegnare il C++ da quel livello qui.

0

È possibile creare una funzione initialize_bigStruct() e utilizzarla dopo ogni definizione di bigStruct. Dovrai modificare il tuo codice con semplice ricerca/sostituzione.

L'aggiunta di funzioni non è consentita in C, tuttavia se si utilizza C++ è una storia completamente diversa.

0
int globalx,globaly; 
typedef struct subStruct{ 
     double info1; 
     double info2; 
     char valid; 
}subStruct; 
struct bigStruct{ 
    struct subStruct ** bar; 
    double data; 
}; 
/*Don't bother sending gl.. var since they are global*/ 
void alloc_struct(struct bigStruct *foo) 
{ 
    int i; 
    foo->bar=(subStruct**)malloc(globalx*sizeof(subStruct*)); 
    for(i=0; i<globalx; i++) 
    { 
     foo->bar[i]=(subStruct*)malloc(globaly*sizeof(subStruct)); 
    } 
} 
int main(){ 
    int i,j; 
    globalx=2; 
    globaly=3; 
    struct bigStruct foo; 
    alloc_struct(&foo); 
    for(i=0;i<globalx;i++) 
      for(j=0;j<globaly;j++){ 
        foo.bar[i][j].info1=i+j; 
        foo.bar[i][j].info2=i*j; 
        foo.bar[i][j].valid=(i==j); 
      } 
    return 0; 
} 

Solo un suggerimento in C in cui è necessario chiamare una funzione dal momento che non puoi utilizzare malloc all'interno di una strut come te dove si cerca di.

Problemi correlati