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 :

Tableau de mémoire partagée


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 51
    Points : 30
    Points
    30
    Par défaut Tableau de mémoire partagée
    Bonjour,


    j'essaie de créer un tableau de mémoire partagée. Seulement, je ne sais pas si cela à vraiment un sens ou si cela est possible.
    Pour l'instant, j'écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     /* Attribution d'un segment de mémoire partagée*/
      pions_id = shmget (IPC_PRIVATE, nb_cases * sizeof(double), 0666);
      if (pions_id == -1)
      {
        perror("pions shm error \n");
        exit (-1);
      }
     
      pions = shmat(pions_id, NULL, 0666);
      if (pions == (double*) -1)
      {
        perror("pions shm error \n");
        exit (-1);
      }
    Ensuite je travail avec pions comme un vecteur (Donc j'y accède en faisant pions[place])
    Mais j'aimerai travailler avec pion comme un tableau à deux dimensions.

    Merci de me dire si c'est possible et de m'expliquer comment faire ou de me renvoyer vers de la documentation l'expliquant


    Bonne soirée !

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    On peut toujours se débrouiller pour faire en sorte qu'un tableau à une dimension soit un tableau à deux dimensions, mais la méthode est dangereuse et crade.

    Il faut faire un cast pour dire au compilateur: "regarde mon joli pointeur, il va falloir l'utiliser comme ça".
    Maintenant, y a de gros risque de bugs, sauf si les données ont été passé en partant du tableau à deux dimensions.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    double** ppTab = (double**)pions;
    Dans ce genre, je pense.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 51
    Points : 30
    Points
    30
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    sauf si les données ont été passé en partant du tableau à deux dimensions.
    Tu entends quoi par là ?
    Par exemple, si après mon code j'écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    double** ppTab = (double**)pions;
    et qu'après j'initialise ppTab de la manière suivante (en supposant ici que nb_lignes est un nombre carré :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    nb_lignes = sqrt(nb_cases);
    for(i=0; i < nb_lignes; i++) {
      for(j=0; j < nb_lignes; j++) {
        ppTab[i][j]=0
      }
    }
    Est ce que ça va fonctionner ou est-ce qu'il y a un gros risque de bug ?!

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Citation Envoyé par sikin1989 Voir le message
    Tu entends quoi par là ?
    Par exemple, si après mon code j'écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    double** ppTab = (double**)pions;
    et qu'après j'initialise ppTab de la manière suivante (en supposant ici que nb_lignes est un nombre carré :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    nb_lignes = sqrt(nb_cases);
    for(i=0; i < nb_lignes; i++) {
      for(j=0; j < nb_lignes; j++) {
        ppTab[i][j]=0
      }
    }
    Est ce que ça va fonctionner ou est-ce qu'il y a un gros risque de bug ?!
    Oui cela peut fonctionner, mais comme toujours, en C, dès que l'on fait mumuse avec les pointeurs, les chances de crash / corruption sont grandes.
    Je vous conseillerai valgrind pour pouvoir vérifié les erreurs, même les plus infimes.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 51
    Points : 30
    Points
    30
    Par défaut
    Okay !

    Merci beaucoup pour les réponses ! Mais ca m'énerve un peu que ça soit sujet à des bugs . Y'a pas une solution propre et sans risque de faire ce que je désire ?

    Enfin, pour l'instant je vais essayer avec ça Encore merci !

  6. #6
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Bonjour,

    On peut toujours se débrouiller pour faire en sorte qu'un tableau à une dimension soit un tableau à deux dimensions, mais la méthode est dangereuse et crade.

    Il faut faire un cast pour dire au compilateur: "regarde mon joli pointeur, il va falloir l'utiliser comme ça".
    Maintenant, y a de gros risque de bugs, sauf si les données ont été passé en partant du tableau à deux dimensions.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    double** ppTab = (double**)pions;
    Dans ce genre, je pense.
    Ceci ne caractérise pas un tableau à deux dimensions, mais un tableau de pointeurs, ce qui n'est pas la même chose.

    La solution la plus générale est sans doute de calculer soi-même les indices :
    Si nbCol est le nombre de colonnes du tableau 2D tab[nbLignes][nbCol] que l'on veut simuler, alors l'élément tab[i][j] est l'élément pions[i*nbCol+j]
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  7. #7
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Sinon tu dois pouvoir faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double (*ptr)[DIM_Y][DIM_X] = (double (*)[3][3])shmat(...);
    Puis accéder aux cases par :
    Dans cet exemple ptr est un pointeur vers un tableau à deux dimensions. Il faut faire très attention aux parenthèses.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 51
    Points : 30
    Points
    30
    Par défaut
    Merci pour votre truc, ça a l'air de fonctionner

    Seulement, un peu plus loin, j'essaye de faire une fonction qui retourne le tableau, mais je n'y parviens pas !
    Comment suis-je sensé faire ?

    J'ai même essayé en créeant une fonction qui me renvoi chacune des valeurs du tableau mais ca ne marche même pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    double get_temperature(int i, int j) {
      return ((*temperature_tab)[i][j])
    }
    Ca me donne comme erreur : error : subscripted value is neither array nor pointer.

    Mais bon, l'idéal serait de pouvoir renvoyer mon tableau en mémoire partagé d'un coup ..

  9. #9
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    - L'erreur dépend de la définition de temperature_tab que tu ne donnes pas

    - Il n'y a pas nécessité de passer par un pointeur sur un tableau à deux dimensions. Il suffit de passer par un pointeur sur un tableau à une dimension :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      typedef double (*Tab2D)[DIM_X]; // pour simplifier l'écriture
      Tab2D p = (Tab2D)pions;
      p[i][j] = .... // accès aux éléments
     
    double get_temperature(Tab2D temperature_tab,int i, int j) {
      return temperature_tab[i][j]
    }
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/03/2010, 18h18
  2. Tableau en mémoire partagée
    Par jchenoy dans le forum C
    Réponses: 5
    Dernier message: 05/11/2007, 11h58
  3. Réponses: 17
    Dernier message: 02/02/2006, 12h03
  4. création d'objet en mémoire partagé
    Par BigNic dans le forum C++
    Réponses: 6
    Dernier message: 28/11/2005, 18h41
  5. [CR][paradox] mémoire partagée disponible insuffisante !
    Par AGT dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 24/03/2004, 14h27

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