Passer un tableau 2D en paramètre en C

Messages postés
150
Date d'inscription
dimanche 28 septembre 2003
Statut
Membre
Dernière intervention
17 mars 2009
- - Dernière réponse : poiuytrez3
Messages postés
150
Date d'inscription
dimanche 28 septembre 2003
Statut
Membre
Dernière intervention
17 mars 2009
- 17 déc. 2005 à 20:19
Bonjour,

je souhaiterai passer en paramètre un tableau 2D, mais j'ai une erreur de compilation, voici mon code:

#include <stdio.h>

#include <stdlib.h>



void remplissage (int** tableau, int aLignes, int aColonnes)

{

int i;

int j;

for(i = 0; i < aLignes; i++)

for(j = 0; j < aColonnes; j++)

tableau[i][j] = 0;

}



int main()

{

const int lignes = 10;

const int colonnes = 20;

int tab[10][20];



// Rempli le tableau

remplissage(tab, lignes, colonnes);



system("PAUSE");



return 0;

}







Merci de votre aide!
Afficher la suite 

10 réponses

Messages postés
150
Date d'inscription
dimanche 28 septembre 2003
Statut
Membre
Dernière intervention
17 mars 2009
0
Merci
J'ai eu la réponse entre temps:

Il faut transformer le tableau 2D en tableau 1D, puis de faire joujou avec les pointeurs.

Voici le code corrigé:

#include <stdio.h>

#include <stdlib.h>



void remplissage (int** tableau, int aLignes, int aColonnes)

{

int i;

int j;

for(i = 0; i < aLignes; i++)

for(j = 0; j < aColonnes; j++)

//tableau[i][j] = 0;

*((int *)tableau+i+j) = 3;

for(i = 0; i < aLignes; i++)

for(j = 0; j < aColonnes; j++)


printf("%d",
tableau[i]);



}





int main()

{

const int lignes = 10;

const int colonnes = 20;

int tab[lignes][colonnes];



// Rempli le tableau

remplissage(tab, lignes, colonnes);



system("PAUSE");



return 0;

}
Commenter la réponse de poiuytrez3
Messages postés
150
Date d'inscription
dimanche 28 septembre 2003
Statut
Membre
Dernière intervention
17 mars 2009
0
Merci
PS: Si quelqu'un a une meilleure solution...
Commenter la réponse de poiuytrez3
Messages postés
14658
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
15 novembre 2019
90
0
Merci
fais un cast:
remplissage((int **)tab, lignes, colonnes);

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Commenter la réponse de BunoCS
Messages postés
150
Date d'inscription
dimanche 28 septembre 2003
Statut
Membre
Dernière intervention
17 mars 2009
0
Merci
Salut Bruno,

je viens d'essayer mais ça ne marche pas.

En fait ma technique n'est pas terrible, j'ai l'impression que ça ne marche pas bien...
Commenter la réponse de poiuytrez3
Messages postés
14658
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
15 novembre 2019
90
0
Merci
Moi, perso, je ne travaille pas avec des tableaux à plusieurs dimensions: une seule suffit avec de bons déplacements de pointeurs. Du coup, dans mes fonctions, je n'au que des "type *" en paramètres, c'est plus simple...

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Commenter la réponse de BunoCS
Messages postés
150
Date d'inscription
dimanche 28 septembre 2003
Statut
Membre
Dernière intervention
17 mars 2009
0
Merci
En fait je vais faire un programme de traitement d'image, et j'ai
besoin d'un tableau en 2D pour stocker les valeurs de couleurs de
chaque pixel. Donc j'ai absolument besoir de cette fonction.
Commenter la réponse de poiuytrez3
Messages postés
14658
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
15 novembre 2019
90
0
Merci
Du coup, utilise des "type **". Comme ça, tu peux les allouer dynamiquement:


m_Bitmap =
new rgb* [Height()];

for (
int i=0;i<Height();i++)
m_Bitmap[i]=
new rgb[Width()];

Si tu veux un coup de main sur ton appli, va voir ma source qui traite des BMP

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Commenter la réponse de BunoCS
Messages postés
150
Date d'inscription
dimanche 28 septembre 2003
Statut
Membre
Dernière intervention
17 mars 2009
0
Merci
En fait mon problème vient de la fonction. Je n'arrive pas à
comprendre pourquoi je ne peux pas utiliser tableau[i][j] de manière
générale et *((int *)tableau+i+j) doit avoir un bug.



J'ai juste besoin de ça. Mon problème est général, il ne se situe pas forcément sur l'histoire de l'image.



Merci.
Commenter la réponse de poiuytrez3
Messages postés
285
Date d'inscription
mardi 28 décembre 2004
Statut
Membre
Dernière intervention
20 janvier 2013
0
Merci
Perso je prefer les while, les for ne sont pas asser flexibles et on tendance à apporter des problème si tu ne sais pas exactement quand on doit verifier la condition de boucle. Si tu ecrit *((int *)tableau+i+j) = 3; tu dis que tableau[i+j] = 3 ! Par conséquent tu dépasse largement ton nombre de ligne et tu fais pointer tes ignes sur l'adresse mémoire 0x00000003 !!!

void remplissage (int** tableau, int aLignes, int aColonnes)
{
int i;
int j;
i = 0;
while(i < aLignes)
{
j = 0;
while(j < aColonnes)
{
//Formalisme tableau
tableau[i][j] = 0;
//Formalisme pointeur
*(*(tableau + i) + j) = 0;
j++;
}
i++;
}
}

Le travail c'est la santé, ne rien faire c'est la préservé !!!
Commenter la réponse de ctx_man
Messages postés
150
Date d'inscription
dimanche 28 septembre 2003
Statut
Membre
Dernière intervention
17 mars 2009
0
Merci
Beau gosse!
Je vais essayer la semaine prochaine, la je pars en vacances ;)

Merci!
Commenter la réponse de poiuytrez3