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 :

chaine de caracteres et memoire partagée


Sujet :

C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 46
    Points : 25
    Points
    25
    Par défaut chaine de caracteres et memoire partagée
    bonjour à tous,

    je bloque actuellement sur un truc, c'est veritable casse tete (enfin pour moi...)

    je souhaiterais utilisée la memoire partagée pour partager une structure de données qui contient notamment une chaine de caracteres non connues a l'avance.
    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct shmstruct{
    ...
    char * message;
    ...
    }sharedData_s;

    le truc ,c'est que ce que je veux partagée, c'est une phrase que je construit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    i=sprintf( message , "blablabla %i \n" , MonInt );
    ca ne fonctionne pas

    si je fais un test simple
    là ca marche ...

    pouvez vous m'expliquer d'ou vient mon probleme? merci

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    As-tu alloué l'adresse pointée par ton pointeur avant d'y stocker ta chaîne. Le fait que ca marche lorsque tu y fait une simple affectation, ca te produit une chaîne statique donc définite à la compilation.

    Donc en clair, tu alloues assez d'espace pour stocker ta chaîne puis tu fait ton sprintf !

  3. #3
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    L'espace pointé par lem pointeur message doit être alloué. Lorsque tu écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *message;
    message = "test";
    message pointe sur la constante chaine de caractère non modifiable "test" stockée en mémoire statique. Par contre, tu ne peux pas utiliser sprintf() avant d'avoir alloué l'espace nécessaire pour que message reçoive le résultat de sprintf(). Ex:

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct shmstruct{
     
        char * message;
        size_t taille_msg;
     
    } sharedData_s;
     
    int main(void)
    {
        sharedData_s data = {NULL, 30};
        int monInt = 10;
     
        data.message = malloc(data.taille_msg * sizeof *data.message);
        if (data.message != NULL)
        {
            /*-TC- Si on dispose d'un compilateur qui supporte C99, je préfère
               snprintf() à sprintf(). */
            snprintf(data.message, data.taille_msg, "blablabla %d \n", monInt);
     
            /* Ici: Traitements avec data.message */
     
            free((void *) data.message), data.message = NULL;
        }
        else
        {
            fprintf(stderr, "L'allocation a échoué!\n");
            exit(EXIT_FAILURE);
        }
     
        return EXIT_SUCCESS;
    }
    Thierry

  4. #4
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Points : 403
    Points
    403
    Par défaut
    Bonjour,

    Je voyais plutôt :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    typedef struct shmstruct{
     
        char * message;
        size_t taille_msg;
     
    } sharedData_s;
     
    const char * titre  = "toto le message qui rigole" ; 
     
    int main(void)
    {
        sharedData_s data ; 
        int monInt = 10;
     
        data.taille_msg = ( strlen( titre ) + 1) + 10 ; // 10 en reserve pour monInt;  
        data.message = malloc( data.taille_msg );
        if (data.message != NULL)
        {
            sprintf("%s %d", data.message, titre, monInt )
            printf("%s %d\n", data.message, monInt ) ; 
            free((void *) data.message), data.message = NULL;
        }
        else
        {
            fprintf(stderr, "L'allocation a échoué!\n");
            exit(EXIT_FAILURE);
        }
     
        return EXIT_SUCCESS;
    }
    Je ne vois pas le problème.

    Salut.

  5. #5
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par dj.motte
    Bonjour,

    Je voyais plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            sprintf("%s %d", data.message, titre, monInt )
    Je ne vois pas le problème.

    Salut.
    Dis moi, tu testes tes codes avant de poster ?

    PS : Pourquoi es-tu "Provisoirement toléré" ? Ca veut dire quoi ? Tu as fumer quelque chose d'illicite ? Tu sort de taule ?

  6. #6
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par dj.motte
    Bonjour,

    Je voyais plutôt :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    typedef struct shmstruct{
     
        char * message;
        size_t taille_msg;
     
    } sharedData_s;
     
    const char * titre  = "toto le message qui rigole" ; 
     
    int main(void)
    {
        sharedData_s data ; 
        int monInt = 10;
     
        data.taille_msg = ( strlen( titre ) + 1) + 10 ; // 10 en reserve pour monInt;  
        data.message = malloc( data.taille_msg );
        if (data.message != NULL)
        {
            sprintf("%s %d", data.message, titre, monInt )
            printf("%s %d\n", data.message, monInt ) ; 
            free((void *) data.message), data.message = NULL;
        }
        else
        {
            fprintf(stderr, "L'allocation a échoué!\n");
            exit(EXIT_FAILURE);
        }
     
        return EXIT_SUCCESS;
    }
    Je ne vois pas le problème.

    Salut.
    Si ça t'amuse. Pour sprintf(), un petit tour du côté de la documentation s'impose. En qui concerne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    data.message = malloc(data.taille_msg * sizeof *data.message);
    est préférable du point de vue maintenance du code (ça ne mange pas d'pain de voir loin).

    Thierry

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par dj.motte
    Je voyais plutôt :
    <...>
    Je ne vois pas le problème.
    Mon compilateur le voit...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums2\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c: In function `main':
    main.c:23: warning: passing arg 1 of `sprintf' discards qualifiers from pointer target type
    main.c:24: error: syntax error before "printf"
    Process terminated with status 1 (0 minutes, 2 seconds)
    1 errors, 1 warnings

  8. #8
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Points : 403
    Points
    403
    Par défaut
    Bonjour,

    Je ne teste pas. Mais je corrige :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sprintf("%s %s %d", data.message, titre, monInt )
    C' était trop difficile à comprendre.

    Pas la peine de m' agresser, je ne répondrai pas.

    Salut.

  9. #9
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par dj.motte
    Bonjour,

    Je ne teste pas. Mais je corrige :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sprintf("%s %s %d", data.message, titre, monInt )
    C' était trop difficile à comprendre.

    Pas la peine de m' agresser, je ne répondrai pas.

    Salut.
    Ca c'est a mettre dans le bétisier...Excellent...

  10. #10
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par dj.motte
    Bonjour,

    Je ne teste pas. Mais je corrige :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sprintf("%s %s %d", data.message, titre, monInt )
    C' était trop difficile à comprendre.

    Pas la peine de m' agresser, je ne répondrai pas.

    Salut.
    Regarde encore une fois le man de plus près: http://man.developpez.com/man3/sprintf.3.php . A défaut de tester, autant bien se documenter

    Thierry

  11. #11
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par dj.motte
    Je ne teste pas. Mais je corrige :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sprintf("%s %s %d", data.message, titre, monInt )
    Tu ferais mieux de tester au lieu de poster des aneries... On est pas là pour ramasser le crottin...

  12. #12
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Points : 403
    Points
    403
    Par défaut
    Bonjour,

    Je corrige mon anerie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sprintf(buffer, %s %s %d", data.message, titre, monInt ) ;
    Pas la peine de s' exciter les gus ...

    salut.

  13. #13
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par dj.motte
    Bonjour,

    Je corrige mon anerie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sprintf(buffer, %s %s %d", data.message, titre, monInt ) ;
    Pas la peine de s' exciter les gus ...

    salut.
    Peux mieux faire.........

  14. #14
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Points : 403
    Points
    403
    Par défaut
    Bonjour,

    On peut mieux faire avec :

    vsnprintf( ... ) ;
    ou
    snprintf( ... )

    Ces deux fonctions sont compatibles avec la librairie descendante du C et du C++.

    Salut.

  15. #15
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par dj.motte
    Bonjour,

    On peut mieux faire avec :

    vsnprintf( ... ) ;
    ou
    snprintf( ... )

    Ces deux fonctions sont compatibles avec la librairie descendante du C et du C++.

    Salut.
    Revenons au problème qui nous occupe et fini de jouer à la lotterie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    sprintf(data.message, "blablabla %d \n", monInt);
     
    /* ou */
     
    char const *s_titre = "Blablabla";
    /*...*/
    sprintf(data.message, "%s %d\n", s_titre, monInt);
    En s'assurant que la taille allouée à data.message est suffisante pour accueillir la chaine en question. Au passage, je ne comprends pas pourquoi ta variable titre est globale?

    Thierry

  16. #16
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Points : 403
    Points
    403
    Par défaut
    Bonjour,

    En s'assurant que la taille allouée à data.message est suffisante pour accueillir la chaine en question. Au passage, je ne comprends pas pourquoi ta variable titre est globale?
    J' ai défini la variable 'titre" comme globale, afin de permettre sa récupération par une fonction utilisateur.
    Je devine que vous n' allez pas être soudé dans votre fonction "main" .

    Salut.

  17. #17
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par dj.motte
    Bonjour,



    J' ai défini la variable 'titre" comme globale, afin de permettre sa récupération par une fonction utilisateur.
    Je devine que vous n' allez pas être soudé dans votre fonction "main" .

    Salut.
    Les arguments servent à cela... C'est rare que j'utilise des variables globales, c'est d'ailleurs fortement déconseillé.

    Thierry

  18. #18
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Et moi qui pensais que je me couchais à des heures trop tardives, je me rends compte que je suis un p’tit joueur.
    Hé les gars, vous finissez vos nuits au boulot ou quoi ? Mais comment vous faites ?

  19. #19
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par crocodilex
    Et moi qui pensais que je me couchais à des heures trop tardives, je me rends compte que je suis un p’tit joueur.
    Hé les gars, vous finissez vos nuits au boulot ou quoi ? Mais comment vous faites ?
    "Je dors peu, mais je dors vite"
    -- Albert E.

  20. #20
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par crocodilex
    Et moi qui pensais que je me couchais à des heures trop tardives, je me rends compte que je suis un p’tit joueur.
    Hé les gars, vous finissez vos nuits au boulot ou quoi ? Mais comment vous faites ?
    Heureusement, ce n'est pas tous les jours comme ça...

    Thierry

Discussions similaires

  1. C-System : Memoire partagée et Liste chainée
    Par agrosjea dans le forum C
    Réponses: 3
    Dernier message: 18/06/2008, 09h58
  2. Liberation memoire chaine de caractere
    Par BatuBou dans le forum C
    Réponses: 12
    Dernier message: 12/01/2008, 04h52
  3. memoire et chaine de caracteres
    Par hamma2 dans le forum Langage
    Réponses: 9
    Dernier message: 11/01/2007, 17h50
  4. Réponses: 44
    Dernier message: 18/05/2006, 16h19
  5. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01

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