2016-07-15 1 views
-1

Je suis en train de faire le travail ce morceau de code du livre de Kernighan La pratique de la programmation sur mon poste de travail (Windows Community Edition 7 + de vs2015)chaîne de Markov (code c sur Windows échoue)

je reçois une erreur étrange.

void generate(int nwords) { 
    State *sp; 
    Suffix *suf; 

    char *prefix[NPREF]; 
    char *w = NULL; 

    int i, nmatch; 

    for (i = 0; i < NPREF; i++) 
     prefix[i] = NONWORD; 

    for (i = 0; i < nwords; i++) { 
     sp = lookup(prefix, 0); 
     nmatch = 0; 

     for (suf = sp->suf; suf != NULL; suf = suf->next) { 
      if (rand() % ++nmatch == 0) { 
       w = suf->word; 
      } 
      if (nmatch == 0) 
       printf("internal error: no suffix %d %s", i, prefix[0]); 
      if (strcmp(w, NONWORD) == 0) 
       break; 

      printf("%s ", w); 

      memmove(prefix, prefix + 1, (NPREF - 1) * sizeof(prefix[0])); 

      prefix[NPREF - 1] = w; 
     } 
    } 
} 

pour

exception non gérée à 0x000000013F5C1564 dans CompareCandCsharp.exe (SUF = sp-> suf;; suf = NULL suf = suf-> suivante!): 0xC0000005: violation d'accès emplacement de lecture 0x0000000000000010.

Ma mise en œuvre est similaire à décrit ici - Working with arrays and reading text files

Semble algorithme fonctionne - mais sur mon ordinateur, il échoue. Je ne peux pas trouver intentionnel pour cela. Pourriez-vous s'il vous plaît donner vos suggestions.

+1

Comment savez-vous 'lookup()' renvoie un pointeur non-NULL? –

+1

Etes-vous sûr que 'lookup' renvoie un pointeur non nul? Si vous exécutez un débogueur et laissez-le attraper le crash (que vous devriez toujours faire btw) quelle est la valeur de 'sp'? Etes-vous sûr que le crash est à cette déclaration de boucle for for? –

+0

Je ne suis pas si cool dans c (et c sur windows est sous mon esprit) = (ma langue de base est C# Bien sûr, il peut retourner null pointeur mais l'implémentation de base du script ne fait rien pour le vérifier. parce que le débogueur reste là après l'erreur Peut-être que je le vérifierais sur linux = ( –

Répondre

0

Après plusieurs heures de débogage, j'ai trouvé une petite erreur dans la méthode attendue.

for (suf = sp->suf; suf != NULL; suf = suf->next) { 
     if (rand() % ++nmatch == 0) { 
      w = suf->word; 
     } 

Il n'y a pas le support après si cette ligne de sorte que tous les autres code essayez la méthode set w plusieurs fois et bien sûr, il conduit à des erreurs de mémoire =). Merci de ne pas avoir lu ma question avant de l'avoir lu =))