Newsgroup: it.comp.lang.c
Titolo: funzione ricorsiva che riceve un puntatore incrementato

Buongiorno a tutto il NG.
Proseguendo i miei esercizi in C, ho da scrivere un programma (ve lo
riporto) con una funzione ricorsiva che accetti in ingresso n valori e
ne restituisca la somma.
Ora però la funzione void somma ( int *p) non "passa" dal compilatore,
ma non capisco il perchè. Il conquibus sta qui credo:
{*p++;
totale=*p+somma(++p);
}
ho messo ++p perchè deve passare alla funz ricorsiva il posto in
memoria di int *p (non quindi passare un nuovo contenuto del
puntatore, cioè *++p) , giusto?
Ma cosa sbaglio? Grazie.
#include <stdio.h>
void somma ( int *);
int totale, ele_array;
int main()
{
int x, n, *p;
printf("Quanti numeri da sommare? ");
scanf("%d",&ele_array);
int numeri[ele_array];
for (x=0; x<ele_array; x++){
	printf("Numero n.%d: ",x+1);
	scanf ("%d",&n);
	numeri[x]=n;
	}
somma(&numeri[0]);
}
void somma ( int *p)
{
printf("\n%d\n",ele_array);
while (*p!='\0')
	{*p++;
	totale=*p+somma(++p);
	}
}

 }
io riscriveri somma così (in cui n è il numero di elementi dell'array):
int somma(int *p, int n) {
    if (n > 0)
       return *p+somma(++p, --n);
    else return 0;
}
ciao.

 return *p+somma(++p, --n);
No, questa espressione viola la regola dello standard che stabilisce che 
prima di un sequence-point il valore precedente a una modifica può essere 
utilizzato solo per determinare il valore che deve essere memorizzato, 
mentre nell'espressione in questione viene usato due volte (in '*p' e in 
'++p'). 
Così è meglio:
 return *p + somma( p + 1, n - 1 );
Max

 }
Grazie della risposta.
Ma *p+somma non è ancora quello che sopra mi avevi segnalto "stai
sommando un int e un void"?
Ho poi provato come dici ma mi da una serie di errori a cui non so
porre soluzione:
es2.c:15: error: void value not ignored as it ought to be
es2.c: At top level:
es2.c:19: error: conflicting types for `somma'
es2.c:2: error: previous declaration of `somma'
Ovviamente ho cambiato in alto  void somma ( int *, int);
Ti copio e incollo il listato, magari riesci a darmi una soluzione.
Ciaoo....
#include <stdio.h>
void somma ( int *, int);
int totale;
int main()
{
int x, n, *p, ele_array, ris;
printf("Quanti numeri da sommare? ");
scanf("%d",&ele_array);
int numeri[ele_array];
for (x=0; x<ele_array; x++){
	printf("Numero n.%d: ",x+1);
	scanf ("%d",&n);
	numeri[x]=n;
	}
ris=somma(&numeri[0], ele_array);
printf("%d",ris);
}
int somma(int *p, int n) {
    if (n > 0)
       return *p + somma( p+1, n-1 );
    else return 0;
}

 Ovviamente ho cambiato in alto  void somma ( int *, int);
ma non hai cambiato il prototipo di somma (seconda riga) :)
ciao.

 int numeri[ele_array];
Se questo e' "C", le definizioni vanno ad inizio blocco. Prima
di 
int numeri[ele_array];
c'e' una istruzione.
ele_array deve essere noto PRIMA della compilazione (a meno che tu non
stia usando un compilatore C99, cosa improbabile visto l'errore).
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 ciao.
Mi sento veramente stupido a confronto di molti di voi in questo NG. A
volte credo che il C non sia proprio il mio pane. Ma devo impararlo.
Mi date le soluzioni, le provo, ma ancora non funziona.
Ho fatto quello che dici, ma ancora errori. Alla riga 9 per esempio
(error C2143: syntax error : missing ';' before 'type')
ma guardando quella riga, non vedo niente di sbagliato.
#include <stdio.h>
int somma ( int *, int);
int totale;
int main()
{
int x, n, *p, ele_array, ris;
printf("Quanti numeri da sommare? ");
scanf("%d",&ele_array);
int numeri[ele_array];
	for (x=0; x<ele_array; x++){
	printf("Numero n.%d: ",x+1);
	scanf ("%d",&n);
	numeri[x]=n;
	}
ris=somma(&numeri[0], ele_array);
printf("%d",ris);
}
int somma(int *p, int n) {
    if (n > 0)
       return *p+somma(p+1,n+1);
    else return 0;
}

 ma guardando quella riga, non vedo niente di sbagliato.
intanto scusa perchč ho sbagliato a riportarti la chiamata ricorsiva a 
somma che correttamente č: *p+somma(p+1,n-1);
cmq, a me cosě come l'hai riportato il codice compila senza errori.
ciao.

 
Come è possibile?  A me da 7 errori il compilatore e 2 warning:
prova.obj - 7 error(s), 2 warning(s)
#include <stdio.h>
int somma ( int *, int);
int totale;
int main()
{
int x, n, *p, ele_array, ris;
printf("Quanti numeri da sommare? ");
scanf("%d",&ele_array);
int numeri[ele_array];
for (x=0; x<ele_array; x++){
printf("Numero n.%d: ",x+1);
scanf ("%d",&n);
numeri[x]=n;
}
ris=somma(&numeri[0], ele_array);
printf("%d",ris);
}
//funzione che mi somma ricorsivamente i numeri introdotti
int somma(int *p, int n) {
if (n > 0)
return *p+somma(p+1,n-1);
else return 0;
}
-- 
Inviato da Virgilio 
http://newsgroup.virgilio.it
..un servizio di news via web con in piu' l'antispam

 
http://www.Mailgate.ORG


 il compilatore), forse è questo il motivo?
Direi che e' altamente probabile... :-)
C:\>iao Angelo

 int numeri[ele_array];
credo che il problema stia in quest'ultima riga: non puoi dichiarare una 
variabile quando ti fa comodo e non puoi usare come dimensione di un 
array un dato preso a runtime (almeno nel c ansi). probabilmente il mio 
compilatore (gcc 3.4.2) è meno schizzinoso e supporta queste estensioni.
ciao.

...
