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 :

MPI_Allgather et structure dynamique


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 58
    Par défaut MPI_Allgather et structure dynamique
    Bonjour,

    j'ai un souci, j'ai une structure dynamique comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    typedef struct{
    	float a;
    	int* b;
    }structure_t;
    Disons que b contienne 10 éléments, je l'initialise comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      structure_t * resultat =(structure_t*) malloc(sizeof(structure_t)+10*sizeof(int));
    Mon problème est que je souhaiterais utiliser MPI_Allgather pour envoyer un tableau de ma structure "structure_t", Comment faire vu que celle ci est "dynamique"?

    Merci.

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    La déclaration devrait être

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct{
    	float a;
    	int b[];
    }structure_t;
    cf discussion MPI + structures

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 498
    Billets dans le blog
    1
    Par défaut
    Si b est un tableau, les éléments du tableau sont inclus dans la structure ?

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Si b est un tableau, les éléments du tableau sont inclus dans la structure ?
    si c'est un tableau statique oui, si c'est un tableau dynamique il n'y aura que l'adresse..

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 498
    Billets dans le blog
    1
    Par défaut
    Cela ne signifie pas pour autant que sizeof(structure_t) varie ? D'un point de vue mémoire, le tableau est "collé" à la structure et donc l'espace global suit la formule donnée par diogene ?

    Dans le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef struct{
    	float a;
    	int b[];
    }structure_t;
     
      n = ...;
      size_t dimstruct = sizeof(structure_t)+n*sizeof(int);
      structure_t * resultat = malloc(dimstruct);
    ...
      free(resultat);
    est-ce que le tableau a automatiquement une taille de 10 ou faut-il une instruction supplémentaire pour spécifier la taille du tableau ? J'ai envie de répondre que oui, sinon le cas où la structure contiendrait plusieurs tableaux serait problématique.

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Cela ne signifie pas pour autant que sizeof(structure_t) varie ? D'un point de vue mémoire, le tableau est "collé" à la structure et donc l'espace global suit la formule donnée par diogene ?
    Bien sûr que si, que sizeof(struct) varie :

    Dans un cas elle est de (1 float+1 pointeur) dans l'autre elle est de (1 float+10 entiers)..


    Le tableau est n'importe où en mémoire, si il est alloué dynamiquement.Il n'est pas "collé" du tout.. La variable ne fait que renfermer l'adresse mémoire où l'emplacement démarre..

  7. #7
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    est-ce que le tableau a automatiquement une taille de 10 ou faut-il une instruction supplémentaire pour spécifier la taille du tableau ? J'ai envie de répondre que oui, sinon le cas où la structure contiendrait plusieurs tableaux seraient problématique.
    Non. Ce genre de construction n'est possible que pour un tableau placé en dernière position des champs de la structure. Il faut que la structure comporte un champ nommé (au moins) et la déclaration int b[] est là pour que le compilateur puisse tenir compte des questions d'alignement du tableau dans la taille de la structure "de base" et cette déclaration doit figurer en dernier champ.

    Pour plus de détails voir n1256 6.7.2.1 Structure and union specifiers §16 (flexible array member)

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 58
    Par défaut
    Oui désolé j'ai fait un mauvais copier/coller j'ai bien ceci comme structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    typedef struct{
    	float a;
    	int b[];
    }structure_t;
    mais impossible d'envoyer avec MPI_Allgather je dois envoyer un tableau de structure_t et recevoir dans une matrice 4 (nombre de mes processus) tableau de structure_t c'est ce que fais la fonction MPI_Allgather mais cela ne fonctionne pas :/

  9. #9
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 498
    Billets dans le blog
    1
    Par défaut
    Intéressantes ces structures à flexible array member. Merci à vous 2. Je vais me renseigner là-dessus

Discussions similaires

  1. Allocation de structure dynamique
    Par Clad3 dans le forum C
    Réponses: 32
    Dernier message: 24/01/2007, 21h00
  2. Réponses: 10
    Dernier message: 02/01/2007, 11h17
  3. [débutant][Conception] Structure dynamique avec Java
    Par blaiseac dans le forum Général Java
    Réponses: 5
    Dernier message: 19/11/2004, 00h00
  4. [C++ .NET] Structure dynamique
    Par tidou dans le forum VC++ .NET
    Réponses: 17
    Dernier message: 29/10/2004, 21h08
  5. Réponses: 12
    Dernier message: 26/04/2004, 09h32

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