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 :

probleme de cast (?)


Sujet :

C

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 382
    Par défaut probleme de cast (?)
    Bonjour a tous !!

    j'ai un petit probleme avec une bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct tm *ltime;
    char timestr[16];
     
    /* convert the timestamp to readable format */
    ltime=localtime(&header->ts.tv_sec);
    strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);
    J'ai pris ce code sur la documentation technique de winpcap 3.1. Il est donc censé compiler...

    Mais la, ca marche pas le compilateur m'indique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    error C2664: 'localtime' : cannot convert parameter 1 from 'const long *' to 'const time_t *'
            Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
    Je ne comprends pourquoi. Si je fais, un cast (time_t * ), ca compil mais ca plante à l'utilisation dans le fichier time.inl :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #pragma warning( disable : 4996 )
        return _localtime64(_Time);
    Quelqu'un peut il m'aider ??

    Merci d'avance !

  2. #2
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Salux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    time_t the_stamp;
     
    the_stamp = header->ts.tv_sec;
     
    ltime=localtime(&the_stamp);

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Par défaut
    Le type time_t n'est pas forcément mappé sur un long. Considérer le contraire donne le genre de bugs que tu as.

    Il semblerait que dans ton cas, ce soit un entier 64-bit (long = 32-bit) d'où le crash.

  4. #4
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
    Attention, tu utilises un compilateur C++. Assure-toi que ton fichier possede l'extension .c afin d'utiliser un compilateur C.

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 382
    Par défaut
    Merci pour vos reponses...

    Je ne peux pas utiliser l'extension .c car j'utilise des modules C++ dans mon fichier.

    Est il possible de spécifier que la fonction soit une fonction C dans mon fichier cpp ??

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Il est possible:
    • De déclarer dans un header C++ une fonction comme étant "une fonction C" définie dans un source C
    • De déclarer et définir dans un source C++ une fonction C++ comme étant "une fonction appelable en C" du moment que le prototype est compilable en C (bref, si c'est une fonction indépendante qui prend des pointeurs en paramètre, c'est OK).


    La formule magique pour ces deux fonctionalité est extern "C" (utilisé en préfixe d'une fonction ou en bloc)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 382
    Par défaut
    J'ai mis ce fameux extern "C" devant ma fonction mais le probleme reste entier...

    Soit je ne mets pas de cast et ca compil pas, soit je mets un cast, ca compil mais ca plante en l'utilisant.

    Je tente de faire un fichier .c séparé définissant une fonction dédié à ce calcul. Cette fois, ca compil meme sans le cast mais ca plante au linkage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    error LNK2019: unresolved external symbol "void __cdecl datePaquetPcap
    struct pcap_pkthdr const *)" (?
    tePaquetPcap@@YAXPBUpcap_pkthdr@@@Z) referenced in function "void
    __cdecl filtreRTP_handler(unsigned char *,struct pcap_pkthdr const
    *,unsigned char const *)" (?
    P_handler@@YAXPAEPBUpcap_pkthdr@@PBE@Z)
    Debug2/etherealplayer.exe : fatal error LNK1120: 1 unresolved externals
    Je ne sais pas si c'est la bonne solution mais je n'en vois pas d'autre...

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Fonction C et fonction C++ utilisables en C et en C++
    Code header.h : 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
    #ifndef HEADER_H_INCLUS
    #define HEADER_H_INCLUS
     
    /* On utilise extern "C" en bloc, et seulement quand on compile en C++ */
    #ifdef __cplusplus
    extern "C" {
    #endif
     
    int UneFonctionC(char const *uneChaine);
    int UneFonctionCPlusPlus(int unEntier);
     
    #ifdef __cplusplus
    }
    #endif
     
    #endif/* ! HEADER_H_INCLUS */
    Code sourceC.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #ifdef __cplusplus
    #error Fichier source C compile par un compilateur C++
    #endif
     
    #include <stdio.h>
    #include "header.h"
     
    int UneFonctionC(char const *uneChaine)
    {
    	puts(uneChaine);
    	return 1;
    }
    Code sourceCpp.cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #ifndef __cplusplus
    #error Fichier source C++ compile par un compilateur C
    #endif
     
    #include <iostream>
    #include "header.h"
     
    //ici, on utilise extern "C" en préfixe, pour changer.
    //(on pourrait très bien l'utiliser en bloc aussi)
    extern "C" int UneFonctionCPlusPlus(int unEntier)
    {
    	std::cout << unEntier << std::endl;
    	return 2;
    }

    Ce n'est pas testé, mais normalement, les deux fonctions sont utilisables par n'importe quel fichier source (C ou C++) qui inclut "header.h".
    Edit: Les fichiers eux-mêmes sont testés, ils compilent.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 382
    Par défaut
    ok mais l'utilisation de extern "C" ne change rien chez moi....

    Pour faire les choses proprement, je prefere séparer le C du C++ donc c'est ds un fichier .c que je définis ma fonction et je mets le prototype ds le .h...

    Je fais bien l'include du .h ds mon fichier .cpp.

    Il me met tj cette erreur de link ....

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 382
    Par défaut
    Voila le .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
     
    #include "Cfct.h"
     
    #include<pcap.h>
    #include <winsock2.h>
     
    void datePaquetPcap(const struct pcap_pkthdr * header)
    {
        struct tm *ltime;
        char timestr[16];
     
        /* convert the timestamp to readable format */
    	ltime=localtime(&header->ts.tv_sec);
        strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);
    }
    Et voila le .h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #include<pcap.h>
     
    void datePaquetPcap(const struct pcap_pkthdr * header);
    ca compil mais l'erreur de liink apparait si j'utilise la fonction ds l'un des cpp...

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Il faut qu'elle soit déclarée en extern "C" (en C++ uniquement) pour que le linker sache que ce n'est pas une fonction C++
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 382
    Par défaut
    Si je mets extern "C" devant ma fonction ds le .c et le .h ca me met :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    c:\documents and settings\imaj8504\desktop\etherealplayer_version1.4.2
    fct.h(3) : error C2059: syntax error : 'string'
    .\Cfct.c(6) : error C2059: syntax error : 'string'

  13. #13
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Quelle partie de "en C++ uniquement" ne comprends-tu pas ?

    Edit: Jette à nouveau un coup d'oeil à mon fichier header.h
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #14
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 382
    Par défaut
    dac, mais j'ai bien compris... Mais j'ai des erreurs à tout les coups...

    Soit je ne mets pas le extern "C" et la il me dit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    error LNK2019: unresolved external symbol "void __cdecl datePaquetPcap
    struct pcap_pkthdr const *)" (?
    tePaquetPcap@@YAXPBUpcap_pkthdr@@@Z) referenced in function "void
    __cdecl filtreRTP_handler(unsigned char *,struct pcap_pkthdr const
    *,unsigned char const *)" (?
    P_handler@@YAXPAEPBUpcap_pkthdr@@PBE@Z)
    Debug2/etherealplayer.exe : fatal error LNK1120: 1 unresolved externals
    Soit je mets exactement ce que tu m'as montré et la j'ai environ 102 fautes... Quasiment toutes dues à des problemes d'incompréhension du c++ dans mon fichier .c...

  16. #16
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Je peux voir ton header ?
    Je viens de tester mes deux sources, ils compilent sans la moindre erreur ni le moindre warning avec gcc -Wall -W...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 382
    Par défaut
    Oki, c bon, ca fonctionne.. j'avais du oublier quelque chose ou rajouté un .h dans l'un de mes fichiers...

    A present, ca compil mais ca plante toujours à l'utilisation...

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 382
    Par défaut
    Et j'ai ce warning a la compil :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    warning C4133: 'function' : incompatible types - from 'const long *' to 'const time_t *'
    ca plante toujours à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #pragma warning( push )
    #pragma warning( disable : 4996 )
        return _localtime64(_Time);
    #pragma warning( pop )
    dans le fichier time.inl

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 382
    Par défaut
    C'est bon, le probleme est résolu.. il provenait d'une dif de de taille mémoire des variables...

    localtime utilise des variables de 64 bits... Or ce que j'utillise en paramètre n'en fait que 32...

    Il fallait en fait utiliser la fonction _localtime32.

    Tout fonctionne à présent...

    Merci encore pour votre aide !!

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

Discussions similaires

  1. Probleme de cast de string en int
    Par Oberown dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 26/04/2006, 11h48
  2. Réponses: 12
    Dernier message: 25/07/2005, 14h49
  3. [VB.NET][dataset][datagrid] probleme de Cast
    Par graphicsxp dans le forum Windows Forms
    Réponses: 3
    Dernier message: 05/05/2005, 14h18
  4. Probleme de cast de parametres
    Par John Fullspeed dans le forum Langage
    Réponses: 3
    Dernier message: 14/10/2004, 08h43
  5. probleme de cast
    Par gaut dans le forum C++
    Réponses: 9
    Dernier message: 06/08/2004, 18h43

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