Bonjour,
J'utilise la SDL2, lors de l'écriture du programme, j'ai souvent compilé pour voir si tout allait bien. Je refermais la fenêtre aussitôt. Le but étant de voir si les textures s'affichaient correctement.
J'ai donc continué à coder, et maintenant que j'ai ajouté des tuiles, Lors de l'exécution, j'ai une erreur de segmentation au bout de quelques secondes...
Je pense que j'avais déjà cette erreur depuis le début du programme, mais que je ne l'ai pas vue car je ne laissais pas la fenêtre ouverte assez longtemps.
En regardant les forums, j'ai vu que je pouvais compiler avec -g3 ou -w avec make, et déboguer avec gdb.
mais quand je fais ça, gdb me donne cela :
je n'avais utilisé gdb, mais je pense que le "??" est censé me donner l'endroit ou a lieu l'erreur.[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
[New Thread 0x7ffff480a700 (LWP 9154)]
Thread 1 "exe" received signal SIGSEGV, Segmentation fault.
0x00007ffff4fe4540 in ?? () from /usr/lib/x86_64-linux-gnu/dri/i965_dri.so
Avez-vous d'autre idées qui pourrait m'aider à trouver le lieu de l'erreur ?
Si vous avez déjà utilisé la SDL2, savez-vous quelle type de structure faut-il libérer ? (Je me dis que c'est peut-être un SDL_FreeSurface() qui manque, ou un pointeur qui ne pointe sur rien... )
je vous fournis l'extrait de code qui, je pense, cause l'erreur :
j'ai aussi testé valgrind pour voir si il y avait une fuite de mémoire, j'ai beaucoup trop d'erreurs pour les montrer, mais elles sont quasiment toutes identiques :
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 void map::display( fenetre* window , int i , int j ) { SDL_Rect rect_src; SDL_Rect rect_dest; SDL_Surface* loading_surf = SDL_LoadBMP( this->tuile_set->get_name().c_str() ); if( loading_surf == NULL ) { std::cout << "Erreur lors du chargement de l'image" << std::endl; } SDL_Texture* texture ; rect_src.x = ( (this->tab_map[j][i]) % this->tuile_set->get_nb_colone() ) * this->tuile_set->get_largeur_tuile(); rect_src.y = ( (this->tab_map[j][i]) % this->tuile_set->get_nb_ligne() ) * this->tuile_set->get_hauteur_tuile(); rect_src.w = this->tuile_set->get_largeur_tuile(); rect_src.h = this->tuile_set->get_hauteur_tuile(); rect_dest.x = i * this->tuile_set->get_largeur_tuile(); rect_dest.y = j * this->tuile_set->get_hauteur_tuile(); rect_dest.w = this->tuile_set->get_largeur_tuile(); rect_dest.h = this->tuile_set->get_hauteur_tuile(); texture = SDL_CreateTextureFromSurface( window->get_renderer() , loading_surf ); SDL_FreeSurface( loading_surf ); SDL_RenderCopy( window->get_renderer() , texture , &rect_src , &rect_dest ); };
pour information, dans main.cpp ligne 52 il y a :
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 ==17195== Invalid write of size 4 ==17195== at 0x7A319F7: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so) ==17195== by 0x7A0F7D7: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so) ==17195== by 0x7AD7727: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so) ==17195== by 0x7A11D8A: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so) ==17195== by 0x7AB184D: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so) ==17195== by 0x722BABD: ??? (in /usr/lib/x86_64-linux-gnu/libGLX_mesa.so.0.0.0) ==17195== by 0x7105F22: ??? (in /usr/lib/x86_64-linux-gnu/libGLX.so.0.0.0) ==17195== by 0x71075A0: ??? (in /usr/lib/x86_64-linux-gnu/libGLX.so.0.0.0) ==17195== by 0x4942849: ??? (in /usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0.10.0) ==17195== by 0x4914739: ??? (in /usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0.10.0) ==17195== by 0x4916977: ??? (in /usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0.10.0) ==17195== by 0x4917112: ??? (in /usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0.10.0) ==17195== Address 0x7f0581ef609c is not stack'd, malloc'd or (recently) free'd ==17195== ==17195== 2984 errors in context 72 of 276: ==17195== Invalid write of size 4 ==17195== at 0x7F1E996: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so) ==17195== by 0x8099AA2: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so) ==17195== by 0x7A0B22C: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so) ==17195== by 0x7A39E58: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so) ==17195== by 0x7A3A3AB: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so) ==17195== by 0x7A0F694: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so) ==17195== by 0x7A4170A: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so) ==17195== by 0x724CE46: ??? ==17195== by 0x4943306: ??? (in /usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0.10.0) ==17195== by 0x10B27A: main (main.cpp:52) ==17195== Address 0x7f0581ef21c4 is not stack'd, malloc'd or (recently) free'd ==17195==
prototype de la fonction :
Code : Sélectionner tout - Visualiser dans une fenêtre à part SDL_RenderPresent( window->get_renderer() );
merci pour votre temps.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SDL_Renderer* fenetre::get_renderer() { return this->m_renderer; };
Cordialement.
Partager