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 :

Comment passer correctement un char, en parametre d'une fonction


Sujet :

C

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut Comment passer correctement un char, en parametre d'une fonction
    Bonjour à tous,

    J'ai encore du mal a comrpendre comment passer correctement un char dans une fonction.

    EN gros
    je déclare un char
    Je recupère ce que je tape dans mon terminal
    Je recupere le deuxième et troiseme parametre ( 3 et +41223456677)
    Je regarde si posi (3) n'a pas deux caractere, soit n'est pas plus grand que 9
    J'appelle la fonction WritePhoneNum(byte posi, char number) qui prend en parametre la position et le nuemro de téléphone

    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
     
    if(!strncmp(inSerial,"dirw",4)){
     
         // Je tape dans mon terminal driw 3 +41223456677
          //Je recupère le deuxieme parametre 3 et le numero
          // qui préalablement déclaré ainsi
          // char posi[2]; char number[20];
          sscanf(inSerial,"%*s%s%s",posi, number);
          Serial.print(posi[0]);
     
          // Si posi a plus d'un caractere, comme par exemple 22
          if(strlen(posi) > 1){
            Serial.print(F("The position must have one caracter (1-9)")); 
          }else{
            // Si non affiche le numero a enregistré
            Serial.print(number);   
     
            WritePhoneNum((byte)(posi[0] - '0'), number);
     
          }
     
        }
    Je ne comprends pa spourquoi, au niveau de ma fonction WritePhoneNum() j'ai un message d'erreur
    "Invalid conversion from 'char*' to 'char'
    Je ne comprends pa spourquoi, prce que toutes les ariable concernée sont des char, donc pourquoi il y a t il un probleme de convertion?

    Voici la fonction en question
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    // write phone number to the SMS directory
    void WritePhoneNum(byte posi, char number){ 
     
      #ifdef DEBUG
            Serial.println(F("\nWRITING TO THE DIRECTORY"));
            Serial.println(F("--------------------------------"));
          #endif
     
           // Ceci est peut etre inutile. je ée fais deux fois. Je verrai plus tard pour suprimer...
           if(posi >= 1 && posi <= 9) {
     
             Serial.print(number);
             if(strlen(number) > 2){
               gsm.WritePhoneNumber(posi, number);
     
               #ifdef DEBUG
                 Serial.print(F("The phone number "));
                 Serial.print(number);
                 Serial.print(F(" has been recorded at the position "));
                 Serial.println(posi);
               #endif
             }else{
               #ifdef DEBUG
                 Serial.print(F("The phone number must have at least 3 caracteres "));
     
               #endif
             }
     
          } else {
              Serial.println(F("Entrer une valeur entre 1 et 9")); // pas bon
          }
     
          Serial.println("");
     
          #ifdef DEBUG
            enterCommand();
           #endif
    }
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Entre char number; et char number[20];, tu ne vois pas une petite différence ?

  3. #3
    Membre averti
    Homme Profil pro
    Cadre informatique
    Inscrit en
    Avril 2013
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Cadre informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 183
    Points : 435
    Points
    435
    Par défaut
    Coucou, en regardant ton code, à cette ligne:

    Citation Envoyé par pierrot10 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sscanf(inSerial,"%*s%s%s",posi, number);
    j'ai regarder un peu le sscanf mais je ne vois pas ou tu veux en venir.
    C'est quoi le %*s?

    Merci de m'aider à y voir plus clair

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    @Bysbobo : Tu peux regarder cette discussion : http://www.developpez.net/forums/d13...ne-caracteres/

  5. #5
    Membre averti
    Homme Profil pro
    Cadre informatique
    Inscrit en
    Avril 2013
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Cadre informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 183
    Points : 435
    Points
    435
    Par défaut
    OK! Ignorer le premier mot, merci

  6. #6
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    Entre char number; et char number[20];, tu ne vois pas une petite différence ?
    Ben j'ai honte non, Quoi oui mais je ne sais pas comment l'expliquer.
    Le premier on déclare un char sans lui donner une longeur.
    Le deuxième ob lui donne un.
    De là j'ai une question, a quoi ca sert de déclarer char number;? Es-ce que la longueur sera définie quand on lui attribura une chaine de caracter?

    j'ai regarder un peu le sscanf mais je ne vois pas ou tu veux en venir.
    C'est quoi le %*s?
    En fait le but ici est de récupérer des données qui sont entre des espaces
    Par exemple
    sms 3 texte
    sms est la "commande", enmvoyer une SMS.
    3 est la posistion du téléphone dans le directry
    texte est le texte a envoyer.

    J'ai pas l'occasion résolu le problème en ajoutant une étoile * à la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void WritePhoneNum(byte posi, char * number){.. code..}
    Mais c'est quoi cette étoile. J'ai encore du mal à comprendre ceci.
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Le premier on déclare un char sans lui donner une longeur.
    Le deuxième ob lui donne un.
    C'est un peu ce que je craignais ^^

    Les deux déclarations se ressemblent, d'un point de vue visuel, mais n'ont rien à voir quant aux objets créés !

    Dans le premier cas, tu définis une variable nommée number qui est de type char. C'est UN SEUL caractère.

    Dans le 2e cas, tu définis une variable nommée number de type char[] (un tableau de char), de longueur 20. Tu pourras donc mettre 20 chars dans ce tableau.

    En C, le type char est un entier de petite taille (généralement, il fait un octet). Ce N'EST PAS une chaine de caractères !!! En C, il n'existe pas réllement de type "chaine de caractères". On utilise pour cela une suite de char terminée par un caractère spécial, \0. Cette suite peut être contenue dans un tableau ou dans une zone mémoire particulière et accessible par un pointeur. Cette zone est soit obtenue avec une fonction telle que malloc() ou en mémoire constante pour les string litterals.

    Je te conseille très fortement de rouvrir ton cours de C à la rubrique tableaux, pointeurs et chaines de caractères

  8. #8
    Membre régulier Avatar de Mipwiq
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 42
    Points : 81
    Points
    81
    Par défaut
    Citation Envoyé par pierrot10 Voir le message
    Mais c'est quoi cette étoile. J'ai encore du mal à comprendre ceci.
    Cette étoile désigne un pointeur. Pour bien comprendre cette notion il faut regarder un peu au niveau de la mémoire.
    Quand tu déclares une variable de cette manière :

    il faut te la représenter comme un bloc de données.
    Alors que si tu fait de cette manière :

    c'est l'adresse mémoire d'un bloc de données.
    C'est une notion très importante à connaitre, documente toi relis bien tes cours et cherche des info sur les pointeurs et les arrays.

  9. #9
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Ce n'est pas tout à fait exact.

    int foo; déclare une variable nommée foo et dont la valeur est stockée dans un bloc de type int (pour un tel type de donnée, cela veut type rime avec taille).

    Stricto sensu, int *foo; n'est l'adresse d'un bloc mémoire mais la déclaration d'une valeur nommée foo et dont la valeur est stockée dans un bloc d'un type spécial : pointeur. La valeur de foo sera l'adresse d'une autre bloc mémoire et tu as demandé à ton compilateur de s'assurer que ce sera l'adresse d'un bloc de type int. Si on écrit double *foo;, on déclare une variable foo et sa valeur est aussi stockée dans un bloc de même type (de type pointeur). Il a la même tête qu'un bloc pour un pointeur sur int mais le compilateur n'acceptera d'y mettre qu'une adresse d'un bloc de type double. Sur une architeture 32 bits, un bloc pointeur a une taille de 4 octets, quelque soit le type du bloc pointé.

    L'adresse d'un bloc est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int foo;
    &foo; // ceci est une adresse
    Il est d'important de comprendre qu'un pointeur n'est pas une adresse mais que c'est une variable dont la valeur est (censée être) une adresse. Ca peut paraitre inutile comme distinction mais c'est important pour comprendre ce qu'est vraiment un pointeur. Cela permet notamment de mieux comprendre ce qu'est un pointeur de pointeur int **foo; : foo est une variable qui permet de stocker l'adresse d'une autre variable, en l’occurrence une variable de type pointeur sur int ; ce n'est pas l'adresse d'une adresse.

Discussions similaires

  1. Réponses: 52
    Dernier message: 23/10/2014, 11h22
  2. passer un tableau php en parametre d'une fonction js
    Par maxwel56 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 21/05/2012, 16h51
  3. Réponses: 2
    Dernier message: 08/01/2012, 21h56
  4. Réponses: 2
    Dernier message: 24/01/2009, 18h18
  5. Réponses: 6
    Dernier message: 17/10/2006, 09h48

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