Le code de ce code a été écrit pour rechercher un mot dans un dictionnaire en utilisant la structure de données TRIE. Ce code fonctionne parfaitement sur mon compilateur IDE CS50 en utilisant à la fois make (Clang) et GCC et donne toujours la bonne réponse mais quand je lance le même code sur mon compilateur GCC (TDM-GCC), il passe en boucle infinie. il a commencé à utiliser beaucoup de RAM (512 Mo jusqu'à ce que je l'ai fermé avec force). Le code que j'ai exécuté était exactement le même dans les deux cas. Aussi dans les deux cas, le code compilé parfaitement.Ce code de l'algorithme TRIE s'exécute sur le compilateur IDE CS50, mais entre dans une boucle infinie dans TDM-GCC sous Windows
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
struct trieblock123;
typedef struct trieblock123 trieblock;
typedef trieblock *node;
struct trieblock123
{
char alphabet;
char reply[5];
node pnt;
};
typedef struct
{
node first;
int count;
}head;
void load(FILE* dict, head* header);
void init(node pointer);
int main(void)
{
FILE* dict = fopen("large", "r");
head* header = malloc(sizeof(head));
(*header).count = 0;
(*header).first = NULL;
node curtrie = NULL;
node temptrie = NULL;
node temptrie1 = NULL;
char temp;
temp = fgetc(dict);
int counter = 0;
temptrie = (node)(malloc(26 * sizeof(trieblock)));
int i;
for(i = 0; i < 26; i++)
{
(temptrie[i]).alphabet = (char)(((int)('a')) + i);
(temptrie[i]).pnt = NULL;
}
if(counter == 0)
{
(*header).first = temptrie;
}
while(((int)(temp) <= (int)('z') && (int)(temp) >= (int)('a')) || temp == '\n')
{
if(((int)(temp) > (int)('z') || (int)(temp) < (int)('a')) && temp != '\n')
break;
curtrie = temptrie;
while(temp != '\n')
{
char temp1;
temp1 = fgetc(dict);
if((curtrie[(int)(temp) - (int)('a')]).pnt == NULL)
{
if(temp1 != '\n')
{
temptrie1 = (node)(malloc(26 * sizeof(trieblock)));
for(i = 0; i < 26; i++)
{
(temptrie1[i]).alphabet = (char)(((int)('a')) + i);
(temptrie1[i]).pnt = NULL;
}
(curtrie[(int)(temp) - (int)('a')]).pnt = temptrie1;
curtrie = temptrie1;
}
else
{
strcpy((curtrie[(int)(temp) - (int)('a')]).reply, "yes");
}
}
else if((curtrie[(int)(temp) - (int)('a')]).pnt != NULL)
{
curtrie = (curtrie[(int)(temp) - (int)('a')]).pnt;
}
fseek(dict, -1 * sizeof(char), SEEK_CUR);
temp = fgetc(dict);
}
if(temp == '\n')
{
temp = fgetc(dict);
}
counter++;
}
(*header).count = counter;
char tocheck[100];
scanf("%s", tocheck);
i = 0;
node start = NULL;
start = temptrie;
for(i = 0; i < strlen(tocheck); i++)
{
char cha = tocheck[i];
if(i != strlen(tocheck) - 1)
{
if((start[(int)(cha) - (int)('a')]).pnt == NULL)
{
printf("mis-spelled\n");
break;
}
else
{
start = (start[(int)(cha) - (int)('a')]).pnt;
}
}
else
{
if(strcmp(((start[(int)(cha) - (int)('a')]).reply), "yes") == 0)
{
printf("correctly spelled\n");
break;
}
else
{
printf("mis-spelled\n");
break;
}
}
}
return 0;
}
étape Ainsi, à travers le code dans un débogueur et découvrir ce qui ne fonctionne pas correctement. Il compile ne veut pas dire que c'est correct. –
(adverbe) Pourquoi (verbe) est (nom) tout (verbe) casté? – ThingyWotsit
Sans analyse, ces expressions composées dans les instructions while semblent suspectes, simplement par leur complexité. – ThingyWotsit