codice:
typedef struct { /* --- a transaction --- */
double weight_tran; /*peso della transazione*/
int cnt; /* number of items */
int items[1]; /* item identifier vector */
} TRACT;
typedef struct { /* --- a transaction set --- */
ITEMSET *itemset; /* underlying item set */
int max; /* maximum number of items per t.a. */
int vsz; /* size of transaction vector */
int cnt; /* number of transactions */
int total; /* total number of items */
TRACT **tracts; /* transaction vector */
} TASET;
void main()
{
TRACT *ta;
taset = (TASET*) malloc (sizeof(TASET));
taset->tracts = (TRACT**)malloc(sizeof(TRACT)); //-->questo non può essere!
ta = (TRACT*)malloc(sizeof(TRACT) +(1) *sizeof(int)); //->quì il +1 viene ignorato
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;
}
Credo di aver trovato l'errore,anzi gli errori,te li ho indicati nel codice.
innanzitutto quest'istruzione va scritta così:
codice:
taset->tracts = (TRACT**)malloc(sizeof(TRACT*));
Cioè con la sizeof devi indicare la dimensione di un puntatore
a struttura di tipo TRACT non la dimensione di un'intera struttura.
Inoltre qauesta va scritta così:
codice:
ta = (TRACT*)malloc((sizeof(TRACT) + 1) *sizeof(int));
altrimenti la precedenza dell'operatore * sull'operatore +
annulla quel + 1 che hai messo.Spero sia quello il problema.
Comunque la strada per ottenere un aiuto nel caso non sia quello e proprio
di isolare il problema e postare del codice,(possibilmente già funzionante
nel senso che si compila) in cui succede la cosa anomala,infatti il codice che hai postato ora non era compilabile,mancavano le definizioni delle strutture e la dichiarazione di TASET oltre a quella di ITEMSET.fammi sapere ciao