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

  FORUM HardWare.fr
  Programmation
  C

  [C99] Allouer un tableau de dimensions inconnues en une seule passe

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C99] Allouer un tableau de dimensions inconnues en une seule passe

n°497900
leneuf22
Posté le 25-08-2003 à 23:39:10  profilanswer
 

Voilà, comme je vois souvent des débutants qui perdent là tête dès qu'ils voient une indirection double (ou plus) à allouer sur le heap (la version pile est beaucoup plus simple). je propose donc une méthode spécifique au C99 qui permet de s'affranchir des boucles for pleines de malloc à n'en plus finir.
 
Un exemple sur trois dimensions :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(void) {
  4.     unsigned dim1;
  5.     unsigned dim2;
  6.     unsigned dim3;
  7.     puts("Entrez la taille des trois dimensions" );
  8.     scanf("%u%u%u", &dim1, &dim2, &dim3);
  9.     int (*tab)[dim2][dim3] = calloc(dim1 * dim2, dim3 * sizeof(int)); //allocation en une seule fois. ne pas enlever les parenthèses
  10.     //ici faites bon usage du tableau, comme si il avait été déclaré normalement "int tab[dim1][dim2][dim3]"
  11.     free(tab); //libération en une seule fois
  12.     return 0;
  13. }


 
Bien sur, il est possible de faire un realloc sur le tableau, mais il faudra bricoler un nouveau type à chaque fois que vous modifiez la taille des dimensions 2 et + (pas la première), ce qui signifie nouveau pointeur de tableau qui référence la zone mémoire... ou un typedef+cast. C'est donc à utiliser quand il n'y a pas trop de contraintes, car ça peut très vite devenir un code complètement illisible : à vous d'en faire bon usage !

mood
Publicité
Posté le 25-08-2003 à 23:39:10  profilanswer
 

n°497912
Taz
bisounours-codeur
Posté le 25-08-2003 à 23:51:04  profilanswer
 

j'ai mieux  
 

Code :
  1. #include <stdio.h>
  2. int main(int argc, char *argv[])
  3. {
  4.   unsigned dim1;
  5.   unsigned dim2;
  6.   unsigned dim3;
  7.    
  8.   puts("Entrez la taille des trois dimensions" );
  9.   scanf("%u%u%u", &dim1, &dim2, &dim3);
  10.    
  11.   int tab[dim1][dim2][dim3];
  12.   printf("sizeof tab = %u\n", sizeof tab);

 :p


Message édité par Taz le 25-08-2003 à 23:51:14
n°497916
leneuf22
Posté le 25-08-2003 à 23:53:35  profilanswer
 

Relis mon post.
Tu alloues sur la pile (alloca implicite), moi sur le heap tas (calloc explicite).


Message édité par leneuf22 le 26-08-2003 à 07:29:18
n°497926
Taz
bisounours-codeur
Posté le 25-08-2003 à 23:58:42  profilanswer
 

bah je sais bien :heink:  
juste que mon code implique le tien


Message édité par Taz le 25-08-2003 à 23:58:49
n°497930
Taz
bisounours-codeur
Posté le 26-08-2003 à 00:03:14  profilanswer
 

par contre, je ne suis pas d'accord aec les arguments du calloc,je préferais un générique
 
int (*dtab)[dim2][dim3] = calloc(dim1, sizeof *dtab);
 
ou alors
 
int (*dtab)[dim2][dim3] = calloc(dim1, sizeof(int[dim2][dim3]));
 
bien plus explicit


Message édité par Taz le 26-08-2003 à 07:29:37
n°497932
SquiZZ
Posté le 26-08-2003 à 00:05:10  profilanswer
 

leneuf22 a écrit :

Relis mon post.
Tu alloues sur la pile (alloca implicite), moi sur le heap (calloc explicite).


 
Tu peux me citer le passage de la norme c99 qui dit que calloc alloue sur le heap ?

n°497934
Taz
bisounours-codeur
Posté le 26-08-2003 à 00:09:49  profilanswer
 

tas !
 
 
non: aucune référence à la pile ou au tas
justement que le stockage par défaut est automatique
 
après malloc fait partie de la biliothèque standard, et il me semble que la seul chose dite est "retourne un pointeur vers une zone de la taille demandée"
 
tout dépend toujours de l'implémentation
 
 
edit: sous Gnu/Linux, en fonction du paramètres, soit cela conduit à un appel à sbrk pour faire grandir le segment, soit à un appel à mmap pour une projection


Message édité par Taz le 26-08-2003 à 00:10:51
n°498319
leneuf22
Posté le 26-08-2003 à 11:44:56  profilanswer
 

Citation :

The lifetime of an allocated object extends from the allocation until the deallocation. (until the space is explicitly deallocated)


 
Faut bien avouer que la pile n'est pas faite pour ce genre de comportement. Sinon faut plus l'appeler "pile", en tous cas elle n'est plus LIFO.


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

  [C99] Allouer un tableau de dimensions inconnues en une seule passe

 

Sujets relatifs
Comment obtenir les dimensions d'une image ?Heu... copier un tableau ? 0_0
[MySQL] Comment incrémenter une valeur contenue dans un tableau ??[mySQL] c'est quoi un tableau associatif ??
tableau de sessiontableau d'objet et javascript
comment supprimer proprement les doublons d'un tableau d'objet ?Variable dans tableau ...
tableau[$mavariabledetypenumér ique+1] ne fonctionne pas.Mettre le focus sur la derniere ligne d'un tableau
Plus de sujets relatifs à : [C99] Allouer un tableau de dimensions inconnues en une seule passe


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