[FoLUG] [OT] info C ansi

Marco Benvenuto marco.benvenuto1@tin.it
Sab 23 Apr 2005 12:20:11 CEST


> >Devo creare una funzione che mi risolva un-equazione di secondo grado.
> >Credevo fosse facile, ma poi mi sono accorto che l-equazione deve
> >restituire due parametri perche' ammette 2 soluzioni.
> >Devo usare le strutture?
> >
> >
>
> delta=radice quadrata(b^2-4ac);
> se delta < 0 ....
> altrimenti se delta = 0 ...
> altrimenti se delta > 0
> {  soluzione 1 = (-b + delta)/2a
>    soluzione 2 = (-b - delta)/2a
> }
>
> Converti tutto in c, riempi quello che ci va dove sono i puntini e
> domani il prof sarà contento :P
> Per quale motivo dovresti usare una struttura?
> _______________________________________________

Il problema è che la funzione deve restituire o modificare i due valori in
modo che ciò sia visibile in seguito alla sua chiamata.
Questa soluzione non farebbe altro che modificare due variabili locali, che
poi dovrebbero essere ritornate per valore. Ma come fare per tornare due
valori in C?

Propongo alcune soluzioni per la restituzione dei valori:
1) Allocare dinamicamente un array di dimensione 2 dentro alla funzione che
risolve l'equazione e ritornare il nome di tale array (che in C è
l'indirizzo del primo elemento) -> ricordarsi poi di liberare la memoria in
seguito.
2) Utilizzare una struttura coi due campi creata dentro alla funzione, in
maniera statica o in maniera dinamica (con puntatore), e ritornare tale
struttura (per valore se dichiarata statica o per puntatore nell'altro
caso) -> nel secondo caso liberare poi la memoria.
La puoi tornare anche per valore, al contrario di un array, poichè il nome
della struttura è a tutti gli effetti un riferimento a tutta la struttura in
memoria, mentre il nome dell'array è un preciso riferimento al suo primo
elemento, quindi .... un puntatore.
3)Qualora si volesse evitare di restituire i valori, beh ci sono tante altre
soluzioni. Per esempio passare per riferimento (tramite puntatori) i due
campi "soluzione" alla funzione e "riempirli" poi, oppure passare un array
da riempire o una struttura per riferimento.
Vedi tu.

Io se dovessi scegliere, dato che è più ordinato e performante passare pochi
parametri alle funzioni, opterei per l'allocazione dinamica dell'array e la
restituzione del suo indirizzo. Quando non serve più libererai la memoria.
Ciao!



Maggiori informazioni sulla lista FoLUG