22/07/12 14:58
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.
Mancano tutte le dichiarazioni delle variabili ...
Posta tutto il main e dicci come si dovrebbe usare e in quali condizioni hai avuto l'errore.
22/07/12 15:09
Umberto
certo scusa :
Errore se :
#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
Il problema sta nel ciclo
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.
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.
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
Scusa Umberto ma se scrivi solamente questo non so cosa dirti.
Ovviamente devi dire come hai modificato il codice ...
Ovviamente devi dire come hai modificato il codice ...
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