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 pour caster une variable


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 171
    Par défaut Problème pour caster une variable
    Bonjour, j'ai probleme pour caster une variable.
    J'ai le prototype de fonction suivant:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    void UART_puts(uart_id_e uart_id, uint8_t * str, uint8_t len)

    Lorsque j'initialise comme cela:
    Et que je cast la variable comme cela:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    UART_puts(UART3_ID, (uint8_t*)str, sizeof(str));	//Send the message to UART3 (Sigfox module)
    Je n'ai pas de probleme, cela fonctionne.

    Cependant, quand j'initialise comme cela:
    Je ne sais pas comment utiliser ma variable dans la fonction UART_puts.
    Quand j'ecris cela:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    UART_puts(UART2_ID, (uint8_t)c, sizeof(c));	//send frame to uart 2 (USB)
    J'obtiens cette erreur:
    ../Src/main.c:306:25: warning: passing argument 2 of 'UART_puts' makes pointer from integer without a cast [-Wint-conversion]
    UART_puts(UART2_ID, (uint8_t)c, sizeof(c)); //send frame to uart 2 (USB)
    Quand j'ecris cela:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    UART_puts(UART2_ID, (uint8_t*)c, sizeof(c));	//send frame to uart 2 (USB)
    J'obtiens cette erreur:
    ../Src/main.c:306:25: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
    UART_puts(UART2_ID, (uint8_t*)c, sizeof(c)); //send frame to uart 2 (USB)
    ^
    Et quand j'ecris cela:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    UART_puts(UART2_ID, c, sizeof(c));	//send frame to uart 2 (USB)
    J'obtiens cette erreur:
    ../Src/main.c:306:25: warning: passing argument 2 of 'UART_puts' makes pointer from integer without a cast [-Wint-conversion]
    UART_puts(UART2_ID, c, sizeof(c)); //send frame to uart 2 (USB)
    ^
    Comment faire pour cette variable c soit "compatible" avec le prototype de fonction? Merci.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 151
    Billets dans le blog
    4
    Par défaut
    Il te faut un pointeur, donc operateur & UART_puts(UART2_ID, &c, 1);
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 171
    Par défaut
    Ok merci!

    Quelle est la difference entre
    *c
    et
    &c
    ?

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Quelle différence ? Il va sérieusement falloir réouvrir un cours de C à la rubrique "pointeurs" !

    Un code simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main() {
        int i = 42; // une variable
        int* p = &i; // un pointeur initialisé avec l'adresse de cette variable
        *p = 17; // modification de la variable pointée
        return i; // renvoie 17
    }
    &c a un sens quelque soit le type de la variable c : c'est son adresse ; *c n'a un sens que si le type de la variable c est "pointeur sur TOTO" : c'est la variable pointée, de type "TOTO".

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 171
    Par défaut
    Merci!

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    J'oubliais juste de dire quelque chose de plus profond : caster, c'est mal.

    Quand tu castes, tu dis au compilateur : considère une variable comme étant d'un autre type, ne fait pas de vérification dessus. Des fois, ton cast fait trop n'importe quoi alors le compilateur râle quand même, mais en général, tu risques de masquer des problèmes. Si ton code est correct, tu as normalement jamais besoin de caster. Si tu as besoin de le faire, il faut faire très attention et avec de bonnes raisons. Juste "faire taire un warning du compilateur" n'est pas une bonne raison.

    Un exemple tout simple pour mieux me faire comprendre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdio.h>
     
    void print(float* p) {
        printf("%f", *p);
    }
     
    int main() {
        int i = 31415;
        print(&i);
    }
    Ce code génère un warning :
    main.c: In function 'main':
    main.c:9:11: warning: passing argument 1 of 'print' from incompatible pointer type [-Wincompatible-pointer-types]
         print(&i);
               ^
    main.c:3:6: note: expected 'float *' but argument is of type 'int *'
     void print(float* p) {
          ^~~~~
    Avec un cast, plus de warning ! Youpi !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdio.h>
     
    void print(float* p) {
        printf("%f", *p);
    }
     
    int main() {
        int i = 31415;
        print((float*) &i);
    }
    Sauf qu'à l’exécution ça ne fonctionne pas...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    0.000000
    Process finished with exit code 0
    PS : en C++, ce n'est pas un warning, c'est carrément une erreur !
    main.cpp:9:13: error: cannot convert 'int*' to 'float*' for argument '1' to 'void print(float*)'
         print(&i);
    Avec un cast, plus d'erreur... Youpi...

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

Discussions similaires

  1. Problème pour modifier une variable globale
    Par supertom dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 07/06/2007, 18h00
  2. Réponses: 17
    Dernier message: 01/06/2007, 08h16
  3. Problème pour inclure une variable à un objet
    Par yoyo29 dans le forum Tkinter
    Réponses: 2
    Dernier message: 04/05/2007, 13h01
  4. Réponses: 2
    Dernier message: 14/04/2006, 18h40
  5. Probléme pour insérer une variable dans un champs
    Par BOUTRAIS dans le forum Access
    Réponses: 2
    Dernier message: 11/04/2006, 22h45

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