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 :

problème envois struct qui contient char* en paramètre d'une fonction


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 7
    Points : 8
    Points
    8
    Par défaut problème envois struct qui contient char* en paramètre d'une fonction
    salut

    j'ai un problème avec le passage par valeur des struct :
    voici un simple code avec lequel j'essaye de trouver solution à mon problème:
    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
    #include "stdafx.h"
    #include "stdio.h"
    #include <string.h>
     struct BS
    	  {
    	  int   DRlen;   // the length of Boundary Scan Register
          int   PINnum;  // the number of devices pins
    	  int   IRlen;   // the length of Instruction Register
          char* Name;    // the name of JTAG-device
    	  char* ID;      // device ID Code
          char* File;    // file name with device description
     
          };
    void init_BS(struct BS*  BSbegin)
    {
    	char s[10];
    	strcpy(s,"hello");
    	BSbegin->Name=s;
       BSbegin->IRlen=12;
    }
     
    int _tmain(int argc, _TCHAR* argv[])
    {
      struct BS BSbegin; 
      init_BS(&BSbegin);
     
      printf("irlen:%d\n",BSbegin.IRlen);
     printf("name:%s\n",BSbegin.Name);
    	return 0;
    }
    mon problème c que l'affichage de irlen ce fait parfaitement mais le name ne s'affiche pas correctement

    s'il vous plait heeeeeeeeeelp

  2. #2
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Dans init_BS, quand tu écris BSbegin->Name=s;, Name reçoit l'adresse du premier élément du tableau s. En effet, sauf en argument unique de sizeof ou en argument de l'opérateur & (adresse de), un tableau est systématiquement converti lors de la compilation en l'adresse de son premier élément.

    Etant donné que s est une variable locale à init_BS, elle ne vit que le temps d'exécution de la fonction init_BS. Donc quand tu utilises ce Name hors de init_BS, comme tu le fais dans main avec ton BSbegin.Name, tu utilises l'adresse d'une variable qui n'existe plus. Le comportement de ton programme devient dès lors tout à fait logique.

    Solutions : changer la déclaration de Name en char Name[QUELQUE_CHOSE]; ou uiliser le mécanisme d'allocation dynamique (voir fonctins malloc et free).

  3. #3
    Futur Membre du Club
    Inscrit en
    Mars 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    ahhhh sayè c bon c trèèès simple la solution )))

    juste j'ai sortit char s[30] en dehors de la fonction et ça marchait trèèès bien

  4. #4
    Futur Membre du Club
    Inscrit en
    Mars 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    oui merci melem pour ta réponse rapide c'est la mm idée .

    merci énormement pour votre gentillesse

  5. #5
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par saffff Voir le message
    ahhhh sayè c bon c trèèès simple la solution )))

    juste j'ai sortit char s[30] en dehors de la fonction et ça marchait trèèès bien
    Mais attention, avec ce que tu fas, le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int _tmain(int argc, _TCHAR* argv[])
    {
        struct BS BSbegin; 
        init_BS(&BSbegin);
     
        printf("irlen:%d\n",BSbegin.IRlen);
        printf("name:%s\n",BSbegin.Name);
     
        strcpy(s, "bonjour");
        printf("name:%s\n",BSbegin.Name);
     
        return 0;
    }
    Affiche hello puis bonjour et non deux fois hello, car BSbegin.Name est juste un pointeur sur le premier élément de s et non une chaîne à part entière.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. tableau de struct qui contient un char*
    Par 3aychoucha dans le forum C++
    Réponses: 5
    Dernier message: 19/10/2011, 16h37
  2. Réponses: 4
    Dernier message: 08/05/2011, 13h44
  3. problème dllImport avec tableau de char[] en paramètre E/S
    Par moulefrite dans le forum Windows Forms
    Réponses: 4
    Dernier message: 24/12/2008, 10h07
  4. (jsp) problème avec sql qui contient la date
    Par future dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 31/08/2005, 16h18

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