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 :

adresse de pointeur sur unsigned char


Sujet :

C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 41
    Points : 26
    Points
    26
    Par défaut adresse de pointeur sur unsigned char
    Salut,

    Mon probléme ce que j'utilise des bibliothéque qui ne sont pas la mienne et qui impose des types de retour comme vous l'avez vu
    voila j'utilise une fonction qui demande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    un pointeur sur unsigned char
    j'ai utilisé ce portion de code et ça marche car il demande qu'il se termine par '\0'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    unsigned char ch2[]="salah";
    res=c_fld.PutField(1,sizeof(ch2),ch2);
    ça marché mais le probléme :
    ---- j'utilise une fonction qui demande une adresse sur pointeur sur unsigned char si je ne me trompe pas voila ce que demande en message d'erreur si je ne met pas le type voulu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    impossible de convertir le paramètre 4 de 'unsigned char [50]' en 'unsigned char *&'
    //le type voulu c'est unsigned char *&
    voila l'exemple liée a l'erreur citer dessus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    unsigned char reg[50];
    res=tmp_list.GetTemplate(0,typ_tmp,lg_tmp,reg);
    Merci de me préciser c'est quoi le type demander

    Merci pour votre aide

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Le type demandé est référence C++ sur pointeur.

    C'est là qu'on rencontre la différence en tableau et pointeur: Un tableau est implicitement convertible en pointeur, mais n'en est pas un pour autant. Tu ne peux donc pas obtenir d'adresse de pointeur ou de référence de pointeur en pointant sur le tableau.

    En clair, je conseillerais ceci pour commencer:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    unsigned char *reg = NULL;
    res=tmp_list.GetTemplate(0, typ_tmp, lg_tmp, reg); //Modifie sans doute reg
    Si ça plante à l'exécution, il faudra regarder la doc des fonctions de plus près.
    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.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 27
    Points : 25
    Points
    25
    Par défaut
    Hello,

    Ce type est un type C++, cela n'existe pas en C. (référence sur pointeur de char)

    Ensuite, l'erreur de programmation que tu as fait est assez subtile si tu débutes.

    Prérequis : il faut que tu apprennes ce que c'est qu'une référence


    Ensuite, la chose qu'il faut comprendre, c'est que le nom d'un tableau déclaré ainsi ne désigne pas pas une variable. En fait, c'est un pointeur vers le premier élément de ton tableau, sauf que ... ce pointeur n'existe pas, et c'est là que c'est subtil. Comment est-ce possible ? En fait, la valeur de ce pointeur est déterminée à la compilation grâce au registre de pile, et non à l'éxecution => d'un point de vue bas niveau, il serait redondant, inutile, et plus compliqué de créer une vraie variable pour stocker l'adresse !

    Pour comprendre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char tab1[50];
    char* tab2 = malloc(50);
     
    tab2 = tab1 // valide !
    tab1 = tab2 // invalide ! tab1 ne peut pas bouger, puisqu'il n'"existe pas" !
    L'erreur de compilation vient du fait que le mécanisme mettant en jeu la référence (le fameux unsigned char*&) dans ton appel de fonction se trouve pris au piège quand tu lui passes un tableau... en fait, le compilo te crie dessus car un passage par référence, ça veut dire implicitement "plus loin dans le code de ma fonction, je vais donner une valeur à mon paramètre", ce qui dans notre cas, reviendrait EXACTEMENT à écrire la ligne "tab1 = tab2" dans le code ci-dessus ! D'ou l'erreur.

    Si tu ne comprends pas de suite, c'est peut être normal (et peut-être de ma faute), en tous cas, ce n'est pas forcément évident

Discussions similaires

  1. [PIC] Débutant question sur "unsigned char"
    Par lcoulon dans le forum Débuter
    Réponses: 21
    Dernier message: 08/10/2009, 22h43
  2. Tableau dynamique de pointeurs sur const char*
    Par Le Mérovingien dans le forum Débuter
    Réponses: 6
    Dernier message: 05/06/2008, 14h23
  3. Problème de *pointeur sur des char
    Par Spartan03 dans le forum C++
    Réponses: 2
    Dernier message: 18/09/2005, 14h20
  4. Décalage de bit sur unsigned char [8]
    Par dboulange dans le forum C++
    Réponses: 14
    Dernier message: 26/07/2005, 14h10

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