Amis internautes, bonjour !
J'ai voulu coder une fonction qui ouvre un fichier en mode texte, et qui charge son contenu dans une structure. Voilà le code :
.
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 int LoadMap(const char lNumber, LevelData* ldat) { char lvl[4]; int buf; sprintf(lvl, "lvl%c", lNumber); FILE *lvlFile = NULL; if ((lvlFile = fopen(lvl,"r")) == NULL) { fprintf(stderr, "Can't open %s", lvl); exit(EXIT_FAILURE); } int i, j; ldat->lW = GETN; // GETN défini pour fgetc(lvlFile) - '0' buf = GETN; // Jumping \n character ldat->lH = GETN; ldat->map = malloc(ldat->lW * sizeof(int*)); for (i = 0; i < ldat->lH; i++) ldat->map[i] = malloc(ldat->lH * sizeof(int)); if (ldat->map == NULL) { fprintf(stderr, "Can't allocate"); exit(EXIT_FAILURE); } for (i = 0; i < ldat->lH; i++) { buf = GETN; for (j = 0; j < ldat->lW; j++) { ldat->map[i][j] = GETN; if (ldat->map[i][j] == 2) { ldat->pPosInTabX = j; ldat->pPosInTabY = i; } fprintf(stdout, "%d", ldat->map[i][j]); } fprintf(stdout, "\n"); } fprintf(stdout, "Player Position: %d;%d\n", ldat->pPosInTabX, ldat->pPosInTabY); fclose(lvlFile); return 0; }
La structure LevelData est définie comme ça :
et est déclarée dans le main comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 typedef struct { int **map; // Quite self explanatory int lW, lH; // Level Width and Heigh in tiles SDL_Rect xyTile; // Tile size (square) SDL_Rect xyPlayer; // Player size (square) SDL_Rect xyOrigin; // Place on the screen where the mapping will begin int pPosInTabX, pPosInTabY; // Player position in map tab int beautySpace; // Space between two tiles } LevelData;
Toujours dans le main, j'appelle la fonction "LoadMap('1', ldat);".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 LevelData *ldat = NULL; if ((ldat = malloc(sizeof(ldat))) == NULL) fprintf(stderr, "Can't allocate LevelData Structure");
Sauf que... Le compilo (codeblocks + mingw) m'envoie soit Process terminated with status 255 soit Process terminated with status XXXXXXXXXX.
Et windows s'affole et m'affiche prog.exe a cessé de fonctionner.
(En fait ce problème apparait à la fin du programme, mais c'est après la création de cette fonction que ça a commencé à planter, donc je vais vous épargner le reste du code).
Tandis que le compilo m'envoie pas d'erreurs, mais un warning, pour la fonction LoadMap : variable 'buf' set but not used. Etrange, non ?
Et encore plus étrange, le debugger intégré à codeblocks n'arrive pas à me trouver l'erreur: le programme se déroule du début jusqu'à la fin, puis quand ça plante il m'affiche sur le stack des entrées vides et des fonctions système (la liste :).
Code none : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 #0 00000004 ?? () (??:??) #1 74D73EB1 UxTheme!GetThemeFilename() (C:\Windows\SysWOW64\uxtheme.dll:??) #2 74D73E27 UxTheme!GetThemeFilename() (C:\Windows\SysWOW64\uxtheme.dll:??) #3 77DE481E ?? () (??:??) #4 77DE486B ?? () (??:??) #5 77DF0A38 ?? () (??:??) #6 77DF091D ?? () (??:??) #7 76C239BE KERNEL32!GetCurrentApplicationUserModelId() (C:\Windows\SysWOW64\kernel32.dll:??) #8 ?? ?? () (??:??)
Et quand je passe le programme au désassembleur (ollydbg), ce dernier m'envoie un truc du genre impossible de lire à l'adresse 0x00000002 (permission refusée), et ça à chaque fois.
Depuis 8 heures ce matin je n'arrive pas à trouver la couille, par pitié aidez moi.
Merci d'avance pour vos réponses !![]()
Partager