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 :

Dépassement de tableau


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Dépassement de tableau
    Bonjour à tous,

    Newbi en programmation je m'exerce sur une bataille navale, cependant je me retrouve très vite bloqué sur des soucis qui me prennent des heures et des heures.
    Le dernier en question est un depassement de tableau.
    J'aimerais un petit coup de pouce pleaaaaaaase :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int bateau_aleatoire(char grille[ligmax][colmax])                           
        {                                                      
                int i, j, k;
                k = rand() % 10; 
     
                for (i = k ; i < k+5 ; i++)
                if ( k%2 == 0) {grille[i][k] = '5';}  //porte avion 5 cases à la verticale si k paire
               else {grille [k][i] = '5';}             // sinon à l'horizontale
         }
    j'aimerais trouver une solution avec un "do... while" comme ceci : si possible??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int bateau_aleatoire(char grille[ligmax][colmax])                           
        {                                                      
                int i, j, k;
                k = rand() % 10; 
                
                do {
                for (i = k ; i < k+5 ; i++)
                if ( k%2 == 0) {grille[i][k] = '5';}  
                else {grille [k][i] = '5';}}            
                while (k != grille[i][0] && k != grille[0][j]);}
    Thank's a lot^^

  2. #2
    Membre averti

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Points : 354
    Points
    354
    Par défaut
    Oula...
    Si tu rajoutes un do while comme ca, ca veut plus dire grand chose !
    En fait, si ce que tu cherches à faire c'est juste changer un "for" en "do while", tu pourrais écrire ca comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int bateau_aleatoire(char grille[ligmax][colmax]) 
    { 
    int i, j, k;
    k = rand() % 10; 
    i=k;
    do {
    if ( k%2 == 0) {grille[i][k] = '5';} 
    else {grille [k][i] = '5';}} 
    i++;
    while (i<k+5);
    }
    Mais vu ce que tu as écris ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    do {
    for (i = k ; i < k+5 ; i++)
    if ( k%2 == 0) {grille[i][k] = '5';} 
    else {grille [k][i] = '5';}} 
    while (k != grille[i][0] && k != grille[0][j]);}
    J'ai aucune idée de ce que c'est censé faire, mais ca risque fort de faire n'importe quoi! T'auras peut etre une erreur de segmentation si tu dépasses ton tableau, mais étant donné que le "j" n'est pas initialisé, ni meme modifié quelque part, ya peu de chance que tu sortes de ta boucle; et aussi, comme k est aléatoire, on sait pas si un jour, k sera egal a grille[i][0]...
    En fait je me demande bien ce que tu essayes de faire là !
    Et puis ta fonction est censée retourner un "int" mais là elle ne retourne rien...
    A mon avis, tu dois avoir du mal a compiler tout ca sans warnings...

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 4
    Points : 1
    Points
    1
    Par défaut non toujours pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //fonction qui place une chaine k de 5 int, soit horizontalement soit
     //verticalement dans un tableau
     
    int bateau_aleatoire(char grille[11][11])                           
        {                                                      
                int i, j, k;
                k = rand() % 10; 
     
                for (i = k ; i < k+5 ; i++)
                if ( k%2 == 0) {grille[i][k] = '5';}  //porte avion 5 cases à la verticale si k paire
               else {grille [k][i] = '5';}               // sinon à l'horizontale
         }
    J'aimerais créer une boucle pour que la chaine ne s'affiche pas ni sur la colone 0 ni sur la ligne 0. Bref que ca ne sorte pas du tableau et que la chaine soit sur une seule et meme ligne ou colone. Aye Aye dur dur dur

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par infoblem67 Voir le message
    Bonjour à tous,

    Newbi en programmation je m'exerce sur une bataille navale, cependant je me retrouve très vite bloqué sur des soucis qui me prennent des heures et des heures.
    Le dernier en question est un depassement de tableau.
    J'aimerais un petit coup de pouce pleaaaaaaase :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int bateau_aleatoire(char grille[ligmax][colmax])                           
        {                                                      
                int i, j, k;
                k = rand() % 10; 
     
                for (i = k ; i < k+5 ; i++)
                if ( k%2 == 0) {grille[i][k] = '5';}  //porte avion 5 cases à la verticale si k paire
               else {grille [k][i] = '5';}             // sinon à l'horizontale
         }
    C'est pas très clair ton code. Tu parles de bateau, de porte avion...

    Tu cherches à faire quoi ? Un placement aléatoire d'un porte-avion de 5 cases (marqués '5') dans une grille de ligmax x colmax, c'est ça ?

    Pour ça, il faut

    1 - tirer une orientation (vert, hor)
    2 - tirer une position (lin, col) (Les limites dépendent de l'orientation)
    3 - vérifier si il peut être placé (pas de bateau au même endroit), ni de bateau trop prés, enfin ça dépend de tes règles de placement...)
    4 - En cas d'erreur, recommencer (1)
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 4
    Points : 1
    Points
    1
    Par défaut oui mais
    c'est bien ce que je cherche a faire mais je n'y arrive pas...

    pas comme ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    |5|1|2|3|4|5|6|7|8|9|0|
    |5|   | | | | | | | | |
    |5| | | | | | | | | | |
    |5| | | | | | | | | | |
    |5| | | | | | | | | | |
    |E| | | | | | | | | | |
    |F| | | | | | | | | | |
    |G| | | | | | | | | | |
    |H| | | | | | | | | | |
    |I| | | | | | | | | | |
    |J| | | | | | | | | | |
    J'aimerais qu'il soit dans le tableau sur une seule ligne ou colone, ni sur la ligne 0 des 1 à 9, ni sur la colone 0 des A a J...

    j'espere avoir expliqué correctement.

    C'est juste une question d'affichage. Il faut considérer la zone de jeux comme la référence. L'affichage des repères se fait avant.

    Ce que tu veux, c'est ceci :
    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
     
    #include <stdio.h>
     
    /*
     
                        1
      1 2 3 4 5 6 7 8 9 0
    A
    B
    C
    D
    E
    F
    G
    H
    I
    J
    */
     
    #define NB_COL 10
    #define NB_LIN 10
     
    int main (void)
    {
       int jeu[NB_LIN][NB_COL] = {
          {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
          {0, 0, 5, 5, 5, 5, 5, 0, 0, 0},
          {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
          {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
          {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
          {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
          {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
          {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
          {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
          {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
     
       };
     
       int i;
     
       /* dizaines des colonnes */
       printf (" ");
       {
          int n = 1;
          for (i = 0; i < NB_COL; i++)
          {
             if (n < 10)
             {
                printf ("  ");
             }
             else
             {
                printf ("%2d", n / 10);
             }
             n++;
          }
          printf ("\n");
       }
       /* unites des colonnes */
       printf (" ");
       {
          int n = 1;
          for (i = 0; i < NB_COL; i++)
          {
             printf ("%2d", n % 10);
             n++;
          }
          printf ("\n");
       }
     
    /* lignes */
       {
          static char const s[] = "ABCDEFGHIJ";
          int i;
          for (i = 0; i < NB_LIN; i++)
          {
             printf ("%c", s[i]);
     
             /* afficher une ligne du tableau */
             {
                int j;
                for (j = 0; j < NB_COL; j++)
                {
                   printf ("%2d", jeu[i][j]);
                }
             }
             printf ("\n");
          }
       }
       return 0;
    }
    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
     
                        1
      1 2 3 4 5 6 7 8 9 0
    A 0 0 0 0 0 0 0 0 0 0
    B 0 0 5 5 5 5 5 0 0 0
    C 0 0 0 0 0 0 0 0 0 0
    D 0 0 0 0 0 0 0 0 0 0
    E 0 0 0 0 0 0 0 0 0 0
    F 0 0 0 0 0 0 0 0 0 0
    G 0 0 0 0 0 0 0 0 0 0
    H 0 0 0 0 0 0 0 0 0 0
    I 0 0 0 0 0 0 0 0 0 0
    J 0 0 0 0 0 0 0 0 0 0
     
    Process returned 0 (0x0)   execution time : 0.040 s
    Press any key to continue.

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 4
    Points : 1
    Points
    1
    Par défaut on y est pas encore
    non ce n'est pas du tout ce que je cherche...

    Voici mon programme en entier;

    il y a des erreurs jen suis navré mais peut etre celà va faire avancer le schmilblik.
    N'hessitez pas à le tester jcrois que ya que comme ca qu'on y verra plus claire. MERCI Je bloque à la fonction du placement aléatoire d'un bateau dans la grille; a savoir qu'il se place mais pas forcement correctement.


    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
    #include <stdio.h>
    #include <string.h>
    
    #define ligmax 11
    #define colmax 11
    
    
    void affiche_grille (char grille[ligmax][colmax]);  // fct affichage grille
    void ini_grille(char grille[ligmax][colmax]);         // fct initialisation grille
    
    int bateau(char grille[ligmax][colmax]);            // fct initialisation bateaux stockés
    
    float coup_attaque(char new_grille[ligmax][colmax],char grille[ligmax][colmax]);  // fct attaque, coup sur int bateau
            
    
    int main ()
    {   
        srand(time(NULL));      //Initialisation du generateur de nb aleatoire
        
        char grille [ligmax][colmax]={ };     /* tableau grille de ligmax ligne et de colmax colones*/
        char new_grille[ligmax][colmax]={ };
                                                              
        printf ("-----Bataille Naval-----\n\n\n\n");
        
        printf ("Bateau aleatoire\n\n\n");
        
        ini_grille(grille);                                   // appel de fonction
        bateau_aleatoire(grille);
        
        affiche_grille (grille);                                
        printf ("\n\n\n\n"); 
        
            
             ini_grille(new_grille);  
             
             coup_attaque(new_grille, grille);
             affiche_grille(new_grille);
        
           
        printf ("\n\n\n\n");
        
        system ("pause"); 
    
        return 0;       
    }
    
    
        // fonction affichage grilles 
        void affiche_grille ( char grille[ligmax][colmax])  
        {
            int i,j;   // i ligne, j colone
        
            for (i=0 ; i<ligmax ; i++)              // incr?mente i de 0 ? ligmax
            {
                for (j=0 ; j<colmax ; j++)         // j de 0 ? colmax         // stephane : modif de colmax+1 en colmax ...
                  printf ("|%c", grille[i][j]);       // affiche la grille pour i ligne, j colone       
                printf ("|\n");                    
             }
        }  
        
        
        // fonction initialisation de la grille         
        void  ini_grille(char grille[ligmax][colmax])      
        {
              int i, j;  // i ligne, j colone
    
              for (i = 0 ; i < ligmax ; i++)        // incr?mente l'espace disponible de la grille
              for (j = 0 ; j < colmax ; j++)
              grille[i][j] = ' ';
    
              for (i = 1 ; i < colmax ; i++)        // incr?mente i de 1 ? 10 ? partir de la case [0][1]
              grille[0][i] = '0' + i;
              grille[0][10] = '0';                     // case [0][10] de valeur 10
                
              for (j = 1 ; j < ligmax ; j++)        // idem j de A ? ligmax donc J
              grille[j][0] = 'A' + j - 1;
        }
    
    
    
        // fonction bateaux aléatoires  C'EST ICI QUE JE BLOQUE
        // 1 porte-avion 5 cases 2 destroyers 3 cases 1 sous-marins 2 cases 1 croiseur 4 cases
        int bateau_aleatoire(char grille[ligmax][colmax])                           
        {                                                      
                int i, j, k;
                
                k = rand() % 10; 
                
                for (i = k ; i < k+5 ; i++)
                if ( k%2 == 0) {grille[i][k] = '5';}    // porte avion 5 cases à la verticale si k paire 
                else {grille [k][i] = '5';}                 // sinon à l'horizontale   
        } 
                
                
        
        
        // fonction coup d'attaque 
        float coup_attaque(char new_grille[ligmax][colmax],char grille[ligmax][colmax])
        {    
                  char affiche_grille ( char grille[ligmax][colmax])  
                 { int i,j;   
                     for (i=0  ; i<ligmax ; i++)             
                     {
                       for (j=0 ; j<colmax ; j++)         
                       printf ("|%c", grille[i][j]);    
                       printf ("|\n");                    
                     }} 
             
             
                         
             int i, j;
             int compteur=3;                     // compteur pour 17 t
                      
             while (compteur != 0)                //  je boucle jusqu'a ce que le compteur soit a 0
             {
             
             
                     printf("Entrer les coordonnees de la case a attaquer (ex B5) : ");
                     i = (int) getchar();                        // entr?e des coordonn?es
                     j = (int) getchar();    
                     getchar ();         
                     
                     i=i-64;                                 // calcul ligne
                     j=j-48;                                 // calcul colonne
                     printf("Ligne : %d \nColonne : %d\n",i,j);
                     
                     
                                  
             if (j > '10')                                   // affichage d'erreur
             printf ("!!!! ERREUR DE LIGNE !!!!\n\n");
             if (i >= 'H')                                        
             printf ("!!!! ERREUR DE COLONNE !!!!\n\n");
                     
                     
             if (grille[i][j] == '5')     
                {
                    compteur--;                    // d?crementation du compteur
                    printf ("Touch\x82 !\n\n");
                    new_grille[i][j] = 't';
                    affiche_grille(new_grille);
                    printf("\n\n");
                }                     
             else 
                {
                    printf ("Rat\x82 !\n\n");
                    new_grille[i][j] = 'x';
                    affiche_grille(new_grille);
                    printf("\n\n");
                }
                    
             } system("cls"); //Nettoye la fenetre windows ne compile pas les coups ds la fenetre apres une attaque
               printf ("\n\n    !!!! GAGNE !!!!\n\n");
                
        }

Discussions similaires

  1. Dépassement du quotas maximal pour la longueur du tableau
    Par MaximeLeroy dans le forum Windows Communication Foundation
    Réponses: 5
    Dernier message: 18/07/2013, 16h06
  2. Dépassement de capacité Tableau dynamique VBA
    Par hehee dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 01/06/2013, 18h21
  3. Problème de dépassement de tableau
    Par scary dans le forum C
    Réponses: 4
    Dernier message: 10/01/2010, 16h16
  4. Réponses: 3
    Dernier message: 11/09/2007, 18h20
  5. segfault dépassement tableau ?
    Par ggnore dans le forum C
    Réponses: 7
    Dernier message: 22/12/2005, 17h39

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