Bonjour à tous,
Cela fait un moment que je n'ai pas touché au C, le trouvant un peu trop bas niveau à mon goût, je m'y suis tous de même remis.
J'ai donc réalisé un petit programme ayant pour rôle d'associer à un mot un "token" sur lequel je ferais des traitement plus tard. Malheureusement, la mémoire se rebelle et ne veut pas se laisser manipuler :-°
Je m'explique : j'ai crée une structure de données SymbolTable définie dans symbolTable.h.
Son rôle est d'attribuer un mot à un token.
J'ai crée 2 fonctions, l'une pour allouer la mémoire pour la structure allocate_Symbol_Table_Memory( SymbolTable** symbolTable ) et une pour ajouter un couple add_Symbol( SymbolTable** symbolTable, const int size, char* symbol, char* token ).
Jusque là tout fonctionne l'allocation se passe parfaitement, malheureusement je ne peux pas accéder aux zones de mémoires alloués dans mes fonctions, ça plante à l'exécution. En revanche, si je tente d'y accéder à partir de mon main aucun problème.
Comme un code parle mieux que des explications, voici mon code :
main.c
symbolTable.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 #include <stdio.h> #include <stdlib.h> #include "symbolTable.h" int main( void ) { SymbolTable *symbolTable = NULL; int size = allocate_Symbol_Table_Memory( &symbolTable ); //si je tente de modifier dans le main, ça fonctionne symbolTable[0].symbol = ""; //add_Symbol( &symbolTable, size, "if", "<cond>" ); return EXIT_SUCCESS; }
symbolTable.c
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 #ifndef __SYMBOL__TABLE__ #define __SYMBOL__TABLE__ //taille de la table des symboles #ifndef SYMBOL_TABLE_SIZE #define SYMBOL_TABLE_SIZE 5 #endif //un symbole est associé à un token, utilisé plus tard pour la construction de l'arbre abstrait de données typedef struct SymbolTable SymbolTable; struct SymbolTable { char* symbol; char* token; }; //alloue un emplacement mémoire nécessaires pour que la table des symboles puisse fonctionner correctement int allocate_Symbol_Table_Memory( SymbolTable** symbolTable ); //ajoute un couple (symbole, token) dans la table des symboles int add_Symbol( SymbolTable** symbolTable, const int size, char* symbol, char* token ); #endif
Voilà si quelqu'un a une petite idée je lui serais très reconnaissant, ça doit sans doute être une erreur bête mais je ne la vois pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 #include <stdlib.h> #include <stdio.h> #include "symbolTable.h" //alloue la mémoire nécessaire pour la Table des Symboles //utilise la constante SYMBOL_TABLE_SIZE définie dans symbolTable.h int allocate_Symbol_Table_Memory( SymbolTable** symbolTable ) { int i = 0; *symbolTable = (SymbolTable*)calloc(SYMBOL_TABLE_SIZE, sizeof(SymbolTable)); if( *symbolTable == NULL ) { fprintf(stderr, "Impossible d'allouer la table des symboles."); } //pour le test printf( "%s", symbolTable[0]->symbol ); //ça plante ici, dès que je veux accéder au contenu de symbolTable[i]->symbol ou symbolTable[i]->token while( i != SYMBOL_TABLE_SIZE ) { symbolTable[i]->symbol = ""; symbolTable[i]->token = ""; i++; } return SYMBOL_TABLE_SIZE; } //ajoute un couple (symbole, token) dans la table des symboles //retourne -1 si la table des symboles est pleine //retourne l'indice auxquels le couple a été ajouté si tout s'est bien passé int add_Symbol( SymbolTable** symbolTable, const int size, char* symbol, char* token ) { int i = 0; //on parcourt la table tant qu'on est pas arrivé au dernier élément et qu'il y a un symbole à l'indice while( (i != size) && (symbolTable[i++]->symbol == "") ); if( i == size ) { fprintf(stderr, "Impossible d'ajouter un symbole dans la table des symboles."); return -1; } symbolTable[i]->symbol = symbol; symbolTable[i]->token = token; return i; }
Et au passage tout commentaire sur le code, sur des améliorations et optimisations sont les bienvenues.
Merci d'avance
Partager