Newsgroup: it.comp.lang.c
Titolo: perchè sono diversi?

Vi posto le parti essenziali di un programma che ho scritto per la 
scscuola. La prima versione non funge come dovrebbe, la seconda 
sì...solo che ho corretto l'errore ma non ho capito dove sia 
effettivamente sto errore! qualcuno ha voglia di farmi capire?
versione che non funziona:
miastruttura  *creastruttura(int parametro)
{
  miastruttura *struttura;
  struttura=malloc(sizeof(miastruttura));
  ...
  ...//riempimento dei campi della struttura con struttura->campo=valore
  ...
  return struttura
}
int main(argc, argv[])
{
//operazioni preliminari
..
..
.
for(i=0;i<100;i++)
{
  miastruttura *struttura;
  struttura=creastruttura(parametro);
  //operazioni
  ...
  ...
  ...
}
//altre operazioni
...
...
}
versione che funziona:
void  creastruttura(miastruttura *struttura,int parametro)
{
  ...
  ...//riempimento dei campi della struttura con struttura->campo=valore
  ...
}
int main(argc, argv[])
{
//operazioni preliminari
..
..
.
for(i=0;i<100;i++)
{
  miastruttura struttura;
  creastruttura(&struttura,parametro);
  //operazioni
  ...
  ...
  ...
}
//altre operazioni
...
...
}
Entrambe le versioni compilano esattamente e senza warning, ma la prima 
quando la eseguo esegue la prima iterazione del ciclo for, poi entra una 
nella seconda (verificato con una printf() subito dentro il ciclo!) ma 
poi si ferma: non crea il nuovo puntatore, non esegue le operazioni 
dentro il ciclo ma non solo: non esegue neanche le operazioni fuori dal 
ciclo!!! il programma termina così....potete aiutarmi?nonostante abbia 
risolto il problema io continuo a pensare che le due versioni siano 
equivalenti!
Ps: non fate caso a eventuali errori di sintassi, nel listato originale 
non ce ne sono!

 void  creastruttura(miastruttura *struttura,int parametro)
Queste due funzioni non sono affatto equivalenti: la prima alloca memoria,
la inizializza e ne restituisce l'indirizzo al chiamante; la seconda non
alloca memoria ma presumibilmente si limita a valorizzare la memoria
puntata.
Riporta il tuo codice originale, altrimenti sarà difficile aiutarti.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 non ce ne sono!
Ci credo e non faccio caso a questo...
<BUONICONSIGLI ignore="on">
Pero', se mi permetti di farti una critica a fin di bene, hai fatto un 
'post' molto tirato via e in cui mancano anche parti essenziali: forse 
non avevi tempo...
A parte il fatto che qualcuno potrebbe prendere il tuo 'tirar via' nello 
scrivere come un comportamento 'poco educato' nei confronti di chi ti 
*deve* capire per poi aiutarti, a me dai anche un'altra impressione... 
anche questa non bella (e forse peggiore). Mi dai l'*impressione* (leggi 
bene: impressione) di essere un tipo disordinato, spreciso e 
approssimativo - e un /buon/ programmatore non puo' assolutamente 
permettersi di avere queste caratteristiche.
Probabilmente non sei cosi'. Pero', arrivando al dunque, il consiglio 
gratuito che voglio darti e' quello di porti in modo diverso. Non solo 
con i tuoi professori d'informatica ma anche, e soprattutto (se farai 
veramente il programmatore), con chi domani ti valutera' in un colloquio 
di lavoro.
</BUONICONSIGLI>
Ciao :-)
-- 
Cybertoldo
Per rispondermi via email, sostituisci moc.liamg con 
gmail.com

 
il codice è abbastanza lungo, si può postare lo stesso?

il codice è abbastanza lungo, si può postare lo stesso?
Posta solo il codice delle due funzioni...

 } 
ti vedo gia' cattivissimo, con la matita blu e rossa pronta e ben 
appuntata :)


vi ringrazio entrambi per l'interessamento, ma ho trovato da solo! in 
verità l'errore era in una terza funzione che all'apparenza sembrava 
funzionare bene ma, causa arrotondamenti vari alcune volte generava un 
overflow ritornando un valore negativo che poi andava a fare macelli sui 
vari puntatori...l'unica cosa che non ho capito è perchè sul portatile 
il programma si piantava "in silenzio", mentre sull'altro pc almeno 
windows mi propinava un bel messaggino "exception...." che mi ha 
indirizzato sulla retta via!
PS per cybertoldo: in verità sono un tipo molto precisino (a volte pure 
troppo)è solo che ho postato il messaggio velocemente nella pausa 
pranzo..comunque i buoni consigli si accettano sempre!

 indirizzato sulla retta via!
Home sul notebook e Profesional sul fisso?

 Home sul notebook e Profesional sul fisso?
sě!

indirizzato sulla retta via!
Perché non è affatto detto che in caso di "sforamenti" nella memoria,
si sollevi un errore di violazione d'accesso.  E' per questo che bug
di questo tipo sono piuttosto subdoli e possono rubarti diverso tempo.
Il programma potrebbe tranquillamente continunare a sporcare diverse
zone di memoria, prima che il sistema operativo venga "punto sul vivo"
o non esserlo affatto.  Ci sono programmi che girano tranquillamente
per giorni, prima di dare problemi.

ho capito, però adesso ho un altro problemino: il programma gira 
correttamente fino all'ultima istruzione ( sistem("PAUSE") che viene 
anch'essa completata, ma poi invece di terminare correttamente mi genera 
un'eccezione di memoria...da cosa può dipendere? forse devo liberare 
tutta la memoria che ho allocato prima?è obbligatorio farlo?
Fabio

è obbligatorio farlo?
E' consigliabile, non obbligatorio.

> Aspetta che guardo nella sfera di cristallo...
Ok, non č che ti abbia dato molte indicazioni ;-) , ma quello che volevo 
dire č: non č strano che si verifichi alla fine del programma quando 
ormai tutte le operazioni sono state fatte?

 ormai tutte le operazioni sono state fatte?
No. Le violazioni di accesso alla memoria possono anche dipendere dal
fatto che il codice ha "sporcato" zone di memoria utilizzate dalle fasi di
clean-up del programma, alla terminazione.  Nessuno puň dirlo.


 
e se volessi cercare errori del genere dove dovrei guardare? dopo sta 
domanda prometto che non ti rompo piů!!!!

e se volessi cercare errori del genere dove dovrei guardare? 
Quasi sempre questi errori sono dovuti a una cattiva gestione dei
puntatori e, in generale, della memoria allocata dinamicamente.
Controlla le parti del codice interessate da queste elaborazioni.