Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1511 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°472197
torpe23
Posté le 30-07-2003 à 16:39:32  profilanswer
 

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
mood
Publicité
Posté le 30-07-2003 à 16:39:32  profilanswer
 

n°472208
polo021
Posté le 30-07-2003 à 16:45:13  profilanswer
 

drapo, Ca m'interesserait aussi de savoir

n°472219
LetoII
Le dormeur doit se réveiller
Posté le 30-07-2003 à 16:48:40  profilanswer
 

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
n°472224
polo021
Posté le 30-07-2003 à 16:49:53  profilanswer
 

exact, je me souviens maintenant  :jap:

n°472239
torpe23
Posté le 30-07-2003 à 16:57:55  profilanswer
 

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
n°472242
Taz
bisounours-codeur
Posté le 30-07-2003 à 17:01:13  profilanswer
 
n°472249
polo021
Posté le 30-07-2003 à 17:05:24  profilanswer
 

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 :/

n°472335
LetoII
Le dormeur doit se réveiller
Posté le 30-07-2003 à 17:54:54  profilanswer
 

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
n°472338
Taz
bisounours-codeur
Posté le 30-07-2003 à 17:56:51  profilanswer
 

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

n°472398
LetoII
Le dormeur doit se réveiller
Posté le 30-07-2003 à 19:17:50  profilanswer
 

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
mood
Publicité
Posté le 30-07-2003 à 19:17:50  profilanswer
 

n°472402
Taz
bisounours-codeur
Posté le 30-07-2003 à 19:24:53  profilanswer
 

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)

n°472407
LetoII
Le dormeur doit se réveiller
Posté le 30-07-2003 à 19:32:30  profilanswer
 

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
n°472408
Taz
bisounours-codeur
Posté le 30-07-2003 à 19:36:38  profilanswer
 

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

n°472414
LetoII
Le dormeur doit se réveiller
Posté le 30-07-2003 à 19:43:17  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
Constantes Tableaux : Une solution ?***RESOLU***:/ Arrays à 3 dimensions, tables html et boucles foreach()
[JAVA] Mécanisme pour charger des JAR à la demandeBesoin d'information des système AS 400 (bon connaisseurs demandé)
Gestion des pages avec des tableaux dynamiques...Peut on definir en constante des tableaux en PHP ?
[c]demande de conseil sur pogrammation random d'une playlisttableaux indicés
Demande conseil: Langage, Imagerie, Clusteringtableau à 2 dimensions sans initialisation?
Plus de sujets relatifs à : Demande d'explication sur des passages de tableaux à 2 dimensions...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR