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

  FORUM HardWare.fr
  Programmation
  C

  déclarer un pointeur vers un tableau de tableaux ...?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

déclarer un pointeur vers un tableau de tableaux ...?

n°2127437
in_your_ph​ion
Posté le 21-02-2012 à 10:05:38  profilanswer
 

Bonjour,  
 
est il possible de déclarer un pointeur qui pointerait vers cela ?
 

Code :
  1. { {"aa","b"}, {"coucou", "la voilà"} }


 
J'avais pensé à quleque chose comme const char ( *[]) [] mais ça ne marche pas...
 
Merci par avance


Message édité par in_your_phion le 21-02-2012 à 10:06:05
mood
Publicité
Posté le 21-02-2012 à 10:05:38  profilanswer
 

n°2127515
gilou
Modérateur
Modzilla
Posté le 21-02-2012 à 12:51:31  profilanswer
 

Code :
  1. #include <stdio.h>
  2. /* ------------------------------------------------------------------------ */
  3. int main() {
  4.     char *toto[2][2] = { {"aa", "b"}, {"coucou", "la voila"}, };
  5.     printf("%s\n", toto[1][1]);
  6.     return 0;
  7. }

ou

Code :
  1. #include <stdio.h>
  2. /* ------------------------------------------------------------------------ */
  3. int main() {
  4.     char *toto[][2] = { {"aa", "b"}, {"coucou", "la voila"}, };
  5.     printf("%s\n", toto[1][1]);
  6.     return 0;
  7. }

marchera en C, mais pas

Code :
  1. #include <stdio.h>
  2. /* ------------------------------------------------------------------------ */
  3. int main() {
  4.     char *toto[][] = { {"aa", "b"}, {"coucou", "la voila"}, };
  5.     printf("%s\n", toto[1][1]);
  6.     return 0;
  7. }


 
Ça montre l’archaïsme du C par rapport à des langages modernes. La même chose en D, avec un tableau a lignes de longueur variables:

Code :
  1. import std.stdio, std.array, std.string;
  2.  
  3. int main() {
  4.    string toto[][] = [["aa", "b", "cc"],
  5.                        ["coucou", "la voila"],
  6.                        ["coucou", "coucou", "coucou"],
  7.                        ["end"]];
  8.  
  9.    foreach (i; 0 .. toto.length) {
  10.         foreach (j; 0 .. toto[i].length)
  11.             write(toto[i][j], "\t" );
  12.         writeln();
  13.    }
  14.    return 0;
  15. }


A+,


Message édité par gilou le 21-02-2012 à 14:05:58

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2127561
in_your_ph​ion
Posté le 21-02-2012 à 14:29:45  profilanswer
 

salut,
merci pour ta réponse.
Dans le cas 2 :

Code :
  1. char *toto[][2] = { {"aa", "b"}, {"coucou", "la voila"}, };


 
le [2] indique t-il la taille des éléments d'un tableau, où le nombre des tableaux ?
 
Merci

n°2127568
gilou
Modérateur
Modzilla
Posté le 21-02-2012 à 14:51:45  profilanswer
 

Le nombre de tableaux.
En C, il faut que tu renseignes tous les nombres d'éléments de tableaux afin que la taille d'une ligne (qui doit être constante) puisse être calculée à la compilation. Le nombre de lignes peut lui être déduit de l'initialisation.
Ici, le compilo va savoir calculer la taille d'une ligne: au padding près, c'est celle de deux pointeurs (sur des chars, mais ça, le compilo s'en moque un peu à ce stade).
A+,

Message cité 1 fois
Message édité par gilou le 21-02-2012 à 14:55:44

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2127784
in_your_ph​ion
Posté le 22-02-2012 à 12:10:23  profilanswer
 

gilou a écrit :

Le nombre de tableaux.
En C, il faut que tu renseignes tous les nombres d'éléments de tableaux afin que la taille d'une ligne (qui doit être constante) puisse être calculée à la compilation. Le nombre de lignes peut lui être déduit de l'initialisation.
Ici, le compilo va savoir calculer la taille d'une ligne: au padding près, c'est celle de deux pointeurs (sur des chars, mais ça, le compilo s'en moque un peu à ce stade).
A+,

 

salut,
merci pour ta réponse. Cela veut-il donc dire qu'il faut spécifier le nombre de colonnes, mais que le nombre de lignes est calculé automatiquement ?

 

Pourtant j'aurais cru que

Code :
  1. char *toto[][2] = { {"aa", "b"}, {"coucou", "la voila"}, };
 

se représentait comme ça :

 
Code :
  1. {"aa"     , "b"        },
  2. {"coucou" , "la voila"}
 

cad que les tableaux constituent les lignes ?


Message édité par in_your_phion le 22-02-2012 à 12:11:04
n°2127805
gilou
Modérateur
Modzilla
Posté le 22-02-2012 à 14:50:58  profilanswer
 

Je voulais rectifier en 'le nb d'éléments d'une ligne du tableau", pour ma première phrase, mais le serveur était en maintenance à ce moment la.
Le compilo doit pouvoir calculer la taille d'une ligne (constante) puisque pour lui, un tableau est une suite de pointeurs sur des objets qui ont pour taille la taille d'une ligne. Après, que les lignes soient contiguës ou pas en mémoire, le C s'en fout un peu pour ses accès, c'est pas nécessaire (mais ça peut être utile pour une gestion efficace de ces accès à la mémoire).
Donc pour connaitre la taille d'une ligne, il faut 1) qu'il sache le nb d'elements dans une ligne (le 2 ici) et le taille d'un élément de ligne (c'est pour ça que pour un tableau multidimensionnel, il faut aussi qu'il connaisse la taille des autres tableaux. Bref tu peux avoir char *toto[][2][3] mais pas *toto[][][3] ou *toto[][2][].

Citation :

le nombre de lignes est calculé automatiquement

oui si tu fait l'initialisation en même temps que la déclaration, sinon, il faudra le donner quand tu alloueras ton tableau.
 
char *toto[][3] = { {"aa", "b", "c"}, {"coucou", "la voila", "ici"}, };
correspond à  
{"aa"       , "b"        , "c"},
{"coucou" , "la voila", "ici"}
le 3 indique au compilo qu'il y a 3 pointeurs sur des caractères par ligne, le compilo va déduire qu'il y a deux lignes.  
Bref le compilo sait transformer ceci en  
char *toto[2][3] = { {}, };
et a partir de la il sait comment tout allouer:
Il alloue une zone mémoire de 2 cases mémoires (ie pouvant contenir une adresse mémoire) et toto va être associé à la première
Il alloue 2 zones mémoires de 3 cases mémoires et range leurs adresses dans les 2 cases précédentes,
Il alloue de la place pour "aa", "b", "c" en mémoire (non modifiable si possible) les y copie et range leurs adresses dans la première série de 3 cases précédentes.
Il alloue de la place pour "coucou", "la voila", "ici" en mémoire (non modifiable si possible) les y copie et range leurs adresses dans la seconde série de 3 cases précédentes.
[Bon après, en fait c'est optimisé, il me semble que dans certaines implémentations, il alloue d'un coup et copie "aa\0b\0c\0coucou\0la voila\0ici\0\0" en mémoire non modifiable, et il alloue d'un coup de la place pour 2+2*3 pointeurs et fait les remplissages d'adresse nécessaires]
A+,


Message édité par gilou le 22-02-2012 à 14:56:54

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2127932
in_your_ph​ion
Posté le 23-02-2012 à 11:18:15  profilanswer
 

merci beaucoup  :jap:


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

  déclarer un pointeur vers un tableau de tableaux ...?

 

Sujets relatifs
Référencement des tableaux et des <div> ?Trie tableau multidimension
A supprimerTableau indexé avec des chaînes, ok sous Easyphp, pb chez free
tableau dynamique javaTransferer données précises vers une autre table en fonction d'un ID
Probleme compatibilité macro Excel 2003 -vers Excel 2010while et for sur tableau
modification d'un formulaire - tableautableau à double entrée à partir d'une requête
Plus de sujets relatifs à : déclarer un pointeur vers un tableau de tableaux ...?


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