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 :

Connaitre l'adresse mémoire de la dernière écriture ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2010
    Messages : 24
    Par défaut Connaitre l'adresse mémoire de la dernière écriture ?
    Bonjour à tous,

    Savez-vous comment récupérer l'adresse mémoire de l'endroit où on a écrit (en mémoire) en dernier ?
    Je suis en train de faire un programme avec un tableau de structures en mémoire partagée mais je ne vois pas trop comment savoir où écrire dans la mémoire puisque je n'ai pas seulement 1 seule struct mais bien un tableau.

    Je m'explique :A la base je comptais faire qqch comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for(i=0;i<80;i++)
    {
     on affecte la structure avec les valeurs
     puis on fait
     *( ptr_mem_partagee+i*sizeof(struct) )=structure[i];
    }
    mais cela ne fonctionnait pas... donc une autre façon de faire (selon moi, je pense) serait de récupérer l'adresse mémoire de la dernière case mémoire où on a écrit...
    Un genre de fseek avec l'argument current mais pour la mémoire.

    Auriez-vous une idée ? Ou voyez vous une méthode plus facile ?

    Merci beaucoup

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2010
    Messages : 24
    Par défaut
    En résumé je voudrais ajouter une structure dans la mémoire partagée (et donc garder ce qui est déjà dedans)

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 32
    Par défaut
    Bonjour,

    Citation Envoyé par vever001
    puis on fait
    *( ptr_mem_partagee+i*sizeof(struct) )=structure[i];
    }
    Euh si ptr_mem_partagee est deja un pointeur vers des structs il ne faut pas multiplier i par sizeof(struct), c'est implicite. Là c'est comme si vous multipliez 2 fois par sizeof !

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2010
    Messages : 24
    Par défaut
    Voici mon code actuel qui doit aller lire dans la mémoire partagée:
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    #include <sys/types.h>
    
    #include <sys/ipc.h>
    
    #include <sys/shm.h>
    #include <sys/stat.h>
    #include <sys/msg.h>
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <string.h>
    #include <ctype.h>
    
    #include <errno.h>
    
    #include <fcntl.h>
    
    
    #define SHMKEY 654321
    
    int cpt;
    int shmid,msqid;
    void *ptr_mem_partagee;
    
    struct Coureur {
    	int id;
    	char nom[25];
    	int temps;
    }c;
    struct Coureur coureur;
    
    int main()
    { 
     int i;
    
     //on obtient l'id du segment mémoire associé à la clé
     if ((shmid = shmget(SHMKEY, 80*sizeof(c), 0666 | IPC_CREAT)) < 0) 
     {
      perror("shmget");
      exit(1);
     }
     
     //on attache le segment de mémoire partagée
     if ((ptr_mem_partagee = shmat(shmid, NULL, 0)) == (void*) -1) 
     {
      perror("shmat"); 
      exit(1);
     } 
    
     for(i=0;i<80;i++)
     {
      cpt=i*sizeof(c);
      coureur.id = *((c*)ptr_mem_partagee + (i*sizeof(c)) );
      printf("Id du coureur : %d\n",coureur.id);
      printf("Nom du coureur : %s",coureur.nom);
      printf("Temps au tour : %d\n\n",coureur.temps); 
     }
    
     return 0;
    }


    et dans mon autre programme je fais ceci:
    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
     
    struct Coureur {
    	int id;
    	char nom[25];
    	int temps;
    }c;
    struct Coureur tab_candidats[80];
    ...
    if ((shmid = shmget(SHMKEY, 80*sizeof(c), 0666 | IPC_CREAT)) < 0) 
     {
      perror("shmget");
      exit(1);
     }
    ...
    *((c*)ptr_mem_partagee + (nb_coureur*sizeof(c)) ) = tab_candidats[nb_coureur];
    J'ai aussi un autre problème qui n'a rien à voir :
    En ce moment je viens de passer 1h à essayer de comprendre pourquoi le compilateur m'affiche cette erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    client2.c: In function ‘main’:
    client2.c:49: error: expected expression before ‘)’ token
    C'est à la ligne que j'ai soulignée en rouge et je ne comprend vraiment pas...
    Pourtant je suis certain que la ligne est correcte c'est sa le pire !
    Je commence à devenir fou


    Merci pour votre aide car la je suis désespéré.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 32
    Par défaut
    C'est à la ligne que j'ai soulignée en rouge et je ne comprend vraiment pas...
    Pourtant je suis certain que la ligne est correcte c'est sa le pire !
    Je commence à devenir fou
    Non cette ligne est fausse mais l'erreur vient d'ailleurs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct Coureur {
    	int id;
    	char nom[25];
    	int temps;
    }c;
    Veut dire défini une struct et crée une instance appelée c !!
    Pour faire ce que vous voulez, c'est à dire que la struct s'appelle bien c, alors il faut utiliser le mot clé typedef, comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct Coureur {
    	int id;
    	char nom[25];
    	int temps;
    }c;
    On ne peut utiliser sizeof que sur un type et comme ici c était une variable, il y avait une erreur, plus ou moins lisible (pas trivial de donner des bons messages d'erreurs lors du parse).


    EDIT :
    Au passage j'ai oublié de dire mais pour votre autre erreur, c'est bien à cause du sizeof !!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *((c*)ptr_mem_partagee + nb_coureur ) = tab_candidats[nb_coureur];
    et non pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *((c*)ptr_mem_partagee + (nb_coureur*sizeof(c)) ) = tab_candidats[nb_coureur];

    Si p est de type T* alors p + i revient à prendre l'adresse de p et à la décaler de i fois sizeof(T).

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2010
    Messages : 24
    Par défaut
    arf, en effet un tout grand merci

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 32
    Par défaut
    On apprend mieux par l'erreur que par la réussite immédiate

Discussions similaires

  1. Réponses: 9
    Dernier message: 14/01/2006, 10h36
  2. connaitre les adresses IP des contacts sur msn
    Par starway dans le forum Messagerie instantanée
    Réponses: 6
    Dernier message: 28/10/2005, 20h39
  3. Réponses: 6
    Dernier message: 19/09/2005, 19h48
  4. Connaitre l'adresse IP du serveur
    Par SEMPERE Benjamin dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 23/07/2005, 15h24
  5. [JVM] Connaitre la taille mémoire utilisé par les dif classe
    Par sur_uix dans le forum Général Java
    Réponses: 4
    Dernier message: 18/09/2003, 09h17

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