PDA

Visualizza la versione completa : [C++] new e delete


sandrinolli
31-05-2010, 12:59
Salve a tutti,
volevo chiedervi un aiutino :-)

height = numero righe file
weight = numero colonne file

Ogni agente deve avere un numero di features pari al numero di colonne
lette nel file(width)
Per ogni riga letta viene creato un agente e per ogni agente vorrei che vengano assegnate
alle features i numeri di colonna.




float *features; // dichiarata nella classe Agente
matrice = (float*)malloc(sizeof(*matrice)*width*height);


for (int i=0; i<height; i++)
{
Mio* agente = new Agente ();
agente->features = new float[width];
for(int j=0; j<width; j++)
{
boid->features[j] = matrice[i*width+j];
}
boid->id = id;
id++;
delete[] boid->features;
}
free(matrice);


Per ogni agente vorrei allocare la memoria necessaria alle features in base al numero di colonne e una volta fatto questo vorrei assegnare alle features il valore presente nelle colonne.Non riesco a capire dov'è l'errore
Grazie :-(

shodan
31-05-2010, 13:34
Quale errore?

sandrinolli
31-05-2010, 13:42
Alla riga : boid->features[j] = matrice[i*width+j];

Eccezione non gestita a 0x00406c67 :
0xC0000005: Violazione di accesso nella scrittura del percorso 0xbaadf00d

shodan
31-05-2010, 13:45
E se porti il delete di bold fuori dal ciclo?

sandrinolli
31-05-2010, 13:53
Facendo così come mi hai suggerito non ho errori pero il file che seleziono
ha 802 righe e 6 colonne...A me viene creato un solo agente con una sola feature : 0.0

shodan
31-05-2010, 14:09
Non si capisce cosa faccia quel codice. Allochi agente, alla sua variabile features assegni un array di float, poi usi boid, che non si sa ne quando venga creato ne a cosa serva, e infine deallochi boidall'interno di un ciclo.
E corretto così o hai fatto (tanta) confusione?

sandrinolli
31-05-2010, 14:49
boid e agente sono la stessa cosa scusa.

Per ogni riga creo un agente e ad ogni feature dell'agente voglio assegnare il valore delle colonne



for (int i=0; i<height; i++)
{
Mio* agente = new Mio ();
agente->feature = new float[width];
for(int j=0; j<width; j++)
{
agente->feature[j] = matrice[i*width+j];
}
agente->id = id;
id++;
delete[] agente->feature;
}
free(matrice);

sandrinolli
31-05-2010, 17:56
Ho provato a fare il debug.
Sembra che i miei agenti sono formati da una sola feature, gli viene assegnata solo la prima.
Ad esempio ho un file con 6 righe e 5 colonne: riesco ad ottenere 6 agenti che però hanno solo
la prima feature che corrisponde al primo valore di ogni colonna.

shodan
31-05-2010, 18:59
Veramente hai sei agenti (più sei memory leak visto che agente è locale al primo ciclo for e non lo assegni a niente altro ne lo deallochi) e 0 colonne visto che deallochi continuamente features. Solo id sopravvive.



for (int i=0; i<height; i++)
{
Mio* agente = new Mio (); // qui allochi un agente.
agente->feature = new float[width]; // qui allochi le features
for(int j=0; j<width; j++)
{
agente->feature[j] = matrice[i*width+j]; // qui copi la matrice nelle features
}
agente->id = id;
id++;
delete[] agente->feature; // qui deallochi e perdi le features dell'agente.
// qui perdi pure l'agente allocato.
}
// qui hai un pugno di mosche.

Il codice è inserito in una funzione per caso?

sandrinolli
01-06-2010, 01:39
Il codice è inserito all'interno di un metodo che apre il file,
legge righe e colonne del file e dovrebbe assegnare ad ogni agente (la riga del file), i valori delle colonne nelle features.
Forse ho capito dove sta l'errore,le features le assegna perfettamente.

Nel metodo dove faccio visualizzare le features definisco in questo modo il numero di colonne del file(che corrispondono al numero di feature allocate per l'agente):

int width = (sizeof(agente->feature)/(sizeof(agente->feature[0]));

Va bene? Se metto ad esempio il numero esatto di colonne di un file che decido di aprire, ad esempio 6 ,le features vengono visualizzate correttamente.
Forse sbaglio questa istruzione?

Loading