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 de structure


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 229
    Par défaut Problème de structure
    Voir commentaire dans le code

    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
     
    typedef struct Trame
    {
    	char AdresseDuModule[2];
    	char Fonction[2];
    	char AdresseDuRegistre[4];
    	char EtatDuVentilateur[4];
    	char Checksum[4];
     
    }st_Trame;
     
    void main()
    {
    	char ChaineRecue[17] = "030600020001E828";
    	st_Trame* MaTrame;
    	MaTrame = (st_Trame*) ChaineRecue;
     
    	printf("%s\n",MaTrame->AdresseDuModule); // doit contenir "03"
    	printf("%s\n",MaTrame->Fonction); // doit contenir "06"
    	printf("%s\n",MaTrame->AdresseDuRegistre); //doit contenir "0002"
    	printf("%s\n",MaTrame->EtatDuVentilateur); // doit contenir "0001"
    	printf("%s\n",MaTrame->Checksum);; //doit contenir "E828"
    }
    Résultat obtenu :

    030600020001E828 (alors que je souhaiterai avoir : "03")
    0600020001E828 (alors que je souhaiterai avoir : "06")
    00020001E828 (alors que je souhaiterai avoir : "0002")
    0001E828 (alors que je souhaiterai avoir : "0001")
    E828

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Les fonctions de la bibliotheque standard attendent des chaines de caracteres bien definies, i.e. terminees par '\0'. Ta chaine ChaineRecue est definie correctement, avec un '\0' a la fin, mais pas tes sous-chaines : du coup printf() imprime tout jusqu'au '\0'.

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

    Informations forums :
    Inscription : Février 2007
    Messages : 229
    Par défaut
    Citation Envoyé par DaZumba
    Les fonctions de la bibliotheque standard attendent des chaines de caracteres bien definies, i.e. terminees par '\0'. Ta chaine ChaineRecue est definie correctement, avec un '\0' a la fin, mais pas tes sous-chaines : du coup printf() imprime tout jusqu'au '\0'.
    Comment je peux faire pour terminer mes sous chaines par un \0 ? :s

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 86
    Par défaut
    moi je fais comme ca
    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>
     
     
    typedef struct Trame
    {
    	char AdresseDuModule[2+1];
    	char Fonction[2+1];
    	char AdresseDuRegistre[4+1];
    	char EtatDuVentilateur[4+1];
    	char Checksum[4+1];
     
    }st_Trame;
     
    int main(void)
    {
    int err;
    	char ChaineRecue[17] = "030600020001E828";
    	st_Trame * MaTrame = malloc(sizeof(st_Trame));
    if(MaTrame==NULL)return -1; 	
    err =sscanf(ChaineRecue,"%2s%2s%4s%4s%4s",MaTrame->AdresseDuModule,MaTrame->Fonction,MaTrame->AdresseDuRegistre,MaTrame->EtatDuVentilateur,MaTrame->Checksum);
     
    if(err!=5)return -2;
    	printf("%s\n",MaTrame->AdresseDuModule); // doit contenir "03"
    	printf("%s\n",MaTrame->Fonction); // doit contenir "06"
    	printf("%s\n",MaTrame->AdresseDuRegistre); //doit contenir "0002"
    	printf("%s\n",MaTrame->EtatDuVentilateur); // doit contenir "0001"
    	printf("%s\n",MaTrame->Checksum);; //doit contenir "E828"
     
     
    free(MaTrame);
    MaTrame=NULL;
    return 0;
    }

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

    Informations forums :
    Inscription : Février 2007
    Messages : 229
    Par défaut
    Citation Envoyé par scriptoff
    moi je fais comme ca
    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>
     
     
    typedef struct Trame
    {
    	char AdresseDuModule[2+1];
    	char Fonction[2+1];
    	char AdresseDuRegistre[4+1];
    	char EtatDuVentilateur[4+1];
    	char Checksum[4+1];
     
    }st_Trame;
     
    int main(void)
    {
    int err;
    	char ChaineRecue[17] = "030600020001E828";
    	st_Trame * MaTrame = malloc(sizeof(st_Trame));
    if(MaTrame==NULL)return -1; 	
    err =sscanf(ChaineRecue,"%2s%2s%4s%4s%4s",MaTrame->AdresseDuModule,MaTrame->Fonction,MaTrame->AdresseDuRegistre,MaTrame->EtatDuVentilateur,MaTrame->Checksum);
     
    if(err!=5)return -2;
    	printf("%s\n",MaTrame->AdresseDuModule); // doit contenir "03"
    	printf("%s\n",MaTrame->Fonction); // doit contenir "06"
    	printf("%s\n",MaTrame->AdresseDuRegistre); //doit contenir "0002"
    	printf("%s\n",MaTrame->EtatDuVentilateur); // doit contenir "0001"
    	printf("%s\n",MaTrame->Checksum);; //doit contenir "E828"
     
     
    free(MaTrame);
    MaTrame=NULL;
    return 0;
    }

    Quand j'essaye ton code, j'obtient une erreur sur cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	st_Trame * MaTrame = malloc(sizeof(st_Trame));
    erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    D:\toutbete\main.cpp(20) : error C2440: 'initializing' : cannot convert from 'void *' to 'struct Trame *'
            Conversion from 'void*' to pointer to non-'void' requires an explicit cast
    Error executing cl.exe.
    J'utilise Microsoft Visual C++ 6.0

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Nemesis007
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    D:\toutbete\main.cpp(20) : error C2440: 'initializing' : cannot convert from 'void *' to 'struct Trame *'
            Conversion from 'void*' to pointer to non-'void' requires an explicit cast
    Error executing cl.exe.
    J'utilise Microsoft Visual C++ 6.0
    Alors vérifie que tu compiles bien en C et non en C++. Commence par renommer main.cpp en main.c et par modifier ton projet en conséquence.

    Vérifie aussi que <stdlib.h> est bien inclus...

    En non, la solution n'est pas de mettre un cast, contrairement à ce que quelques ignares de passage ne manqueront pas de te dire...

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Nemesis007
    Comment je peux faire pour terminer mes sous chaines par un \0 ? :s
    Ya pas trop le choix, il faut créer des copies suffisamment grandes pour contenir le 0... La méthode de scriptoff est correcte.

Discussions similaires

  1. Problème de structure "récursive"
    Par Pxnet dans le forum C
    Réponses: 5
    Dernier message: 21/01/2007, 17h20
  2. Problème de structures
    Par Zikas-r dans le forum C
    Réponses: 6
    Dernier message: 27/12/2006, 00h01
  3. Réponses: 16
    Dernier message: 21/08/2006, 14h12
  4. [Structures]Problème sur structures
    Par kendras dans le forum C++
    Réponses: 5
    Dernier message: 07/06/2006, 10h20
  5. [OCaml] Problème de structure/parser
    Par marv1 dans le forum Caml
    Réponses: 4
    Dernier message: 09/05/2005, 12h16

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