2009-06-24 8 views
0

Ich versuche, eine analexical Validierung abzuschließen, aber ich einige Probleme mit Zeigern konfrontiert, dies ist mein CodeProbleme verwenden Zeiger innerhalb eines Compilers

case 6: c = next_carac(file); 
      for(handle=0;(words[handle] != "NULL");handle++) 
      { 
       strcpy(message, words[handle]); 
       if(!strcmp(token,message)) 
        strcpy(message, "words"); 
      } 
      if(isdigit(c) && strcmp(message,"words")) 
      { 
       step=6; 
       token[auxtoken]=c; 
       auxtoken++; 
      } 
      else if(isalpha(c) && strcmp(message,"words")) 
       { 
        step=6; 
        token[auxtoken]=c; 
        auxtoken++; 
       } 
       else 
       { 
        step=7; 
        return_carac(file); 
       } 
      break; 

und diese sind die Variable deklariert

const char *words[]={ 
     "program", 
     "label", 
     "integer", 
     "word", 
     "char", 
     "byte", 
     "shortint", 
     "logint", 
     "real", 
     "single", 
     "double", 
     "string", 
     "boolean", 
     "var", 
     "procedure", 
     "function", 
     "begin", 
     "end", 
     "if", 
     "then", 
     "else", 
     "or", 
     "and", 
     "div", 
     "not", 
     "do", 
     "while", 
     "mod", 
     "NULL" 
}; 

char token[80],message[30]; 
    int step=0; 
    char c; 
auxtoken=0; 

aber es erzeugt die folgenden Fehler, die ich nicht einen Weg finden könnte

Loaded ‚ntdll.dll‘ keine passenden symbolischen Angaben zu mildern. Geladen "C: \ WINDOWS \ system32 \ kernel32.dll", keine übereinstimmenden symbolischen Informationen gefunden. Erste-Chance-Ausnahme in Main.exe: 0xC0000005: Zugriffsverletzung.

Würdest du wissen, wie ich es beheben könnte?

Antwort

3

Es sollte NULL sein, nicht "NULL" (an 2 Stellen).

Erläuterung: Die Bedingung words [handle]! = "NULL" tut nicht, was Sie erwarten. Es vergleicht Zeiger, keine Zeichenfolgen. Es ist also möglich, dass Sie diese Schleife nie verlassen und es zu einem unzulässigen Speicherzugriff kommt. NULL hingegen ist ein Zeiger, kein String, und NULL ist immer NULL.

+0

Die Bedingung Wörter [Handle]! = "NULL" ist nicht immer wahr. Tatsächlich werden String-Literale oft nur einmal in einer ausführbaren Datei gespeichert. In diesem Fall verhält sich der Code genauso, als würde man die Vorkommen von "NULL" durch NULL ersetzen. – mweerden

+0

Technisch gesehen hast du recht - es ist nicht immer so. Aber für VC++ (das ist, was ich denke, OP verwendet) müssen Sie diese Funktion explizit aktivieren, es ist nicht standardmäßig aktiviert. Also, ich bin mir ziemlich sicher, dass dies der Grund für das Problem ist. Ich korrigiere trotzdem meine Antwort, danke! –

0

Hinzufügen zu, was Igor schrieb Sie auch in Ihrem Array von Zeigern einen weiteren Eintrag hinzufügen sollte (wenn „NULL“ Teil Ihrer Grammatik):

... 
    "not", 
    "do", 
    "while", 
    "mod", 
    "NULL", 
    NULL  // marks end of array 
}; 

diese Weise können Sie bis Wörtern suchen [Griff ]! = NULL, andernfalls kann die Suche über das Array hinaus fortgesetzt werden. Ein noch besserer Ansatz ist wahrscheinlich, stattdessen eine Form der Hash-Tabelle zu haben und stattdessen eine Suche durchzuführen.

1

Die obigen Antworten sind großartig, aber als allgemeine Ratschläge, wenn Sie einen Laufzeitfehler wie folgt treffen, ist ein guter erster Schritt in der Ausarbeitung der Ursache des Problems, Ihr Programm in einem Debugger zu betrachten, und sehen Sie, welche Codezeile das Problem verursacht (dh, indem Sie auf den Aufruf-Stack schauen).

Verwandte Themen