IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Allocation dynamique tableaux 4 dimensions


Sujet :

C

  1. #41
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 122
    Points : 66
    Points
    66
    Par défaut
    Merci pour vos réponses, vos multiples propositions, ça montre la difficulté liée à ce type d'exercices ou simplement les différentes possibilités qu'offre ce langage.

    J'avoue que je ne suis plus où mettre la tête et je pense que je dois prendre le temps qu'il faut pour relire et surtout comprendre et étudier toute cette richesse.

    Merci

  2. #42
    Membre actif
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2011
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2011
    Messages : 71
    Points : 214
    Points
    214
    Par défaut Une fonction intéressante...
    Bonjour,

    Je me permet de déterrer le topic car récemment je suis tombé sur une fonction à la fois très intéressante et surprenante (pas de moi) qui permet d'allouer un tableau à n dimension avec un seul malloc et le mieux dans tout ça ç'est que la libération se fait en un seul free (ce qui au passage économise beaucoup de temps machine, en plus du reste !)

    voici la dite fonction (il faut s'accrocher quand même devant une telle puissance):
    n : nombre de dimensions
    tab : tableau des dimension
    elemSize : taille d'un élément de base

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    /* pas de moi                                                                                                                                                                                  
    http://clubnix.fr/node/382 */
    void* array_alloc (int n, int tab[], size_t elemSize)                                                                                                                                                                     
    {                                                                                                                                                                                                                   
      int i,j;                                                                                                                                                                                                          
      int pro;                                                                                                                                                                                                          
      int sum;                                                                                                                                                                                                          
      size_t dataSize;                                                                                                                                                                                                  
      size_t  blocSize = 0;                                                                                                                                                                                             
      void* ptrAlloc;                                                                                                                                                                                                   
     
      void *ptrBase, *ptrP;                                                                                                                                                                                             
     
      if (tab == NULL || n == 0 || elemSize == 0) {                                                                                                                                                                     
        return NULL;                                                                                                                                                                                                    
      }                                                                                                                                                                                                                 
      if (n == 1) {                                                                                                                                                                                                     
        return malloc (tab[0] * elemSize);                                                                                                                                                                              
      }                                                                                                                                                                                                                 
      sum = 0;                                                                                                                                                                                                          
      pro = 1;                                                                                                                                                                                                          
      for (i = 0; i < n - 1; i++){                                                                                                                                                                                      
        pro *= tab[i];                                                                                                                                                                                                  
        sum += pro;                                                                                                                                                                                                     
      }                                                                                                                                                                                                                 
     
      blocSize  = sum * PTR_SIZE + pro * elemSize * tab[i];                                                                                                                                                             
     
      if ((ptrAlloc = malloc (blocSize)) == NULL){                                                                                                                                                                      
          return NULL;                                                                                                                                                                                                  
      }                                                                                                                                                                                                                 
      ptrBase = ptrP = ptrAlloc;                                                                                                                                                                                        
      for (i = 0, pro = 1; i < n - 1; i++) {                                                                                                                                                                            
          pro *= tab[i];                                                                                                                                                                                                
          ptrBase += pro * PTR_SIZE;                                                                                                                                                                                    
          dataSize = (i == n - 2) ? elemSize : PTR_SIZE;                                                                                                                                                                
          for (j = 0; ptrP < ptrBase; ptrP += PTR_SIZE, j++) {                                                                                                                                                          
            *((void**)ptrP) = ptrBase + tab[i+1] * j * dataSize;                                                                                                                                                        
          }                                                                                                                                                                                                             
      }                                                                                                                                                                                                                 
      return ptrAlloc;                                                                                                                                                                                                  
    }

  3. #43
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 122
    Points : 66
    Points
    66
    Par défaut
    Bonjour,

    Merci diogene, je vais lire ton code à tête reposée et essayer de le comprendre, de le tester et je reviendrais avec des nouvelles questions s'il y a des endroits qui ne sont pas très claire pour moi.

    J'avais un peu mis de côté cette allocation pour avancer sur autre chose et voici le moment de replonger dans cette épreuve.

    Quant à la version postée par Pjlan, elle me paraît plus difficile à comprendre par rapport à mon niveau et par rapport à celle de diogene.


    Merci à toutes et à tous pour vos contributions.

Discussions similaires

  1. decalaration dynamique tableaux deux dimensions et TRI
    Par Alex35 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 27/12/2007, 13h48
  2. Tableaux 2 dimensions dynamiques
    Par onegamer dans le forum Struts 1
    Réponses: 1
    Dernier message: 06/07/2006, 12h55
  3. allocation dynamique et tableaux de pointeurs
    Par gbardy dans le forum 4D
    Réponses: 3
    Dernier message: 06/07/2006, 11h08
  4. Réponses: 6
    Dernier message: 26/11/2005, 19h55
  5. Réponses: 4
    Dernier message: 03/12/2002, 16h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo