Rechercher : dans
Par :

Pointeurs et tableaux 2D en C

Dernière réponse le 18 nov 2008 à 19:22:22 jcl571, le 18 nov 2008 à 03:52:55 
 Signaler ce message aux modérateurs

Bonjour,
Je sais que l'équivalent en pointeur d'un tableau en 1 dimension donne quelque chose comme ça:
&tab[i] = tab
car tab seul est un pointeur sur le premier élément du tableau.

J'ai fait des test sur des tableaux en 2 dimensions et j'en ai conclu que l'équivalent de:
&tab[i][j] n'est pas tab
Je voudrais donc savoir quel est l'équivalent pour un tableau à 2 dimensions?

La raison est que je voudrais passer mon tableau 2D à une fonction et, question de simplifier l'écriture lorsque j'appellerai la fonction(car toujours écrire &tab[i][j] c'est moins pratique que juste écrire tab)(et sauver de la mémoire, tant qu'a y etre!), je voudrais simplement passer un pointeur qui pointe sur le premier élément.

Merci, j'espere que j'ai été assez clair :P

Configuration: Windows XP
Firefox 3.0.4

Meilleures réponses pour « Pointeurs et tableaux 2D en C » dans :
Trier un tableau sans utiliser la fonction sort VoirTrier un tableau sans utiliser la fonction sort D'abord on initialise une variable $max avec la 1ère valeur de tableau. Ensuite on va faire une boucle tant que le tableau contient encore des éléments. C'est avec la fonction splice qui a le rôle...
Inverser les éléments d'un tableau -Récursivité- VoirVoici une procédure récursive qui permet d’inverser les éléments d’une partie d’un tableau compris entre la position p et n : Procedure Inverser (Var t : Tab; p, n : Integer); Var aux : Real; Begin If p < n Then ...
Les pointeurs en langage C VoirDéfinition d'un pointeur Un pointeur est une variable contenant l'adresse d'une autre variable d'un type donné. La notion de pointeur fait souvent peur car il s'agit d'une technique de programmation très puissante, permettant de définir des...
Langage C - Les tableaux VoirType de données complexes Les variables, telles que nous les avons vues, ne permettent de stocker qu'une seule donnée à la fois. Or, pour de nombreuses données, comme cela est souvent le cas, des variables distinctes seraient beaucoup trop lourdes...
Les tableaux en langage C++ VoirType de données complexes Les variables, telles que nous les avons vues, ne permettent de stocker qu'une seule donnée à la fois. Or, pour de nombreuses données, comme cela est souvent le cas, des variables distinctes seraient beaucoup trop lourdes...

1

Droopy_, le 18 nov 2008 à 04:11:14
  • +1

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.

Répondre à Droopy_

2

Droopy_, le 18 nov 2008 à 04:22:43

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.

Répondre à Droopy_

3

jcl571, le 18 nov 2008 à 04:34:13

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)

Répondre à jcl571

4

Droopy_, le 18 nov 2008 à 16:25:27

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.

Répondre à Droopy_

5

jcl571, le 18 nov 2008 à 18:05:20

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?

Répondre à jcl571

6

Droopy_, le 18 nov 2008 à 18:10:44

Je sais pas trop.
J'utilise toujours des pointeurs, comme ça je suis sûr ;-)

Répondre à Droopy_

7

jcl571, le 18 nov 2008 à 18:12:09

C'est ce que j'aimerais faire, mais en plus d'être irritants, les warning sont fortement pénalisés lors de la correction ;)

Répondre à jcl571

8

Droopy_, le 18 nov 2008 à 18:14:19

Fais :

int tab[2][3];

void zero(int **t)
{
...
}

void main()
{
zero( (int**) tab);
}

Et tu devrais plus avoir de warning.

Répondre à Droopy_

9

jcl571, le 18 nov 2008 à 18:25:50

Effectivement, plus de warning. Est-ce que ça change le tableau en pointeur seulement pour l'appel de la fonction? Désolé, question de débutant :P

EDIT: En faisant ceci:

void zero(int *t)
{
int i,j;
for(i=0; i<2; i++)
{
for(j=0; j<3; j++)
*t=0;
}
}

void main()
{
int tab[2][3];
zero(&tab[0][0]);
}

J'ai remarqué que j'ai seulement besoin de 1 * (en en mettant 2, j'obtiens 2 warning). Je crois que je vais utiliser cette méthode pour l'instant, parce que les **, j'ai peut-être encore un peu de trouble avec ^^. Mais pourquoi est-ce que ma méthode a seulement besoin de 1 *, alors que les autres en ont besoin de 2?

Répondre à jcl571

10

fiddy, le 18 nov 2008 à 18:49:40

Salut,
Lorsque tu déclares une fonction avec un double pointeur, tu dois signaler au compilateur la taille de la colonne. Sinon, il ne peut pas définir correctement le tableau 2D.
Donc, ça donne void zero(int tab[][3]){ ... D'ailleurs, il est de bonne augure de faire passer la taille du tableau aussi en paramètre. Dans ton cas, pas besoin, car tu te sers des chiffres 2 et 3, mais des fois, c'est variable ;)
Et, pour l'appeler zero(tab);.

Cdlt
Google is your friend

Répondre à fiddy

11

jcl571, le 18 nov 2008 à 19:07:04

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).

Répondre à jcl571

12

fiddy, le 18 nov 2008 à 19:10:48

Ca change rien. Tu fais passer toujours la taille et l'appel est le même ;)
Google is your friend

Répondre à fiddy

13

 jcl571, le 18 nov 2008 à 19:22:22

Je sais :) En tout cas, merci pour tout! Résolu! :)

Répondre à jcl571