IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

Segmentation fault lors de SDL_CreateTextureFromSurface() [SDL 2.0]


Sujet :

SDL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Chomage
    Inscrit en
    Juillet 2016
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chomage

    Informations forums :
    Inscription : Juillet 2016
    Messages : 24
    Points : 33
    Points
    33
    Par défaut Segmentation fault lors de SDL_CreateTextureFromSurface()
    Bonjour , je suis nouveau sur le forum ^^ et un peu nouveau a la SDL 2 , bref
    Je travaille sur un petit projet de console virtuelle , et ma fonction de rendu ne marche pas , apres avoir mis des std::cout partout et utilisé le debugger , il trouve une "segmentation fault" (donc acces a une zone memoire non allouée) lors du SDL_CreateTextureFromSurface :
    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
    void Fenetre::ActualiserEcran()
    {
        std::cout << "Deb. ActualiserEcran()";
     
        SDL_Rect rectangle_dest = {0, 0, (TAILLE_FENETRE*RATIO_ECRAN_L), (TAILLE_FENETRE*RATIO_ECRAN_H)};
        const unsigned int nbBytesInAPixelRow = ((TAILLE_FENETRE*RATIO_ECRAN_L)*3)*8;
     
        std::cout << "Bp 2";
     
        SDL_Surface *ecran_rendu = SDL_CreateRGBSurfaceFrom(&m_ecran_brut, (TAILLE_FENETRE*RATIO_ECRAN_L), (TAILLE_FENETRE*RATIO_ECRAN_H),32, nbBytesInAPixelRow, 0, 0, 0, 0);
        if(ecran_rendu == nullptr)
            {
                std::cout << SDL_GetError();
            }
     
        std::cout << "Bp 2.5 ";
     
        SDL_Texture *texture_a_coller_ecran = SDL_CreateTextureFromSurface(m_renderer, ecran_rendu);
        if(texture_a_coller_ecran = nullptr)
            {
                std::cout << SDL_GetError();
            }
     
        std::cout << "Bp3";
     
        if(SDL_RenderCopy(m_renderer, texture_a_coller_ecran, nullptr, &rectangle_dest) != 0)
            {
                std::cout << SDL_GetError();
            };
     
        SDL_RenderPresent(m_renderer);
     
        std::cout << "Bp4";
     
        SDL_DestroyTexture(texture_a_coller_ecran); // Desallocations
        SDL_FreeSurface(ecran_rendu);
    }
    et voici les appels de stack du bebegger :
    #0 0x6c7a3d7c Blit4to4MaskAlpha(info=0x6fd0058) (../src/video/SDL_blit_N.c:2055) <--- ce qui crée la Segfault
    #1 0x6c7963e8 SDL_SoftBlit(src=0xa68660, srcrect=0x611440, dst=0x70ceea8, dstrect=0x611440) (../src/video/SDL_blit.c:88)
    #2 0x6c7c32ac SDL_ConvertSurface(surface=0xa68660, format=0x70cee60, flags=0) (../src/video/SDL_surface.c:832)
    #3 0x6c7708da SDL_CreateTextureFromSurface(renderer=0xa67900, surface=0xa68660) (../src/render/SDL_render.c:503)
    #4 0x401866 Fenetre::ActualiserEcran(this=0x6115cc) (C:\Users\Antoine\Desktop\Virtual Game Support Project\src\fenetre .cpp:118)
    #5 0x402898 SDL_main(argc=1, argv=0xa61100) (C:\Users\Antoine\Desktop\Virtual Game Support Project\src\main.cpp:37)
    #6 0x4036d7 console_main(argc=1, argv=0xa61100) (../src/main/windows/SDL_windows_main.c:138)
    #7 0x40375f WinMain@16(hInst=0x400000, hPrev=0x0, szCmdLine=0xa839b5 "", sw=10) (../src/main/windows/SDL_windows_main.c:175)
    #8 0x46cc4b main () (???)

    Votre aide est la bienvenue

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Points : 321
    Points
    321
    Par défaut
    Bonjour,

    Le "m_renderer" est-il bien créé auparavant ?

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Chomage
    Inscrit en
    Juillet 2016
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chomage

    Informations forums :
    Inscription : Juillet 2016
    Messages : 24
    Points : 33
    Points
    33
    Par défaut
    Le m_renderer est un membre de la classe et donc est initialisé dans le constructeur par CreateRenderer et est check pour ne pas etre NULL

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Sachant que vous utilisez un débogueur, avez vous vérifier que toutes les variables sont "OK" et contiennent des valeurs "OK" ?
    Peut t-on avoir une copie du projet pour tester chez nous (facilement compilable, tout ça).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Chomage
    Inscrit en
    Juillet 2016
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chomage

    Informations forums :
    Inscription : Juillet 2016
    Messages : 24
    Points : 33
    Points
    33
    Par défaut
    désolé , je ne sais pas afficher la valeur des variables (j'ai essayé via le memory dump mais comme le projet s'est arrêté a ce moment , il ne les trouve pas ) Bref ,, voici une version compliable du projet (sous C::B par contre) (Les instructions dans le main n'ont pas de sens , mais servaient juste a tester toutes les fonctions) Nouveau Archive WinRAR.7z

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Pour le débogage, n'hésitez pas à lire ce tutoriel : http://alexandre-laurent.developpez....e-application/

    Il y a des erreurs de compilation chez moi :
    ./src/fenetre .cpp:2:36: erreur fatale*: ../versionning/version.h : Aucun fichier ou dossier de ce type

    ./src/main.cpp: Dans la fonction ‘int main(int, char**)’:
    ./src/main.cpp:18:5: erreur*: ‘PixelBlanc’ was not declared in this scope
    PixelBlanc.Rouge = 0xFF;
    ^~~~~~~~~~
    ./src/main.cpp:24:82: erreur*: ‘LigneBleu’ was not declared in this scope
    or< std::vector<Pixel > > EcranBleu((TAILLE_FENETRE*RATIO_ECRAN_H), LigneBleu);
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Chomage
    Inscrit en
    Juillet 2016
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chomage

    Informations forums :
    Inscription : Juillet 2016
    Messages : 24
    Points : 33
    Points
    33
    Par défaut
    Oui , oui , désolééééé j'avais fait quelques modifications sans check si ca passait (petite gaffe au niveau des couleurs ^^') grace au tutoriel proposé par LittleWhite , j'ai check les variables , et elles ont des valeurs OK (des addresses pour les pointeurs , aucun pointeur NULL, des valeurs pour les variables) je re-link le projet , sans les petites erreur ^^
    Virtual Game Support Project.7z

  8. #8
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Pour les std::vector incluant std::vector, je les renomme avec un typedef. C'est plus pratique à gérer.
    D'ailleurs, lorsque je vois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool Fenetre::SetBufferBitmap(std::vector< std::vector< Pixel > > bitmap)
    Vous faites la copie complète du tableau à chaque appel à la fonction. Ça fait plutôt mal.

    Aussi, je pense que le tableau de pixel est statique, donc std::array pourrait être plus approprié. Ou peut être même une classe à soit, pour offrir des fonctionnalités plus approprié que capacity() pour avoir la taille. D'ailleurs, le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(bitmap.capacity() < TAILLE_FENETRE*RATIO_ECRAN_H)
    Il risque de retourner la taille d'une seule dimension. Vous ne testez donc pas totalement le truc.

    Pas besoin du \ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_ecran = SDL_CreateWindow(" If you see this, there's an error to report", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, m_largeur_fenetre, m_hauteur_fenetre\
    En effet, la norme C/C++ ne repose absolument pas sur les whitespace.

    Vous devriez faire le calcul de la taille réelle de la fenêtre (après redimensionnement/ratio) une bonne fois pour toute, au lieu de traîner la multiplication du ratio partout.

    J'ai trouvé l'erreur !!!! (enfin).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const unsigned int nbBytesInAPixelRow = ((TAILLE_FENETRE*RATIO_ECRAN_L)*3)*8;
    D'après le nom de la variable, vous devriez contenir des bytes (soit, des octets), donc le *8 est bien superflu (et demande donc à SDL_CreateRGBSurfaceFrom) de lire n'importe comment le tableau source.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Chomage
    Inscrit en
    Juillet 2016
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chomage

    Informations forums :
    Inscription : Juillet 2016
    Messages : 24
    Points : 33
    Points
    33
    Par défaut
    Merci beaucoup de la réponse !! Et merci aussi pour les conseils j'ai du lire un peu trop vite la doc' (Byte/Bit) Bref , merci beeeaaauuucoup du fond du coeur !! c'est sur que comme il considerait que la taille de l'image etait x8 l'acces a une zone memoire non valide devient évident ^^ bref MERCI (PS : le backslash c'était un souvenir de mon 1er livre sur le C++ que j'ai lu (que j'ai trouvé nul des que j'ai eu acces a des VRAIS tutos sur le C++ ^^)

  10. #10
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Bonne continuation
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. segmentation fault lors de l'utilisation de strcpy
    Par simplyc dans le forum Débuter
    Réponses: 18
    Dernier message: 17/01/2011, 19h52
  2. Segmentation Fault lors de mise à jour d'image par callback
    Par bboy_keen dans le forum GTK+ avec C & C++
    Réponses: 7
    Dernier message: 07/12/2010, 00h16
  3. segmentation fault lors d'un pthread_create
    Par Anouschka dans le forum POSIX
    Réponses: 2
    Dernier message: 09/06/2010, 17h53
  4. erreur "Segmentation Fault" lors de l'import d'un dump
    Par farenheiit dans le forum Import/Export
    Réponses: 13
    Dernier message: 28/11/2007, 10h17
  5. PB segmentation fault lors d'installation RPM
    Par Asce_ dans le forum RedHat / CentOS / Fedora
    Réponses: 3
    Dernier message: 06/11/2007, 11h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo