tableau à plusieurs dimensions
bonjour,
Je souhaite céer un jeu sur un damier 8*8
j'ai créer une fonction qui affiche ce damier : affiche
dans mon main pour l'instant j'ai juste initialisé le damier
chaque case de mon damier contient un type, que j'ai défini, nommé caze
quelle doit etre alors la féfinition de ma fonction affich ?
j'ai essayé ceci
Code:
void affich(caze othello[][]);
en faisant lanalogie avec un tableau à une dimension.
pourtant ce code n'est pas compilable (avec gcc)
j'ai alors testé ceci à tout hasard
Code:
void affich(caze othello[][8]);
et ceci marche très bien.
quelle est la raison ?
autre chose, pour contourner le pb de passage par référence en C, il faut souvent passer en paramètre l'adresse d'un objet dans les différentes fonctions sauf pour les tableaux qui sont considérés eux mêmes comme des pointeurs. Déjà ai-je bien raison ? Et si oui en est-il de même pour les tableaux à n dimensions ?
Merci vraiment bcp pour votre lecture. Les réponses sont les bienvenues...
Re: tableau à plusieurs dimensions
Bonjour,
Citation:
Envoyé par pekka77
j'ai essayé ceci
Code:
void affich(caze othello[][]);
en faisant lanalogie avec un tableau à une dimension.
pourtant ce code n'est pas compilable (avec gcc)
j'ai alors testé ceci à tout hasard
Code:
void affich(caze othello[][8]);
et ceci marche très bien.
quelle est la raison ?
Normal, il faut spécifier la deuxième dimension, ce qui ai le cas dans la seconde fonction :wink:
Citation:
Envoyé par pekka77
les tableaux qui sont considérés eux mêmes comme des pointeurs. Déjà ai-je bien raison ? Et si oui en est-il de même pour les tableaux à n dimensions ?
:nono: c'est l'inverse, un pointeur peut être utiliser comme un tableau (avec l'allocation dynamique):
Code:
1 2 3
| int *tab = malloc( sizeof( *tab ) * SIZE );
/* Dans ce cas : */
*(tab + i) = tab[i] |
mais l'inverse n'est pas vrai.
En espérant avoir répondue à tes questions.
[edit]Je vous ai tous eu :roi:[/edit]
Re: tableau à plusieurs dimensions
Citation:
Envoyé par pekka77
Je souhaite céer un jeu sur un damier 8*8
j'ai créer une fonction qui affiche ce damier : affiche
Code:
void affich(caze othello[][]);
en faisant lanalogie avec un tableau à une dimension.
pourtant ce code n'est pas compilable (avec gcc)
j'ai alors testé ceci à tout hasard
Il faut arréter de programmer au hasard, et apprendre le C sérieusement. Il y a des références de livres et des tutoriels sur ce site...
Citation:
Code:
void affich(caze othello[][8]);
et ceci marche très bien.
quelle est la raison ?
Le compilateur n'est pas devin. Il a besoin de la taille pour faire ses calculs d'adresse. Pas de taille, pas de calculs... Pour la dimension de gauche, le type suffit, c'est pourquoi on peut ommettre la taille (comme dans un tableau à une dimension).
Citation:
autre chose, pour contourner le pb de passage par référence en C, il faut
Tous les passages de paramètres se font par valeur en C.
Citation:
souvent passer en paramètre l'adresse d'un objet dans les différentes fonctions sauf pour les tableaux qui sont considérés eux mêmes comme des pointeurs. Déjà ai-je bien raison ? Et si oui en est-il de même pour les tableaux à n dimensions ?
Dans la littérature anglo-saxone sur le C, on trouve des phrases du genre :
Citation:
An array decays to a pointer when passed to a function"
Ca signifie en gros, que pour passer un tableau à une fonction, on passe son adresse via un paramètre pointeur. Ca ne signifie nullement qu'un tableau est un pointeur.
Re: tableau à plusieurs dimensions
Citation:
Envoyé par pekka77
pourtant ce code n'est pas compilable (avec gcc)
j'ai alors testé ceci à tout hasard
Code:
void affich(caze othello[][8]);
et ceci marche très bien.
quelle est la raison ?
Parceque en C, lorsqu'on passe un tableau à deux dimensions, il faut preciser le nombre de colonnes à la declaration. Le nombre de lignes n'est pas utile dans le sens ou ce que tu passes à la fonction est un pointeur sur un tableau ed lignes (contenant chacunes 8 elements)
Donc les declarations suivantes sont equivalentes:
Code:
1 2
|
void affich(caze othello[][8]); |
ou
Code:
1 2
|
void affich(caze othello[8][8]); |
Citation:
autre chose, pour contourner le pb de passage par référence en C, il faut souvent passer en paramètre l'adresse d'un objet dans les différentes fonctions sauf pour les tableaux qui sont considérés eux mêmes comme des pointeurs. Déjà ai-je bien raison ? Et si oui en est-il de même pour les tableaux à n dimensions ?
Non. En C, le passage des arguments se fait par valeur : c'est pour contourner cela et pouvoir modifier des elements exterieurs aux fonctions qu'on passe une adresse sur l'element en question.
C'est vrai pour tout argument que l'on voudrait modifier (suaf les expressions constantes)
<edit>
Arf, devancé par Emmanuel...
</edit>
++
Pouic