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 :

erreur généré pour une convertion de donnée


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Points : 59
    Points
    59
    Par défaut erreur généré pour une convertion de donnée
    bonjour tout le monde.

    Je pratique les socket et j'ai une erreur que je ne comprend pas.

    je dois passé une structure a une fonction( que je n'ai pas créé) or cette fonction attend un "unsigned short". Ma structure possède elle meme 2 autres structures.
    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
     
    // Fonction faisant la somme de contrôle sur 16 bits
    	unsigned short checksum(unsigned short *buffer, int size)
    	{
    		unsigned long cksum=0;
     
    		while(size >1) 
    		{
    			cksum+=*buffer++;
    			size -=sizeof(unsigned short);
    		}
     
    		if(size)
    		{
    			cksum += *(unsigned char*)buffer;
    		}
     
    		cksum = (cksum >> 16) + (cksum & 0xffff);
    		cksum += (cksum >>16);
     
    		return (unsigned short)(~cksum);
    	}
    donc bien évidement je ne comprend pas tout le code récupéré et j'ai une erreur a la compilation :
    Form1::in_cksum' : impossible de convertir le paramètre 1 de 'traceroute::ICMP_PAQUET *' en 'u_short *'
    je suis desespérement a la recherche d'une aide, donc si quelqu'un a une idée, je prend!

    merci d'avance.

  2. #2
    zul
    zul est déconnecté
    Membre éclairé Avatar de zul
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    498
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 498
    Points : 699
    Points
    699
    Par défaut
    Je ne comprend pas bien l'interet de pomper du code sans comprendre ce qu'il fait. Toutefois la fonction checksum est un classique et comme son commentaire l'indique, elle calcule une somme de controles sur 16 bits ( au passage, unsigned short fait il toujours 16bits ? je ne pense pas ). Elle attend donc en paramètre un tableau de bloc de 16bits, il s'agit d'une representation "mémoire" de la chose, contrairement a ta representation conceptuelle de ICMP. Tout ca pour dire qu'un static_cast<unsigned short *> devrait résoudre le problème et est légale dans le contexte.

  3. #3
    Membre éprouvé Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Points : 933
    Points
    933
    Par défaut
    Question subsidiaire, pour ma propre culture : sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return (unsigned short)(~cksum);
    que signifie le tilde devant cksum ????

  4. #4
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    C'est l'opérateur de complément à un sur les nombres binaires.
    Il inverse tout les bits: 0 devient 1 et 1 devient 0:
    ~10101010=01010101

  5. #5
    Membre éclairé
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Points : 785
    Points
    785
    Par défaut
    A ne pas confondre avec ^

  6. #6
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Points : 59
    Points
    59
    Par défaut
    Merci pour votre aide.

    j'ai dis que je ne comprenais pas le code, mais la fonction je sais ce qu'elle réalise, elle me permet de calculer le checksum de mon entête IP et ICMP. Mais le problème n'est pas la.

    Cependant j'ai toujours un problème, je ne sais pas comment utiliser le cast :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static_cast<unsigned short *>
    , je viens de java, et les déclarations ne sont vraiment pas pareille, le cast aussi ...

    J'ai la déclaration de ma structure qui est faite de la facon suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    struct ICMP_PAQUET paquet;
    , cette structure est composée de 2 autres structures (struct IP_HEADER ip; struct ICMP_HEADER icmp. Le problème maintenant est de caster paquet en unsigned short * ...

    une petite aide.

    merci d'avance.

  7. #7
    Membre éprouvé Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Points : 933
    Points
    933
    Par défaut
    Sur le principe du transtypage, http://c.developpez.com/faq/cpp/?pag...s#DIVERS_casts. Java fonctionne avec des casts implicites, équivalents du dynamic_cast quand on travaille sur des classes, du static_cast quand on travaille sur des types natifs. Java lance une exception quand le cast est refusé. En C++, ça dépendra de ce que tu transtypes. Cf. la FAQ à nouveau.

    Dans ton cas, il n'y a pas de transtypage implicite possible, sauf si l'opérateur de conversion en unsigned short * a été implémenté dans la struct ICMP_PAQUET. Si ce n'est pas le cas, c'est à toi de le faire. En ce cas, le problème est d'identifier la sémantique du transtypage. Que signifie (unsigned short*) paquet ???

Discussions similaires

  1. Quels logiciels de modélisation pour une base de données ?
    Par octopus dans le forum Décisions SGBD
    Réponses: 7
    Dernier message: 11/06/2023, 16h20
  2. Nombre max d'utilisateurs pour une base de données
    Par romrai dans le forum Access
    Réponses: 18
    Dernier message: 10/07/2006, 16h28
  3. Réponses: 3
    Dernier message: 12/01/2006, 18h47
  4. ERREUR DE CONNEXION à une base de donnée ACCESS protégée
    Par unionriton dans le forum Bases de données
    Réponses: 4
    Dernier message: 09/05/2005, 09h35
  5. Créer un index pour une Base de données
    Par john7 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 31/01/2005, 21h43

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