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 :

tableaux 3d contigus


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 60
    Par défaut tableaux 3d contigus
    Je développe la version 3D d'un code utilisant la bibliothèque MPI (Message Passing Interface). Dans ce code, j'échange des tableaux 2D entre différents processus grâce à la fonction "MPI_Sendrecv".

    Pour cela, mon tableau 3D doit être dynamiquement alloué et contigu en mémoire selon les dimensions x[size_tot_y][size_tot_x][size_tot_z]. Voici ce que j'ai essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     x = malloc(size_tot_y * sizeof(*x));
     
     for (i = 0; i < size_tot_y; i++) {
       x[i] = malloc(size_tot_x * sizeof(**x));
       for (j = 0; j < size_tot_x; j++) {
         x[i][j] = malloc(size_tot_z * sizeof(***x));
       }
     }
    Malheureusement, j'ai des segmentations fault à l'exécution.

    Dans la version 2D de ce code, j'alloue dynamiquement des tableaux 2D contigus de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      x0 = malloc(size_tot_y*sizeof(double*));
      x0_vals = malloc(size_tot_x*size_tot_y*sizeof(double));
     
      for(j=0;j<=size_tot_y-1;j++) {
        x0[j] = &x0_vals[j*size_tot_x];
      }
    quel est selon vous la version 3D de cette allocation ?

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    Soit X, Y et Z tes dimensions, tu dois allouer :
    - tab : X*Y*Z éléments ;
    - tab1 : X*Y pointeurs sur tes éléments ;
    Tu parcours ton tableau tab par pas de Z et tu stocke chaque adresse d'éléments sur lequels tu arrives dans le tableau tab1 ;
    - tab2 : X pointeurs sur pointeurs sur tes éléments ;
    Tu parcours ton tableau tab1 par pas de Y et tu stocke chaque adresse des cases sur lesquelles tu arrives dans le tableau tab2;

    Soit 0 <= x < X; 0 <= y < Y; 0 <= z < Z
    Utilisation : tab2[x][y][z];

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 60
    Par défaut
    voici ce que j'ai fait en prenant la convention pour les dimensions suivantes pour les tableaux x et X0 :

    x[size_tot_y][size_tot_x][size_tot_z]
    x0[size_tot_y][size_tot_x][size_tot_z]
    code :


    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
     
     
      double*** x;
      double*** x0;
      double** x_vals1;
      double** x0_vals1;
      double* x_vals2;
      double* x0_vals2;
     
        x = malloc(size_tot_y*sizeof(double**));
      x_vals1 = malloc(size_tot_x*size_tot_y*sizeof(double*));
      x_vals2 = malloc(size_tot_x*size_tot_y*size_tot_z*sizeof(double));
      x0 = malloc(size_tot_y*sizeof(double**));
      x0_vals1 = malloc(size_tot_x*size_tot_y*sizeof(double*));
      x0_vals2 = malloc(size_tot_x*size_tot_y*size_tot_z*sizeof(double));
     
       for (i = 0; i < size_tot_y; i++) {
            x[i] = &x0_vals1[i*size_tot_x];
    	x0[i] = &x0_vals1[i*size_tot_x];	
           }
       for (i = 0; i < size_tot_y; i++) {       
            for (j = 0; j < size_tot_x; j++) {
    	    x[i][j] = &x_vals2[(i*size_tot_x+j)*size_tot_z];
    	    x0[i][j] = &x0_vals2[(i*size_tot_x+j)*size_tot_z];
           }
         }
    Malheureusement, une fois cette initialisation injectée dans le code MPI, les données produites ne sont pas correctes.

    Quelqu'un voit-il l'erreur ?

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Tu fais un peu n'importe quoi :
    Soit X, Y et Z tes dimensions, tu dois allouer :
    - tab : X*Y*Z éléments ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    double * tab = (double *)malloc(X*Y*Z*sizeof(double) );
    if( tab == NULL)
             ; //erreur d'allocation
    - tab1 : X*Y pointeurs sur tes éléments ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    double ** tab1 = (double **)malloc(X*Y*sizeof(double *));
    if(tab1 == NULL)
             ; //erreur d'allocation
    Tu parcours ton tableau tab par pas de Z et tu stocke chaque adresse d'éléments sur lequels tu arrives dans le tableau tab1 ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for(int i = 0, j =0; i < X*Y; ++i, j += Z)
                   tab1[i] = &tab[j];
    //OU
    double * ptr = tab;
    for(int i = 0; i < X*Y; ++i, ptr += Z)
                   tab1[i] = ptr;
    - tab2 : X pointeurs sur pointeurs sur tes éléments ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    double **tab2 = (double ***)malloc(X*sizeof(double **));
    if(tab2 == NULL)
               ;//erreur d'allocation
    Tu parcours ton tableau tab1 par pas de Y et tu stocke chaque adresse des cases sur lesquelles tu arrives dans le tableau tab2;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for(int i = 0, j =0; i < X; ++i, j += Y)
                   tab2[i] = &tab1[j];
    //OU
    double * ptr = tab1;
    for(int i = 0; i < X; ++i, ptr += Y)
                   tab2[i] = ptr;

Discussions similaires

  1. Centrer 2 tableaux contigus?
    Par midiweb dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 19/02/2006, 19h59
  2. free sur des tableaux "a moitié dynamiques"
    Par barthelv dans le forum C
    Réponses: 4
    Dernier message: 31/07/2003, 15h30
  3. [langage] erreurs utilisation tableaux 2 dimensions
    Par drosof dans le forum Langage
    Réponses: 11
    Dernier message: 01/07/2003, 11h44
  4. Réponses: 6
    Dernier message: 04/04/2003, 15h28
  5. Les tableaux en PL/SQL
    Par GRUMLY dans le forum PL/SQL
    Réponses: 5
    Dernier message: 12/08/2002, 18h10

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