2016-07-17 7 views
-1

私は、コンパイラ設計の対象としてshift-reduceアルゴリズムを行っています。これがコードです。C - プロセスがエラーコード3221225477で終了しました

void shiftReduce(char str[MAX_CHAR], int prodNum, int line) 
{ 
    int limit = 5, y=0; 
    int substrFlag = 1; //0 true 1 false 
    int ctr,x, counter; 
    int match, next; 
    char stack[MAX_CHAR]; 
    clearString(stack); 
    OUTER:while ((strcmp(stack, prod[0].left) != 0) && (y < limit)) 
    { 
     addChar(stack, str[0]); 
     strcpy(str, dequeue(str)); 
     printf("Stack = %s\nQueue = %s\n", stack, str); 
     for (ctr = 0; ctr < prodNum; ctr++) 
     { 
      if (strstr(stack, prod[ctr].right) != NULL) 
      { //substring found 
       substrFlag = 0; 
       strcpy(stack, replace(stack, prod[ctr].right, prod[ctr].left)); 
       goto OUTER; 
      } 
     } 
     if ((str[0] == '\n') || (str[0] == '\0')) 
      y++; 
    } 
    if (strcmp(stack, prod[0].left) == 0) 
     ;//printf("%s - Accepted.\n", stack); 
    else 
     printf("Syntax error on line %i\n", line); 
} 

私はprintf("Stack = %s\nQueue = %s\n", stack, str);行にコメントするとうまくいきます。しかしコメントを外すと、コード3221225477が返されます。

BTW。

char * dequeue (char str[MAX_CHAR]) 
{ 
    int x = 0; char temp; 
    for (x = 0; x < length(str); x++) 
    { 
     if ((x+1) < length(str)) 
      str[x] = str[x+1]; 
    } 
    return str; 
} 

とaddChar機能:これは、デキュー機能です

void addChar (char * str, char letter) 
{ 
    int a = 0; 
    while (str[a] != '\0') 
     a++; 
    str[a] = letter; 
    str[a+1] = '\0'; 
    return; 
} 

、最終的に機能を交換してください。

char * replace (char orig[MAX_CHAR], char substr[MAX_CHAR], char rep[MAX_CHAR]) 
{ 
    int match, end=0, next=0; 
    int flag = 0; //0 true 1 false 
    char temp [MAX_CHAR]; 
    char store[MAX_CHAR]; 
    if (strstr(orig, substr) == NULL) 
     return NULL; 
    int x,y; 
    for (x = 0; x < length(orig); x++) 
    { 
     if (orig[x] == substr[0]) //if current character is equal to first character of substring 
     { 
      match = x; 
      for (y = 0; y < length(substr); y++) 
      { 
       if (orig[match+y] != substr[y]) 
       { 
        flag = 1; 
        break; 
       } 
      } 
      if (flag == 0) 
      { 
       next = match + length(substr); 
       for (y = 0; y < length(rep); y++) 
       { 
        temp[match+y] = rep[y]; 
        end = (match+y); 
       } 
       for (y = next; y < length(orig); y++) 
       { 
        temp[y] = orig[next+(y-next)]; 
       } 
       return temp; 
      } 
     } 
     else 
     { 
      addChar(temp, orig[x]); 
     } 
    } 
    return temp; 
} 

PS。 prod配列は:私はprintf("Stack = %s\nQueue = %s\n", stack, str);行をコメントすると

struct RULES 
{ 
    char left[MAX_CHAR]; 
    char right[MAX_CHAR]; 
} RULES; 
struct RULES prod[MAX_RULES]; 
+0

* "コードは3221225477を返します。" * *は*を返しますか? "返品"はプログラミングにおいてかなり特別な意味を持ちますが、あなたが求めている機能は '無効 'です。それはエラーを投げることを意味しますか? –

+1

'3221225477'は' 0xC0000005'です。これはWindowsプログラマーにとってはよく知られている数字です... ;-) – alk

答えて

0

は、それがうまく動作します。しかしコメントを外すと、コード3221225477が返されます。

そして、最も可能性の高いstackまたはstrのいずれかが無効なメモリに0 - 末端またはポイントされていませんでした。

関連する問題