Newsgroup: it.comp.lang.c
Titolo: non capisco l'errore

ciao a tutti,
compilando questo programma in c :
#include <stdio.h>
#define ENUF(msg,value){perror(msg); exit(value);}
int main(int argc, char* argv[])
{
	int status, waitID, procID;
	if(argc==1) ENUF("Usage:DEMO command\n",1);
	if ((procID==fork())==-1)
		ENUF("can not fork",100);
else if (procID==0)
{	//CHILD code
	if (execvp(argv[1], &argv[1])==-1)
		ENUF("can not exec",101);
}
else
{	//PARENT code
	waitID=wait(&status);
	if (waitID==-1)
		ENUF("no child",102);
	else if (waitID==procID)
		{
		fprintf(stderr,"Returned exit value ;%d", (status >>8) & 
0377);
		fprintf(stderr,"exit status: %d\n", status&0377);
}			
}	
}
mi da' il seguente errore :
ese.c: In function `main':
ese.c:15: parse error before `else'
ese.c: At top level:
ese.c:19: parse error before `}'
ese.c:24: parse error before `102'
ese.c:24: warning: data definition has no type or storage class
ese.c:29: parse error before string constant
ese.c:29: warning: data definition has no type or storage class
il listato e' copiato integralmente dalle dispense di un prof di roma3 
ma non riesco a farlo girare
mi dareste una mano a scovare cosa c'e' di sbagliato
inoltre mi potreste spiegare questo??
fprintf(stderr,"Returned exit value ;%d", (status >>8) & 0377);
fprintf(stderr,"exit status: %d\n", status&0377);
status dovrebbe essere il valore che mi ritorna la wait
perche' se ne fa un and bit a bit con 0377 e perche' prima di fare 
questo lo redirige verso 8????
grazie molte

 questo lo redirige verso 8????
"Redirige"? L'operatore '>>' in C non ha nulla a che vedere con quello 
delle varie shell e non significa quindi "redirezione con inserimento in 
coda" ma "shift verso destra" del contenuto dell'operando sinistro di 
tante posizioni (bit) quante ne indica l'operando destro.
In pratica, quello che accade nella printf() e` lo spostamento della 
parola alta della variabile status in quella bassa e poi un recupero 
degli otto bit cosi` ottenuti (0377 e` uguale a 0xff), come dire che 
servono solo gli otto bit piu` a sinistra di status, qualsiasi cosa cio` 
implichi nel contesto del tuo programma.
-- 
Baci,
Mony

 procID==fork() sara` uguale a '-1'. 
Leggasi: "la variabile procID non e` inizializzata, quindi difficilmente 
  sara` uguale al valore ritornato da fork() e comunque mai 
l'espressione logica procID==fork() sara` uguale a -1".
-- 
Baci,
Mony

 parentesi graffa il compilatore non lo digerisce.
purtoppo nel codice di partenza e' definita come macro, quindi la vorrei 
compilare come macro
mi sapresti dire la sintassi esatta per fargli eseguire cio' che non fa?
cosa significa "si espande come un blocco anonimo??"
per il resto sei stato chiarissimo
grazie

 cosa significa "si espande come un blocco anonimo??"
Significa che, per esempio, la linea
	if(argc==1) ENUF("Usage:DEMO command\n",1);
diventa, dopo il passaggio del preprocessore,
	if(argc==1) {perror( "Usage:DEMO command\n" ); exit( 1 );} ;
(ossia un blocco di codice anonimo) ed il punto e virgola finale e` un 
errore. Le possibili soluzioni sono:
1. Inserire direttamente il codice dove serve:
	if(argc==1) {
	  fputs("Usage:DEMO command\n",stderr);
	  exit(1);
	}
2. Sostituire la macro con una funzione:
	void
	enuf(const char *msg,int exitval)
	{
	  fputs(msg,stderr);
	  exit(exitval);
	}
3. Non terminare con il punto e virgola gli statement che richiamino la 
macro ENUF:
	if(argc==1) ENUF("Usage:DEMO command\n",1)
Scegli tu. Le mie personali preferenze sono evidenziate dall'ordine in 
cui ti ho proposto le soluzioni. ;)
-- 
Baci,
Mony

 cui ti ho proposto le soluzioni. ;)
ho scelto la 3 perche' mi ero intestardito a far funzionare la macro,
ora funziona :)
che differenza c'e' tra la 1 e la 3?
con la 3 (credo) delego al preprocessore l'inserimento di quelle 
istruzioni,
che svantaggi ha la cosa?
grazie 

 che svantaggi ha la cosa?
Nessuno. A parte il fatto che non ti si sarebbe presentato l'errore. ;)
-- 
Baci,
Mony

 implichi nel contesto del tuo programma.
wait()  mette il  valore di  ritorno negli  otto bit  meno significativi
della variabile passata. Quello  presentato e` un modo  non portabile (e
sbagliato per  x86, visto che  e` little endian). Il metodo  corretto e`
usare WIFEXITED() sulla variabile per sapere se il child e` terminato in
modo normale e WEXITSTATUS() per recuperare il valore d'uscita.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
"Chi parla in tono cortese, ma continua a prepararsi, potra` andare avanti;
 chi parla in tono bellicoso e avanza rapidamente dovra` ritirarsi" 
Sun Tzu -- L'arte della guerra

 ha scritto nel messaggio

macro ENUF:
[...]
4. (brutta, ma funziona) Cambiare la macro:
#define ENUF(msg, n)    do {perror(msg); exit(n); } while (0)
-- 
Saluti,
    Mardy
http://castellina.org/interlingua

#define ENUF(msg, n)    do {perror(msg); exit(n); } while (0)
Il Kernel di Linux insegna :)
-- 
Mox
"Trust the programmer."
"Don't prevent the programmer from doing what needs to be done."
"Keep the language small and simple."
"Provide only one way to do an operation."