2016-07-17 8 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를 아니었다.