Bonjour tout le monde, je suis lycéen et en stage, au cours de ce stage, j ai été chargé de développer un petit programme, qui doit ouvrir un fichier (.wbp), récupérer certaines valeurs inscrites dedans, et les recopier a la suite dans un autre fichier (.keyframe).
Le tout devant être le plus flexible possible.
Puisque je ne sais pas combien de valeurs je vais récupérer, j'ai appris sur le tas (en lisant les docs) a utiliser malloc, calloc, realloc et free, et je pense avoir compris le concept.
Cependant, lorsque je test mon programme, realloc me renvoie systématiquement un pointeur NULL, ce qui me bloque en plein milieu, et quand je passe les realloc, c'est free qui refuse de me renvoyer un pointeur NULL
Voici le code:
Mes declarations de variables et define:
Ici mon utilisation de calloc (seule fonction fonctionnant):
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 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MP "MarkerPosition" #define tcache 64 #define tnom 50 __________________ int main (int argc, char *argv[]) { /* int *: -tabPos: Tableau Positions, tableau dynamique contenant les positions (MarkerPositions) -argv:Nom complet des fichiers wbp a la suite -argc:Nombre de fichiers a ouvrir +1 unsigned int: -pkmn: touche perso & compteur de .wbp fini (pour la boucle principale) -nbrPos: Compteur de positions trouvées -end : Sert lors de la recuperation des positions, a detecter quand les chaines recupérées ne sont plus valide afin de sortir de la boucle. char: -nom[]: Nom du fichier .wbp a ouvrir, puis du .keyframe a creer -cache[]: Sert pour retrouver les "MarkerPositionX" dans le .wbp FILE*: -wbp: Fichier wbp -kf: Fichier KeyFrame */ int *tabPos=NULL; unsigned int pkmn=1, nbrPos=0, end = 0, curseur=0; char nom[tnom]={0}, cache[tcache]={0}; FILE* wbp=NULL; FILE* kf=NULL;
Ici la fonction utilisant realloc:
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 int * memoryCreate () //Allouer la memoire //VARIABLES //I: / //O: tabPos (tableau dynamique) { int * tabPos = NULL; int bcl=0; //Allouer tabPos (une case de memoire) avec calloc (pour la mettre a 0) printf("-Creation du tableau de memoire..."); do { tabPos = calloc (sizeof(int),1); bcl=bcl+1; if (tabPos==NULL && bcl>3) //Si tabPos n'a toujours pas été alloué au bout de trois tentatives { printf("FAIL\nAllocation de mémoire impossible\nErreur %d\n__________\n", errno); exit(EXIT_FAILURE); //Indiquer l erreur et sortir du programme } }while (tabPos == NULL); //Tant que la memoire n'a pas été alloué printf("OK\n"); return tabPos; }
Et mon free:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 int * tabUp (int* tabPos, int nbrPos) { int * save=NULL; printf("Reallocation..."); //Reallouer tabPos avec une case de plus do { save = (int *) realloc (tabPos, nbrPos * sizeof(int)); }while (save == NULL); printf("OK\n"); return (int *) save; }
Je travaille sous Windows avec Code::Blocks, les seuls messages d'erreurs sont deux bout de codes déclaré inatteignable, mais n'ayant aucun lien avec ces fonctions (l'un est le return 0; precedé de exit(EXIT_SUCCESS);, vu que C::B rale sans son return 0;, et l'autre est dans une tout autre fonction, un if suivant une boucle, je ne vois pas pourquoi il me le déclare inatteignable, mais cette partie la fonctionnant, ce n'est pas ma priorité...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 //Liberer la memoire printf("Liberation de la memoire..."); while (tabPos!=NULL) { free(tabPos); } printf("OK\n");
TLR: Je n'arrive pas a utiliser realloc correctement, j'ai beau comparer a la doc je ne trouve pas mon erreur: que faire?
Partager