Newsgroup: it.comp.lang.c
Titolo: Falla mentale :)

Non riesco a comprendere bene il funzionamento di questo semplice
programma:
#include <stdio.h>
#define SIZE 10
void function (int[], int);
int main (void)
{
  int a[SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  function (a, SIZE);
  printf ("\n");
  return 0;
}
function (int b[], size)
{
  if (size > 0)
  {
    function (&b[1], size - 1);
    printf ("%d ", b[0]);
  }
}
Ho capito a cosa serve (ma va? l'ho compilata e avviata :p) ma il
meccanismo della funzione ricorsiva mi è ancora oscuro. Come si risolve?
Grazie per l'attenzione :)
Nicholas
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Grazie per l'attenzione :)
nel seguente modo
function -> 1,2,3,4,5,6,7,8,9,10 | 10
function -> 2,3,4,5,6,7,8,9,10 | 9
di volta in volta il programma passa per reference l'elemento
successivo dell'array nella funzione ricorsiva, fino ad arrivare a 10
| 0
cosě stampa tutto al contrario
Antonio

 
Dubito che tu sia riuscito a compilare questo sorgente: ci sono alcuni errori
come ad esempio la dichiarazione della funzione void:
apparte che le due dichiarazioni della funzione function non coincidono,
ma poi la seconda dovrebbe essere tipo
void function(int b[], int size);
La funzione ricorsiva dovrebbe avere piu o meno questo funzionamento
La prima chiami la function con size a valore 10 e l'array contenente
valori da 10-0. Dopodiche, function, prima ancora di stampare a schermo
b[0] (che in questo caso sarebbe uguale a 0), richiama sè stessa,
passando in size il valore 9, e nell'array i valori da 10 a 1.
Ancora, poichè size è maggiore di 0 (è 9) prima di stampare b[0] che ora
è uguale a 1, richiama sè stessa passando size=8 e array[da 10 a 2].
Questo per 11 volte, fino a che  size è uguale
a 0. A questo punto il controllo ritorna alla decima chiamata che
stamperà b[0] che è uguale a 10; poi tornerà alla nona chiamata che
stamperà 9.. e così via fino alla prima chiamata che aveva nel valore
b[0] il valore 0. A questo punto il controllo torna al main che stampa
"\n" e termina.
Ciao
Matic

Ho postato velocemente appena arrivato in ufficio :) Gli errori sono
dovuti alla fretta, sul mio computer č esatta :p
Grazie :)


Scusate tutti se riposto...
Void nella seconda dichiarazione č una dimenticanza ma cosa intendi
esattamente quando dici che le due dichiarazioni non coincidono?
Da quello che so io senza testo alla mano (quindi non sono sicuro...) il
prototipo di funzione puň benissimo essere generale:
void function (int[], int)
mentre la dischiarazione vera e propria della finzione deve essere piů
dettagliata e devo nominare gli elementi:
void function (b[], size)
E' forse sbagliato?? Perchč?
Grazie dell'aiuto anche ad Antonio ^^


 
non so quello che sai tu e non so se quello che so io č giusto, ma so
quello chi mi dice il compilatore compilando quel file:
acaca.c:17: parse error before `size'
acaca.c: In function `function':
acaca.c:18: number of arguments doesn't match prototype
acaca.c:4: prototype declaration
acaca.c:19: `size' undeclared (first use in this function)
acaca.c:19: (Each undeclared identifier is reported only once
acaca.c:19: for each function it appears in.)
acaca.c:21: `b' undeclared (first use in this function)
che si risolve alla riga 17 sostituendo:
void function(int b[], size);
con:
void function(int b[], int size);
cmq noto ora che come dici tu il prototipo di funzione puň essere
generale ma quando arrivi a dichiari devi scrivercelo quello che č size,
senno non lo riconosce... immagino..
Ciauz
------------------------------------------------------
... in a world far away, we may meet again ..."
------------------------------------------------------

 Ciauz
Ciao e grazie
Nicholas


Dal D&D si evince che i prototipi di funzione non devono recare il nome
delle variabili, tale compito č riservato alle definizioni vere e proprie.
Questo almeno č quanto ho capito io dal testo di cui sopra.
Ciao
Claudio