cs_snake57
Messages postés204Date d'inscriptionvendredi 19 novembre 2004StatutMembreDernière intervention 1 novembre 2011
-
25 mai 2010 à 04:57
cs_snake57
Messages postés204Date d'inscriptionvendredi 19 novembre 2004StatutMembreDernière intervention 1 novembre 2011
-
25 mai 2010 à 23:56
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;
}
A voir également:
Tableau a 3 dimension
Tableau 3 dimensions c - Meilleures réponses
Passer un tableau à deux dimension en paramètre c - Meilleures réponses
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 25 mai 2010 à 12:30
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;
}
lectpe
Messages postés162Date d'inscriptionlundi 12 novembre 2007StatutMembreDernière intervention17 juillet 20103 25 mai 2010 à 13:04
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" ?
lectpe
Messages postés162Date d'inscriptionlundi 12 novembre 2007StatutMembreDernière intervention17 juillet 20103 25 mai 2010 à 10:09
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.
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 25 mai 2010 à 13:48
@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 !
lectpe
Messages postés162Date d'inscriptionlundi 12 novembre 2007StatutMembreDernière intervention17 juillet 20103 25 mai 2010 à 14:29
@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.
cs_snake57
Messages postés204Date d'inscriptionvendredi 19 novembre 2004StatutMembreDernière intervention 1 novembre 2011 25 mai 2010 à 23:56
@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.