Pointeurs et tableaux 2D en C
Résolu/Fermé
jcl571
-
18 nov. 2008 à 03:52
jcl571 Messages postés 36 Date d'inscription mardi 18 novembre 2008 Statut Membre Dernière intervention 12 août 2009 - 18 nov. 2008 à 19:22
jcl571 Messages postés 36 Date d'inscription mardi 18 novembre 2008 Statut Membre Dernière intervention 12 août 2009 - 18 nov. 2008 à 19:22
A voir également:
- Pointeurs et tableaux 2D en C
- Tableaux croisés dynamiques - Guide
- Plan 2d gratuit - Télécharger - Architecture & Déco
- 37 2d 3f 3d 31 - Guide
- Fusionner deux tableaux excel - Guide
- Mise en forme tableau word - Guide
4 réponses
Droopy_
Messages postés
248
Date d'inscription
dimanche 16 novembre 2008
Statut
Membre
Dernière intervention
17 janvier 2009
25
18 nov. 2008 à 04:11
18 nov. 2008 à 04:11
Je corrige :
&tab[0] = tab
tab[0] est le premier élément et & est l'opérateur d'adresse.
Pour un tableau à deux dimension ça marche pareil,
&tab[0][0] = tab
Tu peux donc passer juste tab à ta fonction.
Il faut par contre que le prototype de la fonction (sa définition) soit correcte.
&tab[0] = tab
tab[0] est le premier élément et & est l'opérateur d'adresse.
Pour un tableau à deux dimension ça marche pareil,
&tab[0][0] = tab
Tu peux donc passer juste tab à ta fonction.
Il faut par contre que le prototype de la fonction (sa définition) soit correcte.
Droopy_
Messages postés
248
Date d'inscription
dimanche 16 novembre 2008
Statut
Membre
Dernière intervention
17 janvier 2009
25
18 nov. 2008 à 04:22
18 nov. 2008 à 04:22
Un exemple :
void zero(int **t)
{
int i,j;
for(i=0; i<2; i++)
for(j=0; j<3; j++)
t[i][j]=0;
};
void main()
{
int tab[2][3];
zero(tab);
};
Je l'ai pas compilé mais bon ça devrait être ok.
void zero(int **t)
{
int i,j;
for(i=0; i<2; i++)
for(j=0; j<3; j++)
t[i][j]=0;
};
void main()
{
int tab[2][3];
zero(tab);
};
Je l'ai pas compilé mais bon ça devrait être ok.
Tu as parfaitement raison pour ce qui est de &tab[0] = tab et non &tab[i], merci de la correction :)
Et j'avais fait un mauvais test pour vérifier l'équivalent, &tab[0][0] est bien équivalent a tab. Je l'avais bien deviné mais j'avais bloqué pour passer le tableau à une fonction, car j'obtiens les 2 warning suivants(ces warning sont obtenus avec la fonction test que tu m'a donnée, mais j'obtiens les même avec mes fonctions):
warning C4047: 'function' : 'int ** ' differs in levels of indirection from 'int [2][3]'
warning C4024: 'zero' : different types for formal and actual parameter 1
Est-ce qu'il y a moyen de ne pas avoir ces warning?(ça marche quand même, mais ça m'irrite d'avoir des warning :P)
Et j'avais fait un mauvais test pour vérifier l'équivalent, &tab[0][0] est bien équivalent a tab. Je l'avais bien deviné mais j'avais bloqué pour passer le tableau à une fonction, car j'obtiens les 2 warning suivants(ces warning sont obtenus avec la fonction test que tu m'a donnée, mais j'obtiens les même avec mes fonctions):
warning C4047: 'function' : 'int ** ' differs in levels of indirection from 'int [2][3]'
warning C4024: 'zero' : different types for formal and actual parameter 1
Est-ce qu'il y a moyen de ne pas avoir ces warning?(ça marche quand même, mais ça m'irrite d'avoir des warning :P)
Droopy_
Messages postés
248
Date d'inscription
dimanche 16 novembre 2008
Statut
Membre
Dernière intervention
17 janvier 2009
25
18 nov. 2008 à 16:25
18 nov. 2008 à 16:25
Sans promesses, j'ai pas de compilo sous la main pour tester,
Tu as deux choix, changer le prototype (j'en suis pas tout à fait certain) :
void zero(int t[][])
Ou alors lors de l'appel et mets :
zero((int**)tab);
Ce qui transforme ton tableau à deux dimension en un pointeur de pointeur.
Tu as deux choix, changer le prototype (j'en suis pas tout à fait certain) :
void zero(int t[][])
Ou alors lors de l'appel et mets :
zero((int**)tab);
Ce qui transforme ton tableau à deux dimension en un pointeur de pointeur.
jcl571
>
Droopy_
Messages postés
248
Date d'inscription
dimanche 16 novembre 2008
Statut
Membre
Dernière intervention
17 janvier 2009
18 nov. 2008 à 18:05
18 nov. 2008 à 18:05
Si je change le prototype pour void zero(int t[][50]) (la 2e dimension doit etre mentionnée si je me souviens bien), est-ce que ça recopie tout le tableau ou seulement l'adresse de la première case?
Droopy_
Messages postés
248
Date d'inscription
dimanche 16 novembre 2008
Statut
Membre
Dernière intervention
17 janvier 2009
25
>
jcl571
18 nov. 2008 à 18:10
18 nov. 2008 à 18:10
Je sais pas trop.
J'utilise toujours des pointeurs, comme ça je suis sûr ;-)
J'utilise toujours des pointeurs, comme ça je suis sûr ;-)
jcl571
>
Droopy_
Messages postés
248
Date d'inscription
dimanche 16 novembre 2008
Statut
Membre
Dernière intervention
17 janvier 2009
18 nov. 2008 à 18:12
18 nov. 2008 à 18:12
C'est ce que j'aimerais faire, mais en plus d'être irritants, les warning sont fortement pénalisés lors de la correction ;)
Droopy_
Messages postés
248
Date d'inscription
dimanche 16 novembre 2008
Statut
Membre
Dernière intervention
17 janvier 2009
25
>
jcl571
18 nov. 2008 à 18:14
18 nov. 2008 à 18:14
Fais :
int tab[2][3];
void zero(int **t)
{
...
}
void main()
{
zero( (int**) tab);
}
Et tu devrais plus avoir de warning.
int tab[2][3];
void zero(int **t)
{
...
}
void main()
{
zero( (int**) tab);
}
Et tu devrais plus avoir de warning.
jcl571
Messages postés
36
Date d'inscription
mardi 18 novembre 2008
Statut
Membre
Dernière intervention
12 août 2009
18 nov. 2008 à 19:07
18 nov. 2008 à 19:07
En fait, je ne me sers pas de tableaux de taille 2 et 3, c'était seulement comme exemple :) Mes tableaux sont des tableaux de chaines de caractères de taille 100x51 (des listes de noms et de prénoms).
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
18 nov. 2008 à 19:10
18 nov. 2008 à 19:10
Ca change rien. Tu fais passer toujours la taille et l'appel est le même ;)
jcl571
Messages postés
36
Date d'inscription
mardi 18 novembre 2008
Statut
Membre
Dernière intervention
12 août 2009
>
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
18 nov. 2008 à 19:22
18 nov. 2008 à 19:22
Je sais :) En tout cas, merci pour tout! Résolu! :)