Passage de tableau à 3 dimensions en paramètre à une fonction [Résolu]

Signaler
Messages postés
204
Date d'inscription
vendredi 19 novembre 2004
Statut
Membre
Dernière intervention
1 novembre 2011
-
Messages postés
204
Date d'inscription
vendredi 19 novembre 2004
Statut
Membre
Dernière intervention
1 novembre 2011
-
Bonjour à tous,

J'ai un tableau à 3 dimensions que je veux afficher à partir d'une fonction. J'ai donc créé une fonction mais celle-ci affiche...n'importe quoi

Lorsque j'affiche mon tableau à partir du main, tout va bien. Mais dès que c'est la fonction qui l'affiche, ca me met n'importe quoi.

Peut être que je mis prend mal avec les pointeurs.

Ce que je veux faire tout simplement c'est afficher mon tableau à partir de ma fonction.

Je vous met le code pour plus de clarté (il est pas long rassurez-vous)



#include <stdio.h>
#include <stdlib.h>

int affichage(char *tAb, int dIm1,int dIm2,int dIm3); // Cette fonction réalise l'affichage.


int main()
{
    int i,j,k;//Variables de boucles

    char tAbGrille[9][21][1];//Tableau à trois dimensions
    char *pTab = tAbGrille;//Pointeur de ce tableau
  
    //Initialisation du tableau, on remplit celui-ci avec des caractères '_'.
    for (i=0; i<=9; i++){
        for (j=0; j<=21; j++){
            for (k=0; k<=1; k++){
                tAbGrille[i][j][k] = '_';
            }
        }
    }
    //affichage pour testé si il a bien été remplie <==ici tous s'affiche bien
    for (i=0; i<=9; i++){
        for (j=0; j<=21; j++){
            for (k=0; k<=1; k++){
                printf(" %c ", tAbGrille[i][j][k]);
            }
        }
    }

    affichage(pTab, 9, 21, 1);//appelle de la fonction
    return 0;
}


int affichage(char *tAb, int dIm1,int dIm2,int dIm3)
{
    int i,j,k;//Variables de boucles

    //Affichage du tableau <== Ici l'affichage n'est pas correct.
    for (i=0; i<=dIm1; i++){
        for (j=0; j<=dIm2; j++){
            for (k=0; k<=dIm3; k++){
                printf(" %c ", tAb);
                tAb++;
            }
        }
    }

    return 0;
}


8 réponses

Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
113
Fonctionne techniquement, mais génère un gros warning. Je te déconseille cette méthode.
Préfère la seconde.
#include <stdio.h>
#include <stdlib.h>

int affichage(char* tAb, int dIm1,int dIm2,int dIm3)
{
  int i,j,k;

  for (i = 0; i < dIm1; ++i)
    for (j = 0; j < dIm2; ++j)
      for (k = 0; k < dIm3; ++k)
      {
printf(" %c ", *tAb);
++tAb;
      }

  return 0;
}

int main(void)
{
  int i,j,k;

  char tAbGrille[9][21][1];
  char* pTab = tAbGrille;

  /* Initialisation du tableau,
     on remplit celui-ci avec des caractères '_'. */
  for (i = 0; i < 9; ++i)
    for (j = 0; j < 21; ++j)
      for (k = 0; k < 1; ++k)
tAbGrille[i][j][k] = '_';

  /* affichage pour testé si il a bien été remplie
     <==ici tous s'affiche bien */
  for (i = 0; i < 9; ++i)
    for (j = 0; j < 21; ++j)
      for (k = 0; k < 1; ++k)
printf(" %c ", tAbGrille[i][j][k]);

  affichage(pTab, 9, 21, 1);

  return 0;
}


Préfère cette méthode, plus rigoureuse:
#include <stdio.h>
#include <stdlib.h>

int affichage(char tAb[9][21][1], int dIm1,int dIm2,int dIm3)
{
  int i,j,k;

  for (i = 0; i < dIm1; ++i)
    for (j = 0; j < dIm2; ++j)
      for (k = 0; k < dIm3; ++k)
printf(" %c ", tAb[i][j][k]);

  return 0;
}

int main(void)
{
  int i,j,k;

  char tAbGrille[9][21][1];

  /* Initialisation du tableau,
     on remplit celui-ci avec des caractères '_'. */
  for (i = 0; i < 9; ++i)
    for (j = 0; j < 21; ++j)
      for (k = 0; k < 1; ++k)
tAbGrille[i][j][k] = '_';

  /* affichage pour testé si il a bien été remplie
     <==ici tous s'affiche bien */
  for (i = 0; i < 9; ++i)
    for (j = 0; j < 21; ++j)
      for (k = 0; k < 1; ++k)
printf(" %c ", tAbGrille[i][j][k]);

  affichage(tAbGrille, 9, 21, 1);

  return 0;
}


_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Messages postés
162
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
17 juillet 2010
3
Bah c'est bizarre, chez moi ça marche bien. Voici le code que j'ai :

int affichage(char *tAb, int dIm1,int dIm2,int dIm3); // Cette fonction réalise l'affichage.

int main()
{
    int i,j,k;//Variables de boucles

    char tAbGrille[9][21][1];//Tableau à trois dimensions
    char *pTab = **tAbGrille;//Pointeur de ce tableau
  
    //Initialisation du tableau, on remplit celui-ci avec des caractères '_'.
    for (i=0; i<9; i++){
        for (j=0; j<21; j++){
            for (k=0; k<1; k++){
                tAbGrille[i][j][k] = '_';
            }
        }
    }
    //affichage pour testé si il a bien été remplie <==ici tous s'affiche bien
    for (i=0; i<9; i++){
        for (j=0; j<21; j++){
            for (k=0; k<1; k++){
                printf("%c", tAbGrille[i][j][k]);
            }
        }
    }
    
    affichage(pTab, 9, 21, 1);//appelle de la fonction
    return 0;
}


int affichage(char *tAb, int dIm1,int dIm2,int dIm3)
{
    int i,j,k;//Variables de boucles

    //Affichage du tableau <== Ici l'affichage n'est pas correct.
    for (i=0; i<dIm1; i++){
        for (j=0; j<dIm2; j++){
            for (k=0; k<dIm3; k++){
                printf("%c", *tAb);
                tAb++;
            }
        }
    }

    return 0;
}


Es-tu sûr d'avoir changé les "inférieur ou égal" en "strictement inférieur" ?
Messages postés
162
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
17 juillet 2010
3
Salut.

Bah déjà, tu déclares un tableau à trois dimensions dont les tailles respectives sont : 9, 21 et 1 et quand tu le remplis, tu vas jusqu'aux tailles 10, 22 et 2 à cause du "i= 0;i <= 9. Il faut donc enlever ce "< =" et mettre un "<".

Ensuite, pTab est un pointeur vers une case de ce tableau, donc il pointe non pas vers tAbGrille mais vers **tAbGrille.

Pour finir, dans ta fonction d'affichage, c'est pas tAb que tu veux afficher (qui est un pointeur) mais la valeur pointée par celui-ci qui est *tAb.

Voilà. Avec ces petites modifications, j'ai testé ton code et ça marche.

Cordialement, Greg.
Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
113
Je suis même étonné que tu n'ai pas de warnings !
char* tAb => tableau à une dimension.
Pour un tableau à trois dimensions: char*** tAb;

Soit dit en passant, tu n'as pas besoin de pTab. Le tableau tAbGrille est déjà un pointeur (en C un tableau et un pointeur, c'est la même chose).

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Messages postés
204
Date d'inscription
vendredi 19 novembre 2004
Statut
Membre
Dernière intervention
1 novembre 2011

J'ai testé en mettant tes modifs lectpe, mais lorsque j'exécute au lieu de m'afficher ce qu'il faut dans la fenêtre, il me met "segmentation fault".

Par contre aucun soucis pendant la compilation.

Tu vois ce que sa peut être?
Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
113
@lectpe: oui oui, ce que tu as fait fonctionne très bien. En revanche, je préfère lui donner une autre solution car la tienne ne fonctionne que si on utilise des tableaux dont la taille est prédéfinis à la compilation, car les données seront alors concomittantes. Mais si on on remplace char tab[][][], par char*** tab + malloc/free, il risque d'avoir des surprises !

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Messages postés
162
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
17 juillet 2010
3
@CptPingu : Effectivement, tu as raison, mais en fait, mon dernier message s'adressait à snake57 car il a dit que le code modifié comme je lui ai dit renvoyait une erreur de segmentation, alors je lui ai envoyé mon message pour voir s'il n'avais pas oublié de modifier quelque chose.

@snake57 : le code donné par CptPingu est effectivement plus rigoureux et tu devrais l'utiliser plutôt que la première méthode que tu utilisais. Cette seconde méthode est exactement adaptée pour la taille du tableau que tu utilises et ainsi, tu n'as pas besoin d'utiliser explicitement les pointeurs.
Messages postés
204
Date d'inscription
vendredi 19 novembre 2004
Statut
Membre
Dernière intervention
1 novembre 2011

@lectpe : ton code fonction effectivement. Quand je le copie/colle tout va bien, j'ai sans doute zappé une des modifs que tu avais cité.

@CptPingu : Merci pour ton code, je j'ai testé et il fonctionne aussi. Du coup comme lectpe et toi aviez l'air d'être d'accord sur le faite qu'il était mieux, je prendrais celui la au final.

Merci encore a tous les deux
++