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 :

Pourquoi ma fonction accepte t-elle des int alors qu'elle est declarée pour accepter des bytes ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 185
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 185
    Par défaut Pourquoi ma fonction accepte t-elle des int alors qu'elle est declarée pour accepter des bytes ?
    Bonjour,

    Excusez moi pour mon chinois .

    J'ai un fonction comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void WritePhoneNum(byte posi, char * number){ ...code...}
    donc quand je l'appel
    WritePhoneNum(posi, number);
    posi doit etre un byte et number doit etre un char.

    Je ne comprends pas pourquoi quans je fais ceci ca fonction comme meme
    à savoir que param est un char. Ci-dessous, je le transfomr en int

    Sachez avant que sms_text et param sont des char qui sont déclarés plus haut dans mon code
    char sms_text[20];
    char param[3];
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WritePhoneNum(atoi(param), sms_text);
    Aussi j'ai d'abord fait un truc de encore plus chinois, mais qui marche
    Je converti param en int puis en byte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WritePhoneNum((byte)(atoi(param)), sms_text);
    J'ai donc deux question:
    Pourquoi un int peut "remplacer un byte, comme dans le premier exemple.
    Si c'est bien, ca me va très très bien.

    Pourriez-vous me faire un commentaire sur ceci, en revanche. C'est pas du charbias qui fonctionne?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WritePhoneNum((byte)(atoi(param)), sms_text);

    Aussi, j'aimerais bien vous poser une autre question.

    Si j'ai un char message[120] qui a pris une valeur de 119 caractere.

    Comment puis bien vider ce char pour gagner de la memoire.

    Es-ce que ceci suffit:
    Qu'es-ce que ca fait exactement. A mon interpretation, il met le caravtere \0 en premiere position qui veut dire fin du string. Donc elle est vide.
    Es-ce juste? Bon je ne donnerai pas un cours avec cette explication, mais ....
    Merci

  2. #2
    Membre chevronné
    Avatar de deletme
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 257
    Par défaut
    Bonjour,

    Tu n'as aucun warning de la part de ton compilateur ? ça me semble très bizarre quand même qu'il ne te prévienne pas.

    La page man atoi : http://www.bigbiz.com/cgi-bin/manpage?atoi

    Param doit être de type char* et non char. Pareil pour ta fonction WritePhoneNumber où number doit être un char*

    Alors oui peut être que ta fonction accepte les paramètres, mais je ne parierai pas sur son bon fonctionnement.

    Quant à la libération de mémoire, regarde plutôt comment allouer un tableau de façon dynamique ce qui te permettras de le redimensionner pour gagner l'octet non utilisé (malloc, realloc, free).

    Cdlt, dM
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    - Martin Golding
    Traduction obligatoire : "Toujours écrire du code en gardant en tête que le mec qui en assurera la maintenance est un psychopathe violent qui connait votre adresse"

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 185
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 185
    Par défaut
    He non, ca marche bien!! et pas de message dans mon compilateur, mais ta réflexion me préoccupe, car j'aimerais faire un truc de propre

    ça me semble très bizarre quand même qu'il ne te prévienne pas.
    Mais que doit-il me dire?

    Je vais aller voir du cote de malloc

  4. #4
    Modérateur

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

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 496
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void WritePhoneNum(byte posi, char * number){ ...code...}
    number doit etre un char.

    Sachez avant que sms_text et param sont des char qui sont déclarés plus haut dans mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char sms_text[20];
    char param[3];
    Tu n'as toujours pas compris la différence entre char et chaine de caractères ou je me trompe ?

    Le reste relève de la bidouille et est non explicable tant qu'on ne connaîtra pas la définition du type byte. Peux-tu aussi nous indiquer ton compilateur, les options de warning activés, l'IDE utilisé (ou la ligne de commande le cas échéant).


    Si j'ai un char message[120] qui a pris une valeur de 119 caractere.
    Comment puis bien vider ce char pour gagner de la memoire.
    Tu ne peux pas. Un tel tableau est une variable locale à la fonction où elle est déclarée et sera détruite uniquement quand on quittera cette fonction. Tu ne pourras pas gagner de mémoire, comme tu ne pourras pas l'agrandir.

    Au passage, essaye de respecter la règle "une question = une discussion". Ainsi, les réponses seront séparées et cela assurera une meilleure lisibilité des réponses.

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 185
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 185
    Par défaut
    Tu n'as toujours pas compris la différence entre char et chaine de caractères ou je me trompe ?
    Ben je doute de moi, mais j'ai envie de répondre oui.
    Un tring est une chaine de caractere
    un char est une chaine de caractere qui se présente sous un tableau
    char titi[9]={ 'B', 'o', 'n', 'j', 'o', 'u', 'r', '\0' }
    Peux-tu aussi nous indiquer ton compilateur, les options de warning activés
    Pour ceci je ne sais pas quoi te répondre. J'utilise l'IDE de Arduino. En bas j'ai une fenetre qui me met des messages, dont les message d'erreur. En effet je ne vois pas de message d'erreur qaund je compile

    Tu ne peux pas. Un tel tableau est une variable locale à la fonction où elle est déclarée et sera détruite uniquement quand on quittera cette fonction. Tu ne pourras pas gagner de mémoire, comme tu ne pourras pas l'agrandir.
    Ok, j'ai bien compris. Mais si mon tableau contien le message bonjour et j'aimerais le vider, je veux dire que si je fait un Serial.print(monTableau) il ne m'affiche plus 'bonjours' mais rien comme si je faisait ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char monTableau[20];
    Serial.print(monTableau); // Il n'affichera rien
    ceci ne fait pas cela?
    Au passage, essaye de respecter la règle "une question = une discussion".
    D'accord. Je voulais en fait éviter de faire deux post. Mais c'est noté

    Merci

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2013
    Messages : 21
    Par défaut
    Salut,
    Je crois plutôt que string est une chaine de caractère (char)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char lettre = 'A'; \\un char
    char mot[4] = "mot"; \\une string
    pour "supprimer" ta string, c'est pas possible comme on te l'a indiqué plus haut. Par contre tu peux faire en sorte que rien de s'affiche en mettant le caractère de fin de chaine '\0' au premier caractère de ta string.
    attention ça ne change pas la longueur de ta chaine qui prendra toujours autant de place en mémoire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    montableau[0]='\0';
    explications: on affecte le caractère de fin de chaine au premier caractère de ta chaine.

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 20/11/2011, 23h47
  2. Réponses: 0
    Dernier message: 17/11/2011, 16h35
  3. Réponses: 8
    Dernier message: 28/04/2008, 12h34
  4. Réponses: 19
    Dernier message: 04/06/2007, 17h12
  5. Réponses: 8
    Dernier message: 26/10/2006, 16h46

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