Bonjour,
Je suis confronté à une difficulté technique que je n'arrive pas à aborder.
J'ai une structure contenant un double pointeur sur un size_t. Il est censé représente un tableau à une dimension. Cependant, ne connaissant pas la taille de ce tableau à l'avance, je suis obligé d'utiliser la fonction realloc d'où l'utilisation d'un double pointeur car l'allocation se fait dans une fonction et non dans le main où la variable a été crée.
Le but du code étant de charger dans un tableau à 3 dimensions le contenu d'un fichier d'extension CSV.
FONCTION
Code : Sélectionner tout - Visualiser dans une fenêtre à part void T1( t_data *data )
ERREUR COMPILATEUR : error: expected identifier before '(' token pour les deux lignes
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 /* On fait pointer ce nouveau tableau sur le tableau contenant la taille de chaque cellule du tableur */ data->(*allocateCell) = testRealloc; /* On enregistre la taille de la cellule courante*/ data->(*allocateCell)[data->allocateCellSize] = cellLength;
FONCTION
Code : Sélectionner tout - Visualiser dans une fenêtre à part char ***allocateCSV( t_data *data )
Code : Sélectionner tout - Visualiser dans une fenêtre à part array[i][j] = (char*)malloc((data->(*allocateCell)[counter])*sizeof(char));
ERREUR COMPILATEUR : error: expected identifier before '(' token
Voici le code intégrale :
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158 typedef struct { char ***spreadSheet; size_t row; size_t line; size_t **allocateCell; size_t allocateCellSize; char *CSVpath; }t_data; t_data *createDataStructure( const char *CSVpath ) { t_data *data = (t_data*)malloc(sizeof(t_data)); if ( data != NULL ) { data->spreadSheet = NULL; data->row = 0; data->line = 0; data->allocateCell = NULL; data->allocateCellSize = 0; strcpy( data->CSVpath, CSVpath ); } else exit(-1); return data; } void T1( t_data *data ) { /* On ouvre un pointeur sur le fichier CSV */ FILE *CSVfile = fopen(data->CSVpath,"r"); if( CSVfile != NULL ) { /* Variable qui lit le caractère courant parcouru dans le fichier */ char character; /* Variable qui compte le nombre de caractère à reserver pour chaque cellule du tableur */ size_t cellLength = 1; char *testRealloc = NULL; /* On parcours le fichier */ while( fscanf(CSVfile,"%c",&character) != EOF ) { /* Si on passe à une autre cellule */ if ( character == ';' || character == '\n' ) { if ( character == ';' && data->line == 0 ) { data->row = data->row + 1;} if ( character == '\n' ) { data->line = data->line + 1;} /* On alloue une case suplémentaire pour le tableau qui contient la taille de chaque cellule du tableur */ testRealloc = realloc( testRealloc, (data->allocateCellSize+1)*sizeof(size_t)); if ( testRealloc != NULL ) { /* On fait pointer ce nouveau tableau sur le tableau contenant la taille de chaque cellule du tableur */ data->(*allocateCell) = testRealloc; /* On enregistre la taille de la cellule courante*/ data->(*allocateCell)[data->allocateCellSize] = cellLength; /* On incrémente la valeur de la taille totale de ce tableau */ data->allocateCellSize = data->allocateCellSize + 1; } else exit(-1); /* On réinitialise à 0 la taille de la cellule pour recommencer avec la suivante */ cellLength = 0; } /* On incrémente la taille de la cellule */ cellLength++; } /* On ferme le pointeur sur le fichier CSV */ fclose(CSVfile); } } char ***allocateCSV( t_data *data ) { char ***array = (char***)malloc( (data->line)*sizeof(char**) ); size_t i; for ( i=0 ; i<data->line ; i++ ) { array[i] = (char**)malloc(data->row*sizeof(char*)); } size_t counter=0; size_t j; for ( i=0 ; i<data->line ; i++) for( j=0 ; j<data->row ; j++ ) { array[i][j] = (char*)malloc((data->(*allocateCell)[counter])*sizeof(char)); counter++; } return array; } void T2( t_data *data ) { /* On ouvre un pointeur sur le fichier CSV */ FILE *CSVfile = fopen(data->CSVpath,"r"); if( CSVfile != NULL ) { /* Variable qui lit le caractère courant parcouru dans le fichier */ char character; /* Variables qui permettent de placer le caractère lu dans le tableau */ size_t x = 0; size_t y = 0; size_t i = 0; /* On parcours le fichier */ while( fscanf(CSVfile,"%c",&character) != EOF ) { if ( character != ';' || character != '\n' ) { data->spreadSheet[x][y][i] = character; i++; } if ( character == '\n') { x++; } if ( character == ';' ) { data->spreadSheet[x][y][i] = '\0'; i=0; } } /* On ferme le pointeur sur le fichier CSV */ fclose(CSVfile); } } char *** getCSV( char *CSVpath ) { t_data *data = createDataStructure( CSVpath ); T1( data ); data->spreadSheet = allocateCSV( data ); T2( data ); return data->spreadSheet; }
Merci d'avance.
Partager