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 :

Problème de compatibilité windows/linux projet SDL ?


Sujet :

SDL

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Problème de compatibilité windows/linux projet SDL ?
    Bonjour à tous,

    j'ai écrit un code à partir d'un tuto trouvé sur le net.

    Le but est de créer une image en niveaux de gris à partir d'un fichier texte de valeurs entre 0 et 255, et de le faire 200 fois pour afficher 200 images à la suite et faire une animation.

    Mon problème :

    ce programme marche nikel sous windows, et bloque sous linux, prétextant une erreur de segmentation. Je précise que la SDL est installée sous linux.

    Voici mon 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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <SDL/SDL.h>
    #include <windows.h>
     
     
     
    void pause();
    void definirPixel(SDL_Surface *surface, int x, int y, Uint32 pixel);
    Uint32 obtenirPixel(SDL_Surface *surface, int x, int y);
     
    void affichage()            
    {                                      
     
         int c; 
         FILE * fichier;     
         int tempo,i=0,j;
         char chaine[10] = "";
         int image[7656],k;
         int matriceimage[116][66];   
         char filename[30];
         int facteur=1; 
     
          SDL_Surface *ecran = NULL; // Le pointeur qui va stocker la surface de l'écran
          //SDL_Init(SDL_INIT_VIDEO);
     
          if( SDL_Init( SDL_INIT_VIDEO ) == -1 )
        {
            printf( "Can't init SDL:  %s\n", SDL_GetError( ) );
            //return EXIT_FAILURE;
        }
     
          ecran=SDL_SetVideoMode(116*facteur, 60*facteur, 32, SDL_HWSURFACE |SDL_RESIZABLE);                                       
     
          if( ecran == NULL )
        {
            printf( "Can't set video mode: %s\n", SDL_GetError( ) );
            //return EXIT_FAILURE;
        }   
     
     
         while(1)
         {
     
         for(c=0;c<399;c+=2)
         {                     
     
         sprintf(filename,"%d.txt", c);
         fichier=fopen(filename,"r");     //Ouverture des fichiers
     
     
     
        if (fichier != NULL)
        {
            while (fgets(chaine, 10, fichier) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
            {
                tempo=atoi(chaine);                    //Conversion chaine->entier
                image[i]=tempo;                        //Remplissage image
                i++;                                   //Incrémentation de i
     
            }
     
     
     
          k=0;                               //Creation de la matrice
          for(i=65;i>=0;i--)                 //
          {                                  //
             for(j=0;j<116;j++)              //
             {                               //
              matriceimage[j][i]=image[k];   //
              k++;                           //
             }                               //
          }                                  //
     
     
          SDL_LockSurface(ecran); /*On bloque la surface*/
     
     
          for(i=0;i<(116*facteur);i++)
          {
           for(j=0;j<(60*facteur);j++)
           {
     
          Uint32 pixel;
          Uint8 r,v,b,a;
     
          int couleur=matriceimage[(int)(i/facteur)][(int)(j/facteur)];
     
     
          pixel=obtenirPixel(ecran,i,j);
          SDL_GetRGBA(pixel, ecran->format, &r, &v, &b, &a);
     
          r=couleur;
          v=couleur;
          b=couleur;
          a=255;
     
          pixel=SDL_MapRGBA(ecran->format, r, v, b, a);
     
          definirPixel(ecran,i,j,pixel);
     
           }
          } 
          SDL_Flip(ecran);
          SDL_UnlockSurface(ecran); /*On libère la surface, elle peut être utilisée pour une autre tâche*/
          _sleep(55);     
     
              }
            }
          }
     
          /*
          for(c=0;c<399;c+=2) 
          {
          printf("essai");
          sprintf(filename,"%d.txt", c);
          remove(filename);
          }
          */
          pause();
          SDL_Quit();
     
     
     
     
    }                                           
     
     
    int main(int argc, char *argv[])            //Main
    { 
      affichage();
      return 0;
    } 
     
     
    ////////////////////////////////////////////////////////////////////////////////
     
    void pause()                                //fonction pause
    {                                           //
        int continuer = 1;                      //
        SDL_Event event;                        //
                                                //
        while (continuer)                       //
        {                                       //
            SDL_WaitEvent(&event);              //
            switch(event.type)                  //
            {                                   //
                case SDL_QUIT:                  //
                    continuer = 0;              //
            }                                   //         
        }                                       //
    }                                           //
     
     
     
    void definirPixel(SDL_Surface *surface, int x, int y, Uint32 pixel)
    {
        /*nbOctetsParPixel représente le nombre d'octets utilisés pour stocker un pixel.
        En multipliant ce nombre d'octets par 8 (un octet = 8 bits), on obtient la profondeur de couleur
        de l'image : 8, 16, 24 ou 32 bits.*/
        int nbOctetsParPixel = surface->format->BytesPerPixel;
        /*Ici p est l'adresse du pixel que l'on veut modifier*/
        /*surface->pixels contient l'adresse du premier pixel de l'image*/
        Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * nbOctetsParPixel;
     
        /*Gestion différente suivant le nombre d'octets par pixel de l'image*/
        switch(nbOctetsParPixel)
        {
            case 1:
                *p = pixel;
                break;
     
            case 2:
                *(Uint16 *)p = pixel;
                break;
     
            case 3:
                /*Suivant l'architecture de la machine*/
                if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
                {
                    p[0] = (pixel >> 16) & 0xff;
                    p[1] = (pixel >> 8) & 0xff;
                    p[2] = pixel & 0xff;
                }
                else
                {
                    p[0] = pixel & 0xff;
                    p[1] = (pixel >> 8) & 0xff;
                    p[2] = (pixel >> 16) & 0xff;
                }
                break;
     
            case 4:
                *(Uint32 *)p = pixel;
                break;
        }
    }
     
     
     
     
    /* ********************************************************************* */
    /*obtenirPixel : permet de récupérer la couleur d'un pixel
    Paramètres d'entrée/sortie :
    SDL_Surface *surface : la surface sur laquelle on va récupérer la couleur d'un pixel
    int x : la coordonnée en x du pixel à récupérer
    int y : la coordonnée en y du pixel à récupérer
     
    Uint32 resultat : la fonction renvoie le pixel aux coordonnées (x,y) dans la surface
    */
    Uint32 obtenirPixel(SDL_Surface *surface, int x, int y)
    {
        /*nbOctetsParPixel représente le nombre d'octets utilisés pour stocker un pixel.
        En multipliant ce nombre d'octets par 8 (un octet = 8 bits), on obtient la profondeur de couleur
        de l'image : 8, 16, 24 ou 32 bits.*/
        int nbOctetsParPixel = surface->format->BytesPerPixel;
        /* Ici p est l'adresse du pixel que l'on veut connaitre */
        /*surface->pixels contient l'adresse du premier pixel de l'image*/
        Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * nbOctetsParPixel;
     
        /*Gestion différente suivant le nombre d'octets par pixel de l'image*/
        switch(nbOctetsParPixel)
        {
            case 1:
                return *p;
     
            case 2:
                return *(Uint16 *)p;
     
            case 3:
                /*Suivant l'architecture de la machine*/
                if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
                    return p[0] << 16 | p[1] << 8 | p[2];
                else
                    return p[0] | p[1] << 8 | p[2] << 16;
     
            case 4:
                return *(Uint32 *)p;
     
            /*Ne devrait pas arriver, mais évite les erreurs*/
            default:
                return 0; 
        }
    }
     
     
     
     
    ////////////////////////////////////////////////////////////////////////////////
    Sous linux, une fenêtre s'affiche avec la première image puis le programme plante.

    Les différences entre windows et linux c'est la fonction _sleep(temps en ms) de la biblio windows.h et sous linux c'est sleep(temps en sec) de la biblio unistd.h

    Je suis desespéré, j'ai tout essayé...ou presque !

    Merci de votre aide

  2. #2
    Nouveau Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Une petite idée ?

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 896
    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 896
    Points : 219 548
    Points
    219 548
    Billets dans le blog
    125
    Par défaut
    Bienvenue à toi sur le forum,

    Sache que ce forum est à la pointe de la technologie, et qu'il permet de mettre le code dans des champs spéciaux pour avoir la coloration syntaxique.
    Pour ce faire il faut entourer le code des balises [ C O D E ] et [ / C O D E ] ( sans espaces ) accéssible par le bouton '#' du menu d'édition.
    Merci de éditer ton message pour faire ce changement.

    De plus tu dis avoir un problème sur le code linux, mais tu as posté celui pour windows.
    Peux tu poster celui pour linux que je teste

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Le code pour linux ne diffère que par la fonction _sleep(55) (temps en ms) qui doit etre sleep(1) (seconde par exemple).
    Ah oui, il faut aussi renommer la fonction pause en pause1 par exemple, car elle est deja définie dans unistd.h

    On doit juste enlever windows.h et rajouter unistd.h

    Ce programme fonctionne avec les fichiers .txt suivants que tu dois mettre dans le même dossier que le projet SDL.

    fichiers à cette adresse :

    http://www.megaupload.com/?d=KZNGSZJS

    Merci

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 896
    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 896
    Points : 219 548
    Points
    219 548
    Billets dans le blog
    125
    Par défaut
    première remarque , pour une meilleure compatibilité Linux/Windows, on utilise pas les sleep , mais le SDL_Sleep ( ou une fonction qui a un nom proche venant de la SDL , pour faire dormir le programme ).

    J'ai pas d'erreur de segmentation, mais juste une petite fenetre qui s'ouvre, toute noire....

Discussions similaires

  1. wchar_t, problème compatibilité Windows/Linux
    Par Climoo dans le forum Débuter
    Réponses: 10
    Dernier message: 20/05/2009, 19h28
  2. Problème de share windows/linux
    Par Empty_body dans le forum Réseau
    Réponses: 3
    Dernier message: 10/12/2006, 17h41
  3. les Threads (compatibilité Windows / Linux)
    Par ramislebob dans le forum C
    Réponses: 14
    Dernier message: 28/07/2006, 10h26
  4. Compatibilité Windows/linux
    Par ChriGoLioNaDor dans le forum C++
    Réponses: 5
    Dernier message: 09/01/2006, 23h39
  5. Problème de compatibilité Windows XP vers 98
    Par chleuh dans le forum EDI
    Réponses: 5
    Dernier message: 22/08/2005, 11h06

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