Demande d'explication sur des passages de tableaux à 2 dimensions...

Demande d'explication sur des passages de tableaux à 2 dimensions... - C - Programmation

Marsh Posté le 30-07-2003 à 16:39:32    

Je pense que tout le monde est déja passé par ce problème: passer un tableau à deux dimensions comme paramètre d'une fonction!
 
Je vous balance le code que j'ai pondu:

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void parcours (char **tab, int x, int y)
  4. {
  5. }
  6. int main (void)
  7. {
  8.         int i;
  9.         char **tab;
  10.         char tab2[4][4];
  11.         tab = (char**)malloc(4*sizeof(char*));
  12.         for(i=0;i<4;i++)
  13.                 tab[i] = (char*)malloc(sizeof(char));
  14.         parcours (tab, 4, 4);
  15.         parcours (tab2, 4, 4);
  16.         return 0;
  17. }


 
Maintenant, je veux bien qu'on m'explique pkoi il y a une différence entre tab[][] et **tab !!! (si vous avez la flemme de compiler, voici ce que me sort le compilateur:

essai.c:20: warning: passing arg 1 of `parcours' from incompatible pointer type

-> c'est pour le 2ème appel de "parcours" )
 
Merci d'avance!


Message édité par torpe23 le 30-07-2003 à 16:40:42
Reply

Marsh Posté le 30-07-2003 à 16:39:32   

Reply

Marsh Posté le 30-07-2003 à 16:45:13    

drapo, Ca m'interesserait aussi de savoir

Reply

Marsh Posté le 30-07-2003 à 16:48:40    

char tab[4][5] est de type char* pas char **
 
si tuveux passer un tableau à une fonction c:
 

Code :
  1. void proto1(char t[4][]);
  2. void proto2(char t[]);
  3. void proto2(char *t);


Message édité par LetoII le 30-07-2003 à 16:51:02

---------------
Le Tyran
Reply

Marsh Posté le 30-07-2003 à 16:49:53    

exact, je me souviens maintenant  :jap:

Reply

Marsh Posté le 30-07-2003 à 16:57:55    

Mais c'est pourtant un tableau à deux dimensions!
 
Et ça m'oblige à avoir deux fonctions différentes, l'une acceptant char** pour les tableaux à 2D construits avec malloc, et l'autre acceptant les char* pour les tableaux à 2D du type tab[][].  
 
Comment je fais pour n'avoir qu'une seule fonction qui accepterait n'importe lequel des deux types???


Message édité par torpe23 le 30-07-2003 à 16:58:12
Reply

Marsh Posté le 30-07-2003 à 17:01:13    

Reply

Marsh Posté le 30-07-2003 à 17:05:24    

je me souviens, je t'explique
en fait un tableau a deux dimensions est un tableau a une dimension.
exemple :  
tab[3] -> elem0 elem1 elem2
tab[3][2] -> elem00 elem01 ele10 elem11 elem20 elem 21
 
si tu veux l'adresse de l'element tab [2][0] du tableau tab[i][j], c'est en fait l'adresse de tab[0][0] + 2*j*sizeof(elem)
 
j'espere que l'explication est claire :/

Reply

Marsh Posté le 30-07-2003 à 17:54:54    

torpe23 a écrit :

Mais c'est pourtant un tableau à deux dimensions!
 
Et ça m'oblige à avoir deux fonctions différentes, l'une acceptant char** pour les tableaux à 2D construits avec malloc, et l'autre acceptant les char* pour les tableaux à 2D du type tab[][].  
 
Comment je fais pour n'avoir qu'une seule fonction qui accepterait n'importe lequel des deux types???


 
 :non:  
 
Un tableau de char quelque soit sa dimension et son type d'allocation est tjrs un char *:
 
 

Code :
  1. char tab[20];
  2. //Même chose que:
  3. char tab[4][5];


Message édité par LetoII le 30-07-2003 à 19:19:18

---------------
Le Tyran
Reply

Marsh Posté le 30-07-2003 à 17:56:51    

:non: pas du tout. le seul point commun c'est que tous les éléments sont contigus et que ton compilo est capable de faire les calculs d'index pour un tableau.|

Reply

Marsh Posté le 30-07-2003 à 19:17:50    

Taz a écrit :

:non: pas du tout. le seul point commun c'est que tous les éléments sont contigus et que ton compilo est capable de faire les calculs d'index pour un tableau.|


 
 :heink: Alors attend tu me la refait là, c quoi la différence entre deux char l'un à côté de l'autre en mémore et ... deux char l'un à côté de l'autre an mémoire?
 
tab[i][j] c'est une autre écriture pour tab[i*s+j] (où s est la taille d'une ligne) c tout
 
EDIT je me suis un peu avancé dans mon exemple y en a un qui est alloué sur la pile et pas l'autre mais bon.


Message édité par LetoII le 30-07-2003 à 19:19:34

---------------
Le Tyran
Reply

Marsh Posté le 30-07-2003 à 19:17:50   

Reply

Marsh Posté le 30-07-2003 à 19:24:53    

1) t'as fait un edit
2) commence pas à casser mon boulot tableau!=pointeur
 
je suis d'accord c'est proche... tu dis que c'est la meme chose, les gens comprennent rien, demain, on va tomber sur un type qui va nous faire de l'affectation entre tableaux et pointeurs
 
je te conseille de lire fclc et le K&R, y a plein de détails sur tout ça (dans les annexes aussi)

Reply

Marsh Posté le 30-07-2003 à 19:32:30    

Taz a écrit :

1) t'as fait un edit
2) commence pas à casser mon boulot tableau!=pointeur
 
je suis d'accord c'est proche... tu dis que c'est la meme chose, les gens comprennent rien, demain, on va tomber sur un type qui va nous faire de l'affectation entre tableaux et pointeurs
 
je te conseille de lire fclc et le K&R, y a plein de détails sur tout ça (dans les annexes aussi)
 


 
Effectivement j'ai fait un edit par ce que j'ai vu ma connerie (que j'ai signalée d'ailleur)
 
Je t'accorde que j'ai pas été très pédaguogue sur coup. En même temps tu déclare pas de tableau en C tu déclare un pointeur vers un emplacement mémoire qui se trouve être une suite de structure de donnée placée de façon contigüe (le dit tableau quoi).
 
J'essairai d'être plus clair la prochaine fois.


---------------
Le Tyran
Reply

Marsh Posté le 30-07-2003 à 19:36:38    

oui mais ça fait une sacré différence, au niveau du sizeof, au niveau de l'arithmétique, au niveau de l'initialisation
 
malloc(n*m) ça ne permet pas la meme utilisation que [m][n] pour ne citer que ça

Reply

Marsh Posté le 30-07-2003 à 19:43:17    

Taz a écrit :

oui mais ça fait une sacré différence, au niveau du sizeof, au niveau de l'arithmétique, au niveau de l'initialisation
 
malloc(n*m) ça ne permet pas la meme utilisation que [m][n] pour ne citer que ça


 
c pour ça que j'utilise jamais [m][n], c trop chiant  [:ddr555]


---------------
Le Tyran
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed