PDA

Visualizza la versione completa : c - conservazione del valore delle variabili


Bloody3000
09-04-2004, 21:59
Ciao! Allora il problema del compilatore è risolto :D
ne sorge uno didattico, e come al solito mi appello alla vostra saggezza....
Ovvero, io ho una procedura ricorsiva, tipo

int faiqualcosa(mio *uno)
{ static int ris = 0;
if (.....)
return ris;
if (...............)
return ++ris;
if (...) faiqualcosa(mio *altro)
else faiqualcosa(mio *altroaltro) }

e la prima volta il risultato è corretto, perchè static conserva il valore della variabile ris anche tra + di una chiamata della funzione a cui appartiene, e questo va bene nella ricorsione.
Solo che lo conserva anche quando richiamo faiqualcosa anche in altre parti del programma con parametri diversi!!
Qualcuno sa un tipo di dato o un algoritmo x poter avere zero come valore di ris in partenza anche quando chiamo faiqualcosa non da se stessa e non per la prima volta?
Grazie10000!

PunkIvi
10-04-2004, 11:19
Static lì non serve. dichiarala normalmente. E' chiaro che se la metti static te la conserva anche fuori da quella funzione. Per usare la ricorsione non serve static.

Bloody3000
10-04-2004, 12:00
all'inizio avevo fatto così... poi ho visto che ad ogni chiamata ricorsiva veniva
ridefinito il valore della variabile risettandola a zero e rovinando tutto!
o magari l'errore era altrove?

Shores
10-04-2004, 12:13
Originariamente inviato da PunkIvi
Static lì non serve. dichiarala normalmente. E' chiaro che se la metti static te la conserva anche fuori da quella funzione. Per usare la ricorsione non serve static.

Non sono daccordo: per la ricorsione può essere indispensabile avere variabili statiche, ma...

Dipende dall'algoritmo!

Se non ci spieghi l'algoritmo del tuo codice, o almeno non ce lo fai vedere completo, è difficil e che ti si possa aiutare...

:)

Shores
10-04-2004, 12:18
Più che altro: ci sarà di certo un momento in cui la tua funzione ricorsiva decide di non effettuare un'altra ricorsione: in quel momento devi anche azzerare la variabile statica.

Ciao!

Bloody3000
10-04-2004, 12:56
i nodi fanno parte di un albero binario
int controlla (nodo *r, nodo *s)
{ static int ris = 0;

if ( s == foglia )
return ris;

if (!(possibile(r,s)))
{ ris = ris + (s->filtro.ph.y);
return ris; }

if (r->lx > s->max)
{
controlla(r,s->right); }
else {
controlla(r,s->left);
controlla(r,s->right); }
}

Shores
10-04-2004, 13:18
Prova così:



int controlla (nodo *r, nodo *s)
{
static int ris = 0;
int ris2 = 0;

if ( s == foglia )
{
ris2=ris;
ris=0;
return ris2;
}

if (!(possibile(r,s)))
{
ris = ris + (s->filtro.ph.y);
return ris;
}

if (r->lx > s->max)
{
controlla(r,s->right);
}
else
{
controlla(r,s->left);
controlla(r,s->right);
}

}


Ciao!

Bloody3000
10-04-2004, 13:54
FUNZIONA!!!
grazie!!!!!!!!

off topic: ti offro una birra!

Shores
10-04-2004, 19:44
Di nulla!

Loading