PDA

View Full Version : [c] perdita di dati 2


ciotth
09-08-2004, 15:53
Ciao.

Mi sono permessa di aprire una nuova discussione, anche se collegata alla precedente, perchè sono riuscita ad arginare il problema e sono riuscita a ricostruire un esempio (semplice) in cui mi si ripropone lo stesso problema...

quando vado ad assegnare il campo weight_tran, vengono modificati i valori del campo items.

Di seguito è riportato l'esempietto...


void main()
{
TRACT *ta;


taset = (TASET*) malloc (sizeof(TASET));
taset->tracts = (TRACT**)malloc(sizeof(TRACT));

ta = (TRACT*)malloc(sizeof(TRACT) +(1) *sizeof(int));
ta->cnt=2;

ta->items[0]=0; ta->items[1]=1;
ta->weight_tran=4.5;

/*ogni volta che assegno un valore a ta->weight_tran vengono modificati alcuni dei valori di tat->items (quelli di posizione 1 e 2: sempre gli stessi)*/

taset->tracts[0]=ta;


}

Qualcuno mi sa spiegare una possibile motivazione.... ????? .....

anx721
09-08-2004, 18:07
Non ho letto la discussione precednte, a occhio questa riga:

taset->tracts = (TRACT**)malloc(sizeof(TRACT));


mi sembra sbagliata perche dovrebbe essere

taset->tracts = (TRACT**)malloc(sizeof(TRACT *));

o

taset->tracts = (TRACT*)malloc(sizeof(TRACT));

ciotth
10-08-2004, 08:24
Sono andataa controllare ed è come hai detto tu: ho solo ricopiato male:

taset->tracts = (TRACT**)malloc(sizeof(TRACT *));

ciotth
10-08-2004, 08:43
Tra l'altro manca tutto il programmino che ricompie lo stesso errore, ve lo riporto qui di seguito:

#include <stdio.h>
#include <stdlib.h>

typedef struct {
int cnt;
int items[1];
double weight_tran;
} TRACT;


typedef struct {
int cnt;
TRACT **tracts;
} TASET;


void load(TASET *taset);
TASET *taset;



void main()
{
TRACT *ta;


taset = (TASET*) malloc (sizeof(TASET));
taset->tracts = (TRACT**)malloc(sizeof(TRACT*));

ta = (TRACT*)malloc(sizeof(TRACT) +(2) *sizeof(int));
ta->cnt=2;

ta->items[0]=0; ta->items[1]=1;
ta->weight_tran=4.5;
/*ogni volta che assegno un valore a ta->weight_tran vengono modificati alcuni dei valori di tat->items (quelli di posizione 1 e 2: sempre gli stessi)*/

taset->tracts[0]=ta;


}

anx721
10-08-2004, 12:22
Ma perchè allochi memoria in questo modo:

ta = (TRACT*)malloc(sizeof(TRACT) +(2) *sizeof(int)); ??

cioè perche aggiungi anche (2) *sizeof(int)?

Inoltre non puoi accedere a items[1] se items ha un solo elemento.

Qual è poi lo scopo del programma? cosa calcola? Da dove l'hai preso? Magari vedendo l'originale ci capisco di più!

ciotth
11-08-2004, 09:34
E' un trucchetto... per poter utilizzare la memoria come un vettore ed ecco il motivo per cui si può utilizzare items[1] anche se è stato dichiarato un vettore di un elemento.

Comunque la soluzione al problema dovrebbe consistere nel dichiarare un "vettore fittizio" di double:

double weight_tran[1]

e un puntatore di interi

int *items, allocando poi il numero esatto di interi (grazie a i o n).

Di conseguenza deve anche cambiare la dichiarazione della variabile tat: dovrebbe esser aggiunta la dichiarazione di spazio allocato per il vettore di double.

Vi ringrazio comunque dell'interessamento...