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 :

Réécriture de SDL_LoadBMP


Sujet :

SDL

  1. #1
    Malikemal
    Invité(e)
    Par défaut Réécriture de SDL_LoadBMP
    Bonjour à tous,

    Je suis en train d'écrire une lib sur la SDL et je je bloque sur la réécriture de SDL_ LoadBMP ... Quand j'ai essaye d'utiliser cette fonction dans un programme, celui s'est fermé (je suis sur que ça vient de cette fonction) Voici la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SDL_Surface *my_SDL_LoadBMP(const char *file)
    {
    // écriture dans un fichier Log
    SDL_Surface *img = SDL_LoadBMP (file);
     
    // gestion des erreurs
     
    return img;
     
    }
    J'espère que vous pourrez m'aider !

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    As-tu vérifié si ton chemin est correct et que ton image soit vraiment un format BMP ? Sinon vu la simplicité du code il n'y a pas d'erreur à cet endroit ! Est-ce que tu as aussi initialisé la SDL avant tout autre chose ? Faudrait voir le reste du code.
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Malikemal
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SDL_Surface *m_SDL_LoadBMP(char *file, int ligne, char* fichier)
    {
        SDL_Surface *img = SDL_LoadBMP(file);
        suivi_log ("Chargement de l'image ", file);
     
        if(img == NULL)
        {
            erreur_log("[ERREUR] Le fichier n'a pas pu être chargé, il a donc été remplacé par une couler uni", ligne, fichier, NO_STOP);
            SDL_Surface *screen = SDL_GetVideoSurface();
            SDL_FillRect (img, NULL, SDL_MapRGB (screen->format, 255, 255, 255));
        }
     
        return img;
    }
    Voici donc le reste du code, et la SDL est initialisé c'est sur vu que dès que je remet la fonction normale ça marche .....

    Merci,

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Montre un code complet qui plante :-)
    Jc

  5. #5
    Malikemal
    Invité(e)
    Par défaut
    Voici :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <SDL.h>
    #include "log.h" // header contenant les fonctions d'écriture de ma lib
     
    int main ()
    {
     
    // initialisation de beaucoup de variables
     
    my_SDL_Init (SDL_INIT_VIDEO);
    SDL_Surface *ecran = my_SDL_SetVideoMode (LARGEUR, HAUTEUR, 32, SDL_HWSURFACE);
     
    SDL_Surface *menu = my_SDL_LoadBMP("menu.bmp");
     
    // .... De toute façon ça bug .....
     
    }
    J'Espère que vous pourrez m'aider !

    Merci,

  6. #6
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Et montre moi le log.h, ce serait plus simple si j'avais juste tout ton code...
    Jc

  7. #7
    Malikemal
    Invité(e)
    Par défaut
    Désolé :/

    Voici donc :
    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
     
    /*  Texte de la licence  */
     
    #ifndef DEF_ERREUR_SDL
    #define DEF_ERREUR_SDL
     
    #define NO_FLAG 0
     
    #define STOP 1
    #define NO_STOP 2
     
     
     
    /* ------------- Fonctions d'écriture ------------- */
     
    /*
    * Ecrit dans un fichier log.txt tout ce qui se passe dans le programmeet qui a un rapport avec la SDL
    * Le 2e argument correspond à une information supplémentaire
    */
     
     
     
    void suivi_log (char *chaine, const char *chaine_c);
    void erreur_log (char *chaine, int ligne, char *fichier, unsigned int flags);
     
    /* ------------------------------------------------ */
     
     
     
    #endif
    Avec en prime le log.c :

    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
    /* Texte de la licence */
    #include <SDL.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include "log.h"
     
    void suivi_log(char *chaine, const char *chaine_c)
    {
        FILE *log = NULL;
        log = fopen ("log.txt", "a");
        if (log != NULL)
        {
            if (chaine_c != NULL) // Si il y a un nom (d'image, de son ...) a ajouter au log
                sprintf (chaine, "%s '%s'", chaine, chaine_c);
     
            fprintf(log, "- ");
            fprintf (log, chaine);
            fprintf (log, "\n");
            fclose (log);
        }
        else
            fprintf (stderr, "L'ouvertre du fichier 'log.txt' a échoué !");
    }
     
    void erreur_log (char *chaine, int ligne, char* fichier, unsigned int flags)
    {
        FILE *log = NULL;
        log = fopen ("log.txt", "a");
     
        if (log != NULL)
     
        {
            fprintf (log, "[Ligne %d, fichier %s]  %s : %s\n", ligne, fichier, chaine, SDL_GetError());
     
            if ((flags & STOP) != 0)
            {
                fprintf(log, "Le proramme s'est fermé suite à cette erreur.");
                exit(EXIT_FAILURE);
            }
     
        }
    }

  8. #8
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Ok mais comment ton main connait la signature de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_Surface *menu = my_SDL_LoadBMP("menu.bmp");
    Où as-tu mis la définition de my_SDL_LoadBMP ?

    Et as-tu mis un include du fichier qui contient le main pour cette fonction ?

    Jc

  9. #9
    Malikemal
    Invité(e)
    Par défaut
    Le prototype de my_SDL_LoadBMP est dans un header inclut dans Log.h mais le problème ne vient pas de ça puisque le compilateur ne renvoie aucune erreur... Et pour le main, en fait c'est une lib que je suis en train de coder, mais oui j'ai mis l'include ! Le problème se pose à l'exécution, toutes les fonction contenues dans le fichier fonctionnent sauf celle-ci :/

    Merci,

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    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 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Nous allons arrêter de travailler dans le fou est apprendre à utiliser un débuggueur.
    Effectivement, pour le moment, vous ne savez pas vraiment quelle est la ligne qui cause l'erreur, vous avez une idée de la fonction, mais pas la ligne précisément.
    Donc, pour découvrir ce que fais vraiment le programme (et ce que vous faites mal) vous allez utiliser le debuggueur.
    Le débuggueur permet de:
    - S'arrêter aux lignes voulus (ou à la ligne qui crash )
    - Voir le contenu des variables
    - D'autres trucs

    Maintenant, pour l'utilisation, je ne sais pas trop comment décrire, car celui ci est dépendant de votre EDI. Mais, il suffit juste de:
    - Lancer le programme à partir de l'EDI en mode debug.
    - Voir ce qui se passe
    - Expérimenter
    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.

  11. #11
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Moi je ne vois toujours pas la signature. Le compilateur ne gueule pas donc tout va bien ? Non!!

    Montre tout le code du projet et on pourra avancer. Une version minimaliste, compilable qui plante.

    Jc

  12. #12
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    A l'aveuglette comme ça, je dirais que cela pourrait être le remplissage de la chaîne chaine passée en premier argument de ta fonction suivi_log qui peut foutre le bordel ! Comment est-elle définie cette chaîne ?
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  13. #13
    Malikemal
    Invité(e)
    Par défaut
    Je crois que Franck.H tient le bon bout ! J'ai en effet enlevé la fonction 'suivi_log' de 'm_SDL_LoadBMP', ça ne marchait toujours pas, puis j'ai copié la fonction 'm_SDL_LoadBMP' dans le main du projet Test, et là ! Pouf ! Ca marche !
    J'ai cherché et j'ai trouvé ! C'est bien ma fonction suivi_log qui faisait tout buggé ! J'avais un dépassement de mémoire à cause de ma méthode foireuse de copie de chaîne ! Voici la nouvelle version :

    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
    void suivi_log(char *chaine, const char *chaine_c)
    {
        FILE *log = NULL;
        log = fopen ("log.txt", "a");
        if (log != NULL)
        {
     
            fprintf(log, "- ");
     
            if (chaine_c != NULL) // Si il y a un nom (d'image, de son ...) a ajouter au log
                fprintf(log, "%s, %s", chaine, chaine_c);
            else
                fprintf (log, chaine);
     
            fprintf (log, "\n");
            fclose (log);
        }
        else
            fprintf (stderr, "L'ouvertre du fichier 'log.txt' a échoué !");
    Merci à tous ! Merci surtout à fearyourself qui allait me trucider là

    Merci encore !

  14. #14
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    De rien

    En effet, la prochaine fois, même si le code est trop gros, créé un code minimaliste compilable et qui plante aussi pour qu'on puisse t'aider au mieux et plus rapidement
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  15. #15
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    En passant (je fait un peu de pub ) ... Si tu fait beaucoup de manipulation de chaînes de caractères j'ai un objet String tout à fait fonctionnel et en constante évolution : https://sourceforge.net/projects/cstr/

    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  16. #16
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    J'ai en effet enlevé la fonction 'suivi_log' de 'm_SDL_LoadBMP', ça ne marchait toujours pas, puis j'ai copié la fonction 'm_SDL_LoadBMP' dans le main du projet Test, et là ! Pouf ! Ca marche !
    En fait, cela me fait penser que, depuis le début, ton problème est que quelqu'un ne connait pas la signature d'une de ces fonctions.

    Ton bug se résoud en mettant le my_SDL_LoadBMP dans le main, et bien cela confirme ce que je pense.

    Ou est-ce que cela marche maintenant que tu as remis tout en place?

    Jc

Discussions similaires

  1. La réécriture d'URL avec Apache
    Par agencep dans le forum Langage
    Réponses: 3
    Dernier message: 25/04/2006, 16h37
  2. Réécriture
    Par vins25 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 08/02/2006, 22h13
  3. Réécriture d'url en asp.
    Par éelise dans le forum ASP
    Réponses: 4
    Dernier message: 13/12/2005, 08h53
  4. [Manifest]Réécriture systématique
    Par leminipouce dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 25/11/2005, 11h20
  5. Probleme de réécriture
    Par scaleo dans le forum Langage
    Réponses: 3
    Dernier message: 27/10/2005, 17h00

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