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 chevauchement!


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5
    Par défaut Problème de chevauchement!
    Bonjour à tous,

    Je me tourne vers vous dans l'espoir d'avoir une petite aide à mon problème... en effet ca fait déjà 4 jours que je suis dessus et j'ai beau retourner le problème dans tous les sens je n'y arrive pas...

    J'ai un fichier de config contenant du texte:

    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
    # Firmware variables
    RFB_PATH=/dev/ttyUSB1
    POWER_LED_PATH=/dev/ttyUSB2
    BOOT_LED_PATH=/dev/ttyUSB3
    FIRMWARE_LED_PATH=/dev/ttyUSB4
    TX_LED_PATH=/dev/ttyUSB5
    RX_LED_PATH=/dev/ttyUSB6
     
    # Transmission variables
    DEST_ID=0
    SENSORS=45980
    TX_INTERVAL_H=0
    TX_INTERVAL_MS=2000
    TX_MAX_NUMBER=500
    TX_TOPOLOGY_INTERVAL=0
     
    # Network variables
    OPERATING_MODE=1
    PAN_ID=250
    ROLE=C
    CHMASK=100000
    MAC_ADDR=0
    NET_ID=0
    NODE_NAME=COORD
    Dans mon fichier source contenant le main, je déclare donc les trois structures suivantes:

    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
    /* Firmware structure definition */
    typedef struct {
       unsigned char RFB_PATH[20];
       unsigned char POWER_LED_PATH[20];
       unsigned char BOOT_LED_PATH[20];
       unsigned char FIRMWARE_LED_PATH[20];
       unsigned char TX_LED_PATH[20];
       unsigned char RX_LED_PATH[20];
    } fwStr;
     
    /* Transmission structure definition */
    typedef struct {
       unsigned char DEST_ID[4]; 
       unsigned char SENSORS[4];
       unsigned char TX_INTERVAL_H[4];
       unsigned char TX_INTERVAL_MS[6];
       unsigned char TX_MAX_NUMBER[8];
       unsigned char TX_TOPOLOGY_INTERVAL[4];
    } tmnStr;
     
    /* Network structure definition */
    typedef struct {
       unsigned char OPERATING_MODE[1];
       unsigned char PAN_ID[4];
       unsigned char ROLE[1];
       unsigned char CHMASK[8];
       unsigned char MAC_ADDR[16];
       unsigned char NET_ID[4];
       unsigned char NODE_NAME[10];
    } nwStr;
    Dans ma fonction main, j'appelle la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    readFile(file, &firmware, &transmission, &network);
    décrite ci-dessous:

    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
    void readFile(FILE *file, fwStr *firmware, tmnStr *transmission, nwStr *network) {
     
       /* Getting firmware structure */
       sscanf(getFileLine(file, 1), "RFB_PATH=%s", firmware->RFB_PATH);
       sscanf(getFileLine(file, 1), "POWER_LED_PATH=%s", firmware->POWER_LED_PATH);
       sscanf(getFileLine(file, 1), "BOOT_LED_PATH=%s", firmware->BOOT_LED_PATH);
       sscanf(getFileLine(file, 1), "FIRMWARE_LED_PATH=%s", firmware->FIRMWARE_LED_PATH);
       sscanf(getFileLine(file, 1), "TX_LED_PATH=%s", firmware->TX_LED_PATH);
       sscanf(getFileLine(file, 1), "RX_LED_PATH=%s", firmware->RX_LED_PATH);
     
       /* Getting transmission structure */
       sscanf(getFileLine(file, 1), "DEST_ID=%s", transmission->DEST_ID);
       sscanf(getFileLine(file, 1), "SENSORS=%s", transmission->SENSORS);
       sscanf(getFileLine(file, 1), "TX_INTERVAL_H=%s", transmission->TX_INTERVAL_H);
       sscanf(getFileLine(file, 1), "TX_INTERVAL_MS=%s", transmission->TX_INTERVAL_MS);
       sscanf(getFileLine(file, 1), "TX_MAX_NUMBER=%s", transmission->TX_MAX_NUMBER);
       sscanf(getFileLine(file, 1), "TX_TOPOLOGY_INTERVAL=%s", transmission->TX_TOPOLOGY_INTERVAL);
     
       /* Getting network structure */
       sscanf(getFileLine(file, 1), "OPERATING_MODE=%s", network->OPERATING_MODE);
       sscanf(getFileLine(file, 1), "PAN_ID=%s", network->PAN_ID);
       sscanf(getFileLine(file, 1), "ROLE=%s", network->ROLE);
       sscanf(getFileLine(file, 1), "CHMASK=%s", network->CHMASK);
       sscanf(getFileLine(file, 1), "MAC_ADDR=%s", network->MAC_ADDR);
       sscanf(getFileLine(file, 1), "NET_ID=%s", network->NET_ID);
       sscanf(getFileLine(file, 1), "NODE_NAME=%s", network->NODE_NAME);
     
    /* Debug */
       printf("[%s]\n", firmware->RFB_PATH);
       printf("[%s]\n", firmware->POWER_LED_PATH);
       printf("[%s]\n", firmware->BOOT_LED_PATH);
       printf("[%s]\n", firmware->FIRMWARE_LED_PATH);
       printf("[%s]\n", firmware->TX_LED_PATH);
       printf("[%s]\n", firmware->RX_LED_PATH);
       printf("[%s]\n", transmission->DEST_ID);
       printf("[%s]\n", transmission->SENSORS);
       printf("[%s]\n", transmission->TX_INTERVAL_H);
       printf("[%s]\n", transmission->TX_INTERVAL_MS);
       printf("[%s]\n", transmission->TX_MAX_NUMBER);
       printf("[%s]\n", transmission->TX_TOPOLOGY_INTERVAL);
       printf("[%s]\n", network->OPERATING_MODE);
       printf("[%s]\n", network->PAN_ID);
       printf("[%s]\n", network->ROLE);
       printf("[%s]\n", network->CHMASK);
       printf("[%s]\n", network->MAC_ADDR);
       printf("[%s]\n", network->NET_ID);
       printf("[%s]\n", network->NODE_NAME);
    }
    Le problème est que je n'obtient pas les bonnes valeurs pour network->OPERATING_MODE (1250 au lieu de 1) et pour le role (C100000 au lieu de C) :

    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
    [/dev/ttyUSB1]
    [/dev/ttyUSB2]
    [/dev/ttyUSB3]
    [/dev/ttyUSB4]
    [/dev/ttyUSB5]
    [/dev/ttyUSB6]
    [0]
    [45980]
    [0]
    [2000]
    [500]
    [0]
    [1250]
    [250]
    [C100000]
    [100000]
    [0]
    [0]
    [COORD]
    Si je fais un printf de OPERATING_MODE et ROLE juste après leurs sscanf respectifs, ils contiennent les bonnes valeurs, mais plus après les sscanf suivants...

    Je suis un peu perdu pcq j'ai tout essayé et cette solution est l'une qui me semble la plus correcte...

    Pour ceux qui veulent savoir ce que contient la fonction GetFileLine, la voici:

    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
    char *getFileLine(FILE *file, int skip) {
     
       char buffer[FILE_LINE_LIMIT];
     
       /* While no valid line readed */
       while(1) {
          /* Reading each line */
          fgets(buffer, sizeof(buffer), file);
     
          /* Skipping comment and blank lines */
          if(skip && (buffer[0] == '#' || buffer[0] == '\n')) {;}
          else { 
             char *line = calloc(1, strlen(buffer));
             strncpy(line, buffer, strlen(buffer));
             return line;
          }
       }
    }
    Un GRAND merci d'avance à ceux/celles qui auront la patience de m'aider ou du moins de me diriger vers la bonne voie ;-)

    Bruno.

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Peut-être qu'en rajoutant 1 au calloc pour prévoir le caractère de fin de chaine ça marcherait mieux !
    Pense à tester le retour de calloc, ON NE SAIT JAMAIS !
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Le code doit fonctionner...

    C'est l'affichage qui déconne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct {
       unsigned char OPERATING_MODE[1];
       unsigned char PAN_ID[4];
    } nwStr;
    OPERATING_MODE est défini comme étant un caractère unique...
    quand demande à l'afficher, on demande à l'afficher comme une chaine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       printf("[%s]\n", network->OPERATING_MODE);
       printf("[%s]\n", network->PAN_ID);
    printf va afficher des choses jusqu'à tomber sur le caratère \0 qu'il ne trouvera que dans le champ suivant.
    Solution : laisser une place pour le \0 final dans tous les champs : unsigned char OPERATING_MODE[1+1];
    OU
    considérer OPERATING_MODE comme ce qu'il est : un caractère et la manipuler avec %c.

    Au passage, calloc + strncpy, c'est lourd, il faut mieux utiliser strdup.

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    strdup n'est pas standart je crois. Par contre il assure la longueur de chaîne correcte.
    Dans les deux cas, il faudra penser au free de la chaîne à la fin du prog.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5
    Par défaut
    Trap D et mabu, un grand merci à vous deux...

    En effet, je n'avais pas prévu dans mes champs l'espace pour '\0'... en incrémentant toutes les tailles des champs d'une unité, ca fonctionne nickel ;-)

    Concernant le free de la chaine, est-ce que le code suivant pourrait fonctionner?

    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
    char *line;
     
       /* Getting firmware structure */
       line = getFileLine(file, 1);
       sscanf(line, "RFB_PATH=%s", firmware->RFB_PATH);
       free(line);
       line = getFileLine(file, 1);
       sscanf(line, "POWER_LED_PATH=%s", firmware->POWER_LED_PATH);
       free(line);
       line = getFileLine(file, 1);
       sscanf(line, "BOOT_LED_PATH=%s", firmware->BOOT_LED_PATH);
       free(line);
       line = getFileLine(file, 1);
       sscanf(line, "FIRMWARE_LED_PATH=%s", firmware->FIRMWARE_LED_PATH);
       free(line);
       line = getFileLine(file, 1);
       sscanf(line, "TX_LED_PATH=%s", firmware->TX_LED_PATH);
       free(line);
       line = getFileLine(file, 1);
       sscanf(line, "RX_LED_PATH=%s", firmware->RX_LED_PATH);
       free(line);
     
       ...
    Merci encore ;-)

  6. #6
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par br0uuu Voir le message
    Concernant le free de la chaine, est-ce que le code suivant pourrait fonctionner?
    Oui, la règle, c'est un free à chaque malloc, calloc, realloc ou strdup.

    @Trap D strdup n'a pas l'air standard (seulement System V et BSD), mais il faut avouer qu'elle est bien pratique.

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

Discussions similaires

  1. Problème de chevauchement de triangles
    Par Sango64 dans le forum Mathématiques
    Réponses: 18
    Dernier message: 21/10/2009, 19h35
  2. Problème de chevauchement des forms
    Par Djang0 dans le forum C++Builder
    Réponses: 3
    Dernier message: 28/08/2009, 17h20
  3. problème de chevauchement d éléments
    Par Crackozor dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 30/05/2009, 19h24
  4. Mise en page - Problème de chevauchement de div
    Par G-First dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 05/11/2008, 10h13
  5. Problème de chevauchement entre 2 divs
    Par ChriGoLioNaDor dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 11/10/2007, 09h44

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