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

C Discussion :

Problème portabilité?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut Problème portabilité?
    Salut les gens,
    J'ai un p'tit problème vraiment bizzare.
    Voilà le truc chelou, j'ai le code (en dessous), sous windows il marche nickel donc OK, mais ce soir je l'ai compilé sous linux ben disant que la compilation s'est bien déroulée mais quand je lance ca me fait un truc extrêmement bizzare, j'ai une fonction slip, qui effectu un glissement du pion (c'est une simulation de puissance 4), je m'explique on a la table suivante:
    les V désignent une case vide, les 0 désignent un pion déja inséré
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    V     V      V      V       V ...
    V     V      V      V       V ...
    V     0      V      V       V ...
    0     0      V       V       V ...
    .....
    Comme vous pouvez le remarquer, dans la colonne numéro 1, si j'insère un pion il doit tombé jusqu'au dérnier V vide, donc j'ai implémenté la fonction slip qui le fais, sous windows tout baigne, ca glisse et insère sans aucun problème.
    Mais, sous linux si j'insère dans la colonne: 1, 4, 5, 6 ou 7 tout marche nickel, et si j'insère dans les colonnes 2 ou 3 :shock: ca n'insère rien du tout, je ne comprend vraiment pas pourquoi, voilà le code source en entier.
    Main.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
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    #define COLUMNS  7
    #define LINES    6
    #define DONE     3
    #define PLAYER_1 1
    #define FULL     0
    #define CLEAR    system ("clear")
     
    typedef int PLATEAU[LINES+1][COLUMNS+1];
     
    int save;
     
    void InitPlat(PLATEAU pl)
    //Initialisation du plateau
    {
      int lcpt,
          ccpt;
     
        for (lcpt=1; lcpt < (LINES+1); lcpt++)
          pl[lcpt][0] = 0;//lcpt;
     
        for (ccpt=1; ccpt < (COLUMNS+1); ccpt++)
          pl[0][ccpt] = ccpt;
     
        for (lcpt=1; lcpt < (LINES+1); lcpt++)
         for (ccpt=1; ccpt < (COLUMNS+1); ccpt++)
           pl[lcpt][ccpt] = 0;
        pl[0][0] = 0;
    }
     
     
    void AffichPlat (PLATEAU pl)
    //affiche le plateau de jeu
    {
      int lcpt,
          ccpt;
     
        for (lcpt=0; lcpt < (LINES+1); lcpt++){
         for (ccpt=0; ccpt < (COLUMNS+1); ccpt++)
           printf("  %d  ",pl[lcpt][ccpt]);
           printf("\n\n\n");
        }
     
    }
     
    int StrToInt (const char* str)
    //conversion d'une chaine de caractères en un entier
    {
      int toc = 0;
     
       sscanf(str,"%d",&toc);
        if (toc == EOF) return (-1);
         else
          return toc;
    }
     
    int LirePos (void)
    {
     char tmp[16];
     int  ptmp;
     
      fgets (tmp, sizeof(tmp), stdin);
      ptmp = StrToInt (tmp);
       if (ptmp == EOF) return 0;
        return ptmp;
    }
     
    int slip (PLATEAU pl, int col, int play,  int lin)
    {
          if (lin < (LINES+1)){
            if ((pl[lin][col]==0)&&(pl[(lin+1)][col]!=0)){
                   pl[lin][col] = play;
                   save = lin;
                   return DONE;
                  }
            else
             slip (pl, col, play, (lin+1));
              }
             else{
               return FULL;
             }
    }
     
    int CheckIfWinner (PLATEAU pl, int col, int lin)
    {
      int count = 1,
          cpt,cpt2;
     
        for (cpt=lin; cpt<LINES; cpt++)
         if (pl[cpt][col] == pl[lin][col]) count++;
          else break;
         if (count == 4) return count;
         count = 1;
     
        for (cpt=(col+1); cpt<COLUMNS; cpt++)
          if (pl[lin][cpt] == pl[lin][col]) count++;
            else break;
           if (count == 4) return count;
            else{
              for (cpt=(col-1); cpt>0; cpt--)
               if (pl[lin][cpt] == pl[lin][col]) count++;
                else break;
                if (count == 4) return count;
               }
     
        for ((cpt=(col+1)),(cpt2=(lin+1));(cpt<COLUMNS)&&(cpt2<LINES); cpt++,cpt2++)
          if (pl[cpt2][cpt] == pl[lin][col]) count++;
            else break;
           if (count == 4) return count;
            else{
             for ((cpt=(col-1)),(cpt2=(lin-1));(cpt>0)&&(cpt2<0); cpt++,cpt2++)
               if (pl[cpt2][cpt] == pl[lin][col]) count++;
                else break;
                if (count == 4) return count;
               }
     
        for ((cpt=(col+1)),(cpt2=(lin-1));(cpt<COLUMNS)&&(cpt2>0); cpt++,cpt2--)
          if (pl[cpt2][cpt] == pl[lin][col]) count++;
            else break;
           if (count == 4) return count;
            else{
             for ((cpt=(col-1)),(cpt2=(lin+1));(cpt>0)&&(cpt2<LINES); cpt--,cpt2++)
               if (pl[cpt2][cpt] == pl[lin][col]) count++;
                else break;
                if (count == 4) return count;
               }
    }
     
    int main(void)
    {
      PLATEAU plat;
      int     pl, pc,
              flag  = 0,
              pflag = 0,
              i;
     
       InitPlat(plat);
       AffichPlat  (plat);
    do{
      flag = 0;
     do{
       pflag = 0;
      do{
       printf ("Player>");
        pc = LirePos();
         if ((pc < 1)||(pc > COLUMNS)) printf("Limit: 1 -> 7\n");
        }while ((pc < 1)||(pc > COLUMNS));
           pl = 0;
           i = slip (plat, pc, PLAYER_1,  pl);
           pflag = 1;
         CLEAR;
         AffichPlat  (plat);
         if ((i=CheckIfWinner (plat, pc, save))==4) printf("winner\n");
       }while (pflag == 0);
     
     do{
       pflag = 0;
      do{
       printf ("COM>");
        pc = LirePos();
         if ((pc < 1)||(pc > COLUMNS)) printf("Limit: 1 -> 7\n");
        }while ((pc < 1)||(pc > COLUMNS));
           pl = 0;
           i = slip (plat, pc, 2,  pl);
           pflag = 1;
         CLEAR;
         AffichPlat  (plat);
         if ((i=CheckIfWinner (plat, pc, save))==4) printf("winner\n");
       }while (pflag == 0);
     
      }while (flag == 0);
    	return 0;
    }
    Merci d'avance
    Compil your life guy!
    The Aures Project

  2. #2
    Expert confirmé

    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 : 44
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Sans avoir le temps de regarder plus en détail ton code, voici des warnings important:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    puis4.c: In function 'slip':
    puis4.c:86: warning: control reaches end of non-void function
    puis4.c: In function 'CheckIfWinner':
    puis4.c:131: warning: control reaches end of non-void function
    Surtout qu'ils risquent de poser problème...

  3. #3
    Expert confirmé

    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 : 44
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Je viens de comprendre... Pour que ta fonction slip marche, il faudrait peut-être mettre un garde fou à la dernière ligne non? C'est probablement pour cela que tu fais LINES+1 partout (ce qui est moche d'ailleurs)...

    Parce que là, tu initialises tout à 0, donc tu sors du tableau... Parce que ta fonction récursive va tout le temps dans l'appel récursif jusqu'au dépassement du tableau, tombe sur une zone mémoire non intialisé et donc c'est un comportement indéterminé...

    Bref, toute ta fonction récursive est à revoir (était-ce vraiment la peine, une version itérative serait plus judicieuse...

    Jc

  4. #4
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut
    Merci
    Compil your life guy!
    The Aures Project

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

Discussions similaires

  1. Ubuntu, problème portabilité projet d'une machine à une autre
    Par darkwall_37 dans le forum Code::Blocks
    Réponses: 0
    Dernier message: 14/10/2010, 03h46
  2. Problème de portabilité sous Linux
    Par eG.dam dans le forum Linux
    Réponses: 4
    Dernier message: 23/06/2006, 23h06
  3. Problème de portabilité vers Mac OS?
    Par doudoustephane dans le forum C++Builder
    Réponses: 8
    Dernier message: 16/08/2005, 07h53
  4. problème de Portabilité (erreur 1407)
    Par cgMorpheus dans le forum MFC
    Réponses: 3
    Dernier message: 06/03/2005, 21h00
  5. Problème de portabilité nmake / make
    Par Dozer dans le forum Systèmes de compilation
    Réponses: 3
    Dernier message: 25/01/2005, 22h38

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