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 :

Compréhension d'un prototype


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 26
    Par défaut Compréhension d'un prototype
    Bonjour,
    Ma question concerne le fonctionnement d'une fonction d'après le prototype qui lui est associé.

    Il s'agit de la fonction xbuf_sort() dont le prototype est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // sort text entries separated by 'separator' in the buffer
    void  xbuf_sort    (xbuf_t *ctx, char separator, s32 remove_duplicates);
    C'est une fonction qui si j'ai bien compris est censé me retourner dans "remove_duplicates" le pointeur vers la chaine suivant la variable "separator". Ou plus simplement, il s'agit d'une fonction équivalente à strtok_r()...

    J'utilise alors la fonction comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    s32 suite = 0;
    xbuf_sort(&ctx, ":", suite);
    Mais ça me cause une erreur de type "Signal: 11 Address not mapped to object" que je n'arrive encore une fois pas à comprendre donc je demande à nouveau votre aide ! Par contre lorsque pour tester d'autres erreurs je remplace "suite" dans ma fonction par "*suite" alors une erreur "warning: passing argument 2 of 'xbuf_sort' makes integer from pointer without a cast" s'affiche (en plus des autres erreurs lié aux * ajouté).

    Une idée d’où viens le problème svp ?

  2. #2
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Le deuxième argument est un char, tu lui passes un char*.

    Remplace ":" par ':'.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 26
    Par défaut
    Merci, ça à en effet retirer le warning lorsque je rajoute "*" donc maintenant il ne reste plus qu'une erreur "invalid type argument of 'unary *' (have 's32')" qui serait logiquement lié à l'ajout du * mais lorsque je le retire ça me remet toujours l'erreur "Signal: 11 Address not mapped to object"

  4. #4
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Bonjour,

    tu montres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // sort text entries separated by 'separator' in the buffer
    void  xbuf_sort    (xbuf_t *ctx, char separator, s32 remove_duplicates);
    Je pense (en ayant googlé un peu) que le buffer est définit par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct
    {
       char *ptr;       // data buffer
       u32   allocated; // memory allocated
       u32   len;       // memory used
       u32   growby;    // memory allocation increment
    } xbuf_t;
    ctx->ptr est considéré comme une liste de chaines séparées par separator ; je suppose (toujours en ayant googlé) que remove_duplicates est un booléen (s32 -> signed 32bit integer) qui indique si on retire ou non les doublons ...
    Ne t'attends pas à recevoir quoi que ce soit par remove_duplicates.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 26
    Par défaut
    Oui en effet le buffer est définit par xbuf_t mais je ne saisi pas trop ce que tu veux dire en parlant de doublon définit par remove_duplicates. J'obtiens d'ailleurs l'erreur quelque soit la valeur que je donne à la variable donc je suis un peu largué !

  6. #6
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    si tu as une chaine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* str="un:deux:deux:trois:quatre:trois:quatre:un:quatre";
    je suppose (je n'ai jamais utilisé cette bibliothèque) que tu dois faire quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    xbuf_t buffer;
    xbuf_init(&buffer); // on initialise le buffer
    xbuf_cat(&buffer, str) // on le remplit
    buffer.ptr contient "un:deux:deux:trois:quatre:trois:quatre:un:quatre"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xbuf_sort(&buffer,':',0); // on trie le buffer sans enlever les doublons
    buffer.ptr contient "deux:deux:quatre:quatre:quatre:trois:trois:un:un"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xbuf_sort(&buffer,':',1); // on trie le buffer en enlevant les doublons
    buffer.ptr contient "deux:quatre:trois:un"

    Je suppose ça en partant du header.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 26
    Par défaut
    L'initialisation et le remplissage que tu indique est correcte et fonctionne mais c'est vraiment la fonction xbuf_sort() qui me cause encore et toujours la même erreur (même avec la chaine que tu propose) donc je comprend pas d'ou peux venir le soucis ! Le problème ne pourrait venir que du 3ième argument mais j'ai beau tout essayer rien n'y fais..

  8. #8
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Il ne faut jamais essayer de faire tomber un programme en marche
    poste ton code
    poste le résultat de la compilation (tous les messages)

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 26
    Par défaut
    Alors pour le code en utilisant ton exemple de chaine ça donne ça :

    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
     
    int main(int argc, char *argv[])
    {
    	xbuf_t *reply = get_reply(argv);
     
    	xbuf_t buffer;
    	xbuf_init(&buffer);
     
    	xbuf_cat(&buffer, "un:deux:deux:trois:quatre:trois:quatre:un:quatre");
     
    	xbuf_sort(&buffer, ':', 0);
     
    	xbuf_xcat(reply,"Resultat: %s", buffer.ptr);
     
    	xbuf_free(&buffer);
     
    	return 200;
    }
    Ce qui me cause l'erreur (je sais pas si ça tu y comprendra quelque chose):
    Nom : pb1.jpg
Affichages : 56
Taille : 68,6 Ko

    (je précise que sans l'utilisation de la fonction xbuf_sort() c'est bien "Resultat: un:deux:deux:trois:quatre:trois:quatre:un:quatre" qui m'est retourné)

  10. #10
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Bon, j'ai downloadé gwan et procédé à quelques tests.

    Remarque préliminaire : c'est du freeware ... aucunes sources ... je n'ai donc que moyennement confiance. Mon environnement de test est donc une VM minimale dans laquelle gwan ne se lance pas sans me lancer une exception à la figure ; néanmoins l'option -r semble opérationnelle.

    Premier essai :
    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
    #include <stdio.h>
    #include "include/gwan.h"
     
     
    int main(int argc, char* argv[])
    {
      xbuf_t buffer;
     
      xbuf_init(&buffer);
      xbuf_cat(&buffer,"un:deux:deux:trois:trois:trois:quatre:quatre:cinq");
      puts(buffer.ptr);
     
      xbuf_sort(&buffer,':',1);
      puts(buffer.ptr);
     
      return 0;
    }
    Donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    > ./gwan -r test.c 
    un:deux:deux:trois:trois:trois:quatre:quatre:cinq
    Segmentation fault
    Même comportement avec :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "include/gwan.h"
     
    int main(int argc, char* argv[])
    {
      char *str=strdup("un:deux:deux:trois:trois:trois:quatre:quatre:cinq");
      xbuf_t buffer;
     
      xbuf_init(&buffer);
      xbuf_cat(&buffer,str);
      puts(buffer.ptr);
     
      xbuf_sort(&buffer,':',1);
      puts(buffer.ptr);
     
      free(str);
      return 0;
    }
    En consultant le site partie developers, l'auteur «explique» comment trouver les erreurs :
    But identifying the cause of execution errors must be as straightforward as possible. To fix bugs, you just want to know where in your source code the problem takes place - and this too often requires you to dig into frustratingly obscure multi-page core dumps. G-WAN does it for you: execution error reports indicate the offending source code file and line number in the call chain
    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
    Script: crash_libc.c
     Client: 127.0.0.1
     Query : csp?crash_libc
     
     Signal        : 11:Address not mapped to object
     Signal src    : 1:SEGV_MAPERR
     errno         : 0
     Code   Pointer: 0000f5200b33 (module:/lib/libc.so.6, function:strcpy, line:0)
     Access Address: 00000badc0de
     
     Registers     : EAX=00000badc0de CS=00000033 EIP=0000f5200b33 EFLGS=000000010202
                     EBX=000000000001 SS=ec2d8ed4 ESP=0000f5ded828 EBP=0000f5dee020
                     ECX=000033323130 DS=ec2d8ed4 ESI=0000ec2d8f86 FS=00000033
                     EDX=000003b03c00 ES=ec2d8ed4 EDI=00000badc0de CS=00000033
     
     Module        :Function        :Line # PgrmCntr(EIP)  RetAddress  FramePtr(EBP)
          libc.so.6:          strcpy:     - 0000f5200b33 0000ec2d8f00   0000f5dee020
            servlet:            main:    37 0000ec2d8f00 00000042e10c   0000f5dee020
    ce qui ressemble à ta capture d'écran. Sauf que dans ton cas il n'y a rien, ce qui semble indiquer une erreur directement dans l'exécutable gwan (qui est entièrement strippé, qui charge lui même ses dépendances dynamiques : de la vraie paranoia windowsienne ...).
    Il ne te reste donc que la solution de contacter (donc certainement payer le support) l'auteur qui a commis ce machin. Pour info, je n'ai rien trouvé d'utile sur le forum de l'auteur.

    Je ne pourrais malheureusement pas t'aider plus en avant, dû au manque de documentation et au modèle très fermé de ce framework, désolé.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 26
    Par défaut
    Merci quand même d'avoir essayé !
    Je me suis finalement résigné à utiliser la fonction xbuf_sort() qui de toute façon ne semblait pas correspondre à ce que je recherchais ! En tout cas ton aide m'aura évité de trop m'entêter ! Merci encore (j'ai trouvé une autre solution et tout fonctionne parfaitement désormais)

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

Discussions similaires

  1. Compréhension de fseek
    Par Argonz dans le forum C
    Réponses: 9
    Dernier message: 12/01/2004, 15h01
  2. compréhension du profil d'une fonction
    Par lor dans le forum MFC
    Réponses: 7
    Dernier message: 08/01/2004, 12h59
  3. [FLASH MX] Prob de compréhension des bouttons
    Par WriteLN dans le forum Flash
    Réponses: 13
    Dernier message: 16/10/2003, 17h01
  4. onclipevent (problème de compréhension)
    Par stephane eyskens dans le forum Flash
    Réponses: 8
    Dernier message: 24/09/2003, 15h09
  5. Problème de compréhension des ensembles
    Par Cornell dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2003, 22h07

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