|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: May 2004
Messaggi: 14
|
[c] perdita di dati 2
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.... ????? ..... |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
|
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));
__________________
Sun Certified Java Programmer EUCIP Core Level Certified European Certification of Informatics Professionals |
![]() |
![]() |
![]() |
#3 |
Junior Member
Iscritto dal: May 2004
Messaggi: 14
|
Sono andataa controllare ed è come hai detto tu: ho solo ricopiato male:
taset->tracts = (TRACT**)malloc(sizeof(TRACT *)); |
![]() |
![]() |
![]() |
#4 |
Junior Member
Iscritto dal: May 2004
Messaggi: 14
|
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; } |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
|
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ù!
__________________
Sun Certified Java Programmer EUCIP Core Level Certified European Certification of Informatics Professionals |
![]() |
![]() |
![]() |
#6 |
Junior Member
Iscritto dal: May 2004
Messaggi: 14
|
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... |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:53.