Oppure

Loading
22/07/12 14:15
Umberto
la shell mi da segmentation fault se eseguo questo codice
if(strcmp(argv[iargv],"cond")==0){
		printf("cond");
		iargv= iargv + 1;
		if(strcmp(argv[iargv],"%")==0){
			//printf("varone");
			iargv++;
			if(strcmp(argv[iargv],"==")==0){
				while(strcmp(argv[iargv],vname[tvar])!=0){
						tvar++;
				}
				iargv++;
				for(fori = 0;strcmp(argv[iargv],vname[fori])!=0;fori++){
				}
				if(strcmp(var[tvar],var[fori])==0){
						goto ifgo;
				}
				else{
					iargv++;
					while(strcmp(argv[iargv],"done")!=0){
						iargv++;
					}
				}
			}

		}

la gdb mi dice:
Program received signal SIGSEGV, Segmentation fault.
0x0024d01b in ?? () from /lib/i386-linux-gnu/libc.so.6

:-?
Ultima modifica effettuata da Umberto 22/07/12 14:15
aaa
22/07/12 14:58
nessuno
Devi fornire tutto il codice per capire cosa non va. Se non è possibile compilarlo, come si prova?

Mancano tutte le dichiarazioni delle variabili ...

Posta tutto il main e dicci come si dovrebbe usare e in quali condizioni hai avuto l'errore.

Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
22/07/12 15:09
Umberto
certo scusa :
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc,char *argv[]){
	char vname[1000][1000];
	char var[1000][1000]; 
	char fname[1000][1000];
	char fun[1000][1000];
	char elecom[1000];
	char eldo[100];
	int ifun = 0;
	int tfun = 0;
	int ivar = 0;
	int ivar1=0;
	int iargv = 0;
	int iargv1 = 0;
	int tvar = 0;
	int tvar1;
        int iargv2 = 0;
	int point = 0;
	int mate1 = 0;
	int mate2 = 0;
	int materes = 0;
	int inf = 0;
	int fori;
	normalgo:
        while (inf==0){
        tvar = 0;
	iargv=iargv+1;
	if(strcmp(argv[iargv],"end")==0){
		goto endgo;
	}
	/*if(strcmp(argv[iargv],"mate")==0){
		iargv = iargv + 1;
		if(strcmp(argv[iargv],"%")==0){
		}
		else {
		}
	}*/
	
	if(strcmp(argv[iargv],"dif")==0){

		iargv=iargv+1;
		stpcpy(fname[ivar],argv[iargv]);
     		iargv1=iargv+1;
		stpcpy(fun[ivar],argv[iargv1]);
		ifun=ifun+1;
		iargv = iargv1;	

		}
	if(strcmp(argv[iargv],"fun")==0){

		iargv++;
		while(strcmp(argv[iargv],fname[tfun])!=0){
				tfun++;
		}
		//printf("%s", fun[tfun]);
		strcpy(elecom,"base");
		strcpy(elecom,fun[tfun]);
		iargv++;
		strcat(elecom, argv[iargv]);
		system(elecom);			
		}
 	if(strcmp(argv[iargv],"var")==0){
		
		iargv=iargv+1;
		stpcpy(vname[ivar],argv[iargv]);
     		iargv1=iargv+1;
		stpcpy(var[ivar],argv[iargv1]);
		ivar1=ivar+1;
		iargv = iargv1;
		
		//printf("%s\n",vname[ivar]);
		//printf("%s\n",var[ivar]);
		}
	if(strcmp(argv[iargv],"echo")==0){
		
		//printf("in");
		iargv++;
		if (strcmp(argv[iargv],"%")==0){
                
			iargv++;
			while(strcmp(argv[iargv],vname[tvar])!=0){
				tvar++;
			}
		printf("%s\n",var[tvar]);

		}
		else {
			printf("%s\n", argv[iargv]);
		}
		}
	if(strcmp(argv[iargv],"kin")==0){
		printf("\n");
		tvar1 = 0;
		iargv++;
		while(strcmp(argv[iargv],vname[tvar])){

  				tvar1++;
				
			}
		
		scanf("%s",var[tvar1]);
	}
	if(strcmp(argv[iargv],"write")==0){
		
		FILE *fp;
		iargv++;
		fp = fopen(argv[iargv],"w+");
		iargv++;
		if (strcmp(argv[iargv],"%")==0){
		iargv++;
		while(strcmp(argv[iargv],vname[tvar])!=0){
				tvar++;
			}
		fprintf(fp,"%s",var[tvar]);
		}
		else {
			fprintf(fp,"%s",argv[iargv]);
		}
	}
	if(strcmp(argv[iargv],"sys")==0){
		iargv++;
		if (strcmp(argv[iargv],"%")==0){
		iargv++;
		while(strcmp(argv[iargv],vname[tvar])!=0){
				tvar++;
			}
		system(var[tvar]);
		}
		else {
			system(argv[iargv]);
		}
	}
	if(strcmp(argv[iargv],"read")==0){
		
		//printf("in");
		iargv++;
		while(strcmp(argv[iargv],vname[tvar])!=0){
				tvar++;
			}
		iargv++;
		point = atoi(argv[iargv]);
		iargv++;
		FILE *read = fopen(argv[iargv],"r");
		fgets(var[tvar],point,read);
		}
        if(strcmp(argv[iargv],"cond")==0){
		printf("cond");
		iargv= iargv + 1;
		/* quando tento di eseguire 
			Program received signal SIGSEGV, Segmentation fault.
                        0x0024d01b in ?? () from /lib/i386-linux-gnu/libc.so.6
		*/
		if(strcmp(argv[iargv],"%")==0){
			//printf("varone");
			iargv++;
			if(strcmp(argv[iargv],"==")==0){
				while(strcmp(argv[iargv],vname[tvar])!=0){
						tvar++;
				}
				iargv++;
				for(fori = 0;strcmp(argv[iargv],vname[fori])!=0;fori++){
				}
				if(strcmp(var[tvar],var[fori])==0){
						goto ifgo;
				}
				else{
					iargv++;
					while(strcmp(argv[iargv],"done")!=0){
						iargv++;
					}
				}
			}

		}
		//OK
		if(strcmp(argv[iargv],"$")==0){
			//printf("notvarone");
			iargv++;
			if(strcmp(argv[iargv],"==")==0){
				iargv++;
				//printf("in1");
				while(strcmp(argv[iargv],vname[tvar])!=0){
					tvar++;
				}
				iargv++;
				if(strcmp(var[tvar],argv[iargv])==0){
						goto ifgo;
				}
				else{
				iargv++;
				while(strcmp(argv[iargv],"done")!=0){
						iargv++;
						}
				}
			}
		}              

 	}
}
ifgo:
while (inf==0){
        tvar = 0;
	iargv=iargv+1;
	/*if(strcmp(argv[iargv],"mate")==0){
		iargv = iargv + 1;
		if(strcmp(argv[iargv],"%")==0){
		}
		else {
		}
	}*/
	/*if(strcmp(argv[iargv],"div")==0){

		iargv++;
		while(strcmp(argv[iargv],vname[tvar])!=0){
				tvar++;
		}
		iargv++;
	    	ptr = getevn(argv[iargv]);
		}
	*/
	if(strcmp(argv[iargv],"dif")==0){

		iargv=iargv+1;
		stpcpy(fname[ivar],argv[iargv]);
     		iargv1=iargv+1;
		stpcpy(fun[ivar],argv[iargv1]);
		ifun=ifun+1;
		iargv = iargv1;	

		}
	if(strcmp(argv[iargv],"fun")==0){

		iargv++;
		while(strcmp(argv[iargv],fname[tfun])!=0){
				tfun++;
		}
		//printf("%s", fun[tfun]);
		strcpy(elecom,"base");
		strcpy(elecom,fun[tfun]);
		iargv++;
		strcat(elecom, argv[iargv]);
		system(elecom);			
		}
 	if(strcmp(argv[iargv],"var")==0){
		
		iargv=iargv+1;
		stpcpy(vname[ivar],argv[iargv]);
     		iargv1=iargv+1;
		stpcpy(var[ivar],argv[iargv1]);
		ivar1=ivar+1;
		iargv = iargv1;
		
		//printf("%s\n",vname[ivar]);
		//printf("%s\n",var[ivar]);
		}
	if(strcmp(argv[iargv],"echo")==0){
		
		//printf("in");
		iargv++;
		if (strcmp(argv[iargv],"%")==0){
                
			iargv++;
			while(strcmp(argv[iargv],vname[tvar])!=0){
				tvar++;
			}
		printf("%s\n",var[tvar]);

		}
		else {
			printf("%s\n", argv[iargv]);
		}
		}
	if(strcmp(argv[iargv],"kin")==0){
		printf("\n");
		tvar1 = 0;
		iargv++;
		while(strcmp(argv[iargv],vname[tvar])){

  				tvar1++;
				
			}
		
		scanf("%s",var[tvar1]);
	}
	if(strcmp(argv[iargv],"write")==0){
		
		FILE *fp;
		iargv++;
		fp = fopen(argv[iargv],"w+");
		iargv++;
		if (strcmp(argv[iargv],"%")==0){
		iargv++;
		while(strcmp(argv[iargv],vname[tvar])!=0){
				tvar++;
			}
		fprintf(fp,"%s",var[tvar]);
		}
		else {
			fprintf(fp,"%s",argv[iargv]);
		}
	}
	if(strcmp(argv[iargv],"sys")==0){
		iargv++;
		if (strcmp(argv[iargv],"%")==0){
		iargv++;
		while(strcmp(argv[iargv],vname[tvar])!=0){
				tvar++;
			}
		system(var[tvar]);
		}
		else {
			system(argv[iargv]);
		}
	}
	if(strcmp(argv[iargv],"read")==0){
		
		//printf("in");
		iargv++;
		while(strcmp(argv[iargv],vname[tvar])!=0){
				tvar++;
			}
		iargv++;
		point = atoi(argv[iargv]);
		iargv++;
		FILE *read = fopen(argv[iargv],"r");
		fgets(var[tvar],point,read);
		}
	if(strcmp(argv[iargv],"done")==0){
			goto normalgo;
	}
        if(strcmp(argv[iargv],"cond")==0){
		iargv++;
		if(strcmp(argv[iargv],"%")==0){

		}
		if(strcmp(argv[iargv],"$")==0){
			iargv++;
			if(strcmp(argv[iargv],"==")==0){
				iargv++;
				//printf("in1");
				while(strcmp(argv[iargv],vname[tvar])!=0){
					tvar++;
				}
				iargv++;
				if(strcmp(var[tvar],argv[iargv])==0){
						goto ifgo;
				}
			}
		}              

 	}
}
endgo:
printf("%s\n",argv[1]);
return 0;
}

Errore se :
./main Fine var a b var b b cond % ==  a b echo hello done end
aaa
22/07/12 15:48
nessuno
Il problema sta nel ciclo

while(strcmp(argv[iargv],vname[tvar])!=0){
                                                tvar++;
                                }


che non si conclude mai. Ovviamente, aumentando sempre tvar, finisci per andare oltre il valore massimo di 1000 e sfondare in memoria ...

Inoltre, esistono delle chiamate a stpcpy ovviamente sbagliate (devono essere strcpy ... come fa a compilare?).

E infine tutti quegli array sfondano lo stack ... dovrebbero essere allocate staticamente fuori dal main o dinamicamente.

P.S. Per fare analisi sintattica ci sono regole precise e algoritmi standard ... facendo un codice del genere - che addirittura usa dei goto - potresti avere tantissimi problemi.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
22/07/12 16:09
Umberto
io ho ricompilato il programma per non fare andare al infinito il while e sfondare la memoria ma l' errore persiste.
aaa
22/07/12 16:11
nessuno
Scusa Umberto ma se scrivi solamente questo non so cosa dirti.

Ovviamente devi dire come hai modificato il codice ...
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
22/07/12 16:15
Umberto
ho incrementato la variabile iargv
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char vname[1000][1000];
char var[1000][1000]; 
char fname[1000][1000];
char fun[1000][1000];
char elecom[1000];
char eldo[100];
int ifun = 0;
int tfun = 0;
int ivar = 0;
int ivar1=0;
int iargv = 0;
int iargv1 = 0;
int tvar = 0;
int tvar1;
int iargv2 = 0;
int point = 0;
int mate1 = 0;
int mate2 = 0;
int materes = 0;
int inf = 0;
int fori;
int main(int argc,char *argv[]){
	normalgo:
        while (inf==0){
        tvar = 0;
	iargv=iargv+1;
	if(strcmp(argv[iargv],"end")==0){
		goto endgo;
	}
	/*if(strcmp(argv[iargv],"mate")==0){
		iargv = iargv + 1;
		if(strcmp(argv[iargv],"%")==0){
		}
		else {
		}
	}*/
	
	if(strcmp(argv[iargv],"dif")==0){

		iargv=iargv+1;
		stpcpy(fname[ivar],argv[iargv]);
     		iargv1=iargv+1;
		stpcpy(fun[ivar],argv[iargv1]);
		ifun=ifun+1;
		iargv = iargv1;	

		}
	if(strcmp(argv[iargv],"fun")==0){

		iargv++;
		while(strcmp(argv[iargv],fname[tfun])!=0){
				tfun++;
		}
		//printf("%s", fun[tfun]);
		strcpy(elecom,"base");
		strcpy(elecom,fun[tfun]);
		iargv++;
		strcat(elecom, argv[iargv]);
		system(elecom);			
		}
 	if(strcmp(argv[iargv],"var")==0){
		
		iargv=iargv+1;
		stpcpy(vname[ivar],argv[iargv]);
     		iargv1=iargv+1;
		stpcpy(var[ivar],argv[iargv1]);
		ivar1=ivar+1;
		iargv = iargv1;
		
		//printf("%s\n",vname[ivar]);
		//printf("%s\n",var[ivar]);
		}
	if(strcmp(argv[iargv],"echo")==0){
		
		//printf("in");
		iargv++;
		if (strcmp(argv[iargv],"%")==0){
                
			iargv++;
			while(strcmp(argv[iargv],vname[tvar])!=0){
				tvar++;
			}
		printf("%s\n",var[tvar]);

		}
		else {
			printf("%s\n", argv[iargv]);
		}
		}
	if(strcmp(argv[iargv],"kin")==0){
		printf("\n");
		tvar1 = 0;
		iargv++;
		while(strcmp(argv[iargv],vname[tvar])){

  				tvar1++;
				
			}
		
		scanf("%s",var[tvar1]);
	}
	if(strcmp(argv[iargv],"write")==0){
		
		FILE *fp;
		iargv++;
		fp = fopen(argv[iargv],"w+");
		iargv++;
		if (strcmp(argv[iargv],"%")==0){
		iargv++;
		while(strcmp(argv[iargv],vname[tvar])!=0){
				tvar++;
			}
		fprintf(fp,"%s",var[tvar]);
		}
		else {
			fprintf(fp,"%s",argv[iargv]);
		}
	}
	if(strcmp(argv[iargv],"sys")==0){
		iargv++;
		if (strcmp(argv[iargv],"%")==0){
		iargv++;
		while(strcmp(argv[iargv],vname[tvar])!=0){
				tvar++;
			}
		system(var[tvar]);
		}
		else {
			system(argv[iargv]);
		}
	}
	if(strcmp(argv[iargv],"read")==0){
		
		//printf("in");
		iargv++;
		while(strcmp(argv[iargv],vname[tvar])!=0){
				tvar++;
			}
		iargv++;
		point = atoi(argv[iargv]);
		iargv++;
		FILE *read = fopen(argv[iargv],"r");
		fgets(var[tvar],point,read);
		}
        if(strcmp(argv[iargv],"cond")==0){
		printf("cond");
		iargv= iargv + 1;
		/* quando tento di eseguire 
			Program received signal SIGSEGV, Segmentation fault.
                        0x0024d01b in ?? () from /lib/i386-linux-gnu/libc.so.6
		*/
		if(strcmp(argv[iargv],"%")==0){
			//printf("varone");
			iargv++;
			if(strcmp(argv[iargv],"==")==0){
				iargv++;
				for(tvar = 0;strcmp(argv[iargv],vname[tvar])!=0;tvar++){
				}
				iargv++;
				for(fori = 0;strcmp(argv[iargv],vname[fori])!=0;fori++){
				}
				if(strcmp(var[tvar],var[fori])==0){
						goto ifgo;
				}
				else{
					iargv++;
					while(strcmp(argv[iargv],"done")!=0){
						iargv++;
					}
				}
			}

		}
		//OK
		if(strcmp(argv[iargv],"$")==0){
			//printf("notvarone");
			iargv++;
			if(strcmp(argv[iargv],"==")==0){
				iargv++;
				//printf("in1");
				while(strcmp(argv[iargv],vname[tvar])!=0){
					tvar++;
				}
				iargv++;
				if(strcmp(var[tvar],argv[iargv])==0){
						goto ifgo;
				}
				else{
				iargv++;
				while(strcmp(argv[iargv],"done")!=0){
						iargv++;
						}
				}
			}
		}              

 	}
}
ifgo:
while (inf==0){
        tvar = 0;
	iargv=iargv+1;
	/*if(strcmp(argv[iargv],"mate")==0){
		iargv = iargv + 1;
		if(strcmp(argv[iargv],"%")==0){
		}
		else {
		}
	}*/
	/*if(strcmp(argv[iargv],"div")==0){

		iargv++;
		while(strcmp(argv[iargv],vname[tvar])!=0){
				tvar++;
		}
		iargv++;
	    	ptr = getevn(argv[iargv]);
		}
	*/
	if(strcmp(argv[iargv],"dif")==0){

		iargv=iargv+1;
		stpcpy(fname[ivar],argv[iargv]);
     		iargv1=iargv+1;
		stpcpy(fun[ivar],argv[iargv1]);
		ifun=ifun+1;
		iargv = iargv1;	

		}
	if(strcmp(argv[iargv],"fun")==0){

		iargv++;
		while(strcmp(argv[iargv],fname[tfun])!=0){
				tfun++;
		}
		//printf("%s", fun[tfun]);
		strcpy(elecom,"base");
		strcpy(elecom,fun[tfun]);
		iargv++;
		strcat(elecom, argv[iargv]);
		system(elecom);			
		}
 	if(strcmp(argv[iargv],"var")==0){
		
		iargv=iargv+1;
		stpcpy(vname[ivar],argv[iargv]);
     		iargv1=iargv+1;
		stpcpy(var[ivar],argv[iargv1]);
		ivar1=ivar+1;
		iargv = iargv1;
		
		//printf("%s\n",vname[ivar]);
		//printf("%s\n",var[ivar]);
		}
	if(strcmp(argv[iargv],"echo")==0){
		
		//printf("in");
		iargv++;
		if (strcmp(argv[iargv],"%")==0){
                
			iargv++;
			while(strcmp(argv[iargv],vname[tvar])!=0){
				tvar++;
			}
		printf("%s\n",var[tvar]);

		}
		else {
			printf("%s\n", argv[iargv]);
		}
		}
	if(strcmp(argv[iargv],"kin")==0){
		printf("\n");
		tvar1 = 0;
		iargv++;
		while(strcmp(argv[iargv],vname[tvar])){

  				tvar1++;
				
			}
		
		scanf("%s",var[tvar1]);
	}
	if(strcmp(argv[iargv],"write")==0){
		
		FILE *fp;
		iargv++;
		fp = fopen(argv[iargv],"w+");
		iargv++;
		if (strcmp(argv[iargv],"%")==0){
		iargv++;
		while(strcmp(argv[iargv],vname[tvar])!=0){
				tvar++;
			}
		fprintf(fp,"%s",var[tvar]);
		}
		else {
			fprintf(fp,"%s",argv[iargv]);
		}
	}
	if(strcmp(argv[iargv],"sys")==0){
		iargv++;
		if (strcmp(argv[iargv],"%")==0){
		iargv++;
		while(strcmp(argv[iargv],vname[tvar])!=0){
				tvar++;
			}
		system(var[tvar]);
		}
		else {
			system(argv[iargv]);
		}
	}
	if(strcmp(argv[iargv],"read")==0){
		
		//printf("in");
		iargv++;
		while(strcmp(argv[iargv],vname[tvar])!=0){
				tvar++;
			}
		iargv++;
		point = atoi(argv[iargv]);
		iargv++;
		FILE *read = fopen(argv[iargv],"r");
		fgets(var[tvar],point,read);
		}
	if(strcmp(argv[iargv],"done")==0){
			goto normalgo;
	}
        if(strcmp(argv[iargv],"cond")==0){
		iargv++;
		if(strcmp(argv[iargv],"%")==0){

		}
		if(strcmp(argv[iargv],"$")==0){
			iargv++;
			if(strcmp(argv[iargv],"==")==0){
				iargv++;
				//printf("in1");
				while(strcmp(argv[iargv],vname[tvar])!=0){
					tvar++;
				}
				iargv++;
				if(strcmp(var[tvar],argv[iargv])==0){
						goto ifgo;
				}
			}
		}              

 	}
}
endgo:
printf("%s\n",argv[1]);
return 0;
}
Ultima modifica effettuata da Umberto 22/07/12 16:15
aaa
22/07/12 16:21
nessuno
Ma che vuoi dire?

Il ciclo

while(strcmp(argv[iargv],vname[tvar])!=0){
                                        tvar++;
                                }


è lo stesso ... e quindi è ovvio che hai sempre l'errore ...
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.