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 avec chaine de caractères


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Problème avec chaine de caractères
    Bonjour,
    je débute en C
    Je suis entrain de créer une fonction qui récupère n caratères, les transforme en float ,les formate puis retourne 2 caractères afin d'être envoyés sur le RS232 (LSB en tête). mais malheureusement j'ai l'impression que seul le premier caratère est retourné à main.

    Il y a t-il un moyen pour avoir les 2 caractères du premier coup sans faire appel à la fonction 2 fois: une pour le LSB et l'autre pour le MSB.

    j'espère avoir été clair dans mon explication.

    Merci d'avance.

    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
    40
    41
    42
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <string.h>
     
    char Gauge_Bank(char Data[])//  fonction traitement signal
    {   
     
        float fVario = atof(Data);// Caratères signal en Float
     
    	char Var[2];	//variable qui contiendra les 2 caratères LSB et MSB
    	float fVarioSin;
    /************************************************/
    /**Formate les données-----> compatible PWM******/
    /************************************************/
    	fVarioSin = sin(fVario) + 1;
    	fVario	= (2800 * (fVarioSin)) + 59400;
     
    	if (fVario > 62800)
    	{
    		fVario = 62800;
    	}
    	else if (fVario < 61600)
    	{
    		fVario = 61600;
    	}
    /***************************************************/	
    	int wVario = fVario;
    	Var[0] = wVario % 256;               //LSB
    	Var[1] = (wVario / 256) % 256;       //MSB
     
    return *Var; //retourne normalement 2 caratères
    }
    int main(int argc, char *argv[])
    {
        char data[20]="1.415585";
        char Bank[2];
        *Bank = Gauge_Bank(data); //--> Problème, Bank ne contient que le premier caractère
     
    return 0;
    }

  2. #2
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut
    Il me semble que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    return *Var; //retourne normalement 2 caratères
    retourne le contenu de la première case du tableau Var... Que tu affecte ensuite au contenu de la première case de ton tableau Bank... Dc au final en effet tu as un seul caractère a la sortie.

    Tu peux simplement t'en convaincre en regardant le type que renvoie ta fonction: char et non char*... Tu renvoie donc un caractère... Et non un tableau ou un pointeur.

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Nicegame
    Je suis entrain de créer une fonction qui récupère n caratères, les transforme en float ,les formate puis retourne 2 caractères afin d'être envoyés sur le RS232 (LSB en tête). mais malheureusement j'ai l'impression que seul le premier caratère est retourné à main.

    Il y a t-il un moyen pour avoir les 2 caractères du premier coup sans faire appel à la fonction 2 fois: une pour le LSB et l'autre pour le MSB.
    Ton code est faux.

    Reprenons la définition :

    "créer une fonction qui récupère n caractères, les transforme en float ,les formate puis retourne 2 caractères".

    Déjà, on ne sait rien du fameux 'formatage de 2 caractères'.

    Ensuite, on ne sait pas 'retourner 2 caractères'.

    Le plus simple et le plus sûr est d'utiliser un tableau définit par l'appelant dans lequel on place les caractères :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       char tab[2];
     
       f(tab);
     
       /* maintenant il y un un caractère en tab[0] et en tab[1]. */
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void f(char tab[] /* ... */)
    {
       /* calculs de msb et msb ... */
       tab[0] = lsb;
       tab[1] = msb;
    }
    Pas de Wi-Fi à la maison : CPL

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par vinzzzz
    Il me semble que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    return *Var; //retourne normalement 2 caratères
    retourne le contenu de la première case du tableau Var... Que tu affecte ensuite au contenu de la première case de ton tableau Bank... Dc au final en effet tu as un seul caractère a la sortie.

    Tu peux simplement t'en convaincre en regardant le type que renvoie ta fonction: char et non char*... Tu renvoie donc un caractère... Et non un tableau ou un pointeur.
    J'ai effectivement essayé avec char* mais j'ai le même souci.
    A vrai dire, je sêche littéralement.

  5. #5
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut
    Emmanuel t'as donné une solution: ton tableau Bank, tu le passe en paramètre de la fonction. Ainsi tu ne retourne plus rien mais tu modifie dirrèctement le tableau dans ta fonction.
    Il faut que tu revoie un peu les pointeurs on dirait

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par vinzzzz
    Emmanuel t'as donné une solution: ton tableau Bank, tu le passe en paramètre de la fonction. Ainsi tu ne retourne plus rien mais tu modifie dirrèctement le tableau dans ta fonction.
    Il faut que tu revoie un peu les pointeurs on dirait
    Merci beaucoup, je n'avais pas encore vu le post d'Emmanuel.
    Oui j'ai encore beaucoup à apprendre.

    Merci à tous les deux, je vais essayer de revoir tout ça.

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par vinzzzz
    Emmanuel t'as donné une solution: ton tableau Bank, tu le passe en paramètre de la fonction. Ainsi tu ne retourne plus rien mais tu modifie dirrèctement le tableau dans ta fonction.

    Il y a un pb malgré tout, car en réalité, la définition de ma fonction ne se fait pas dans le programme ppal,ma fonction traite x caractères en entrée puis renvoi n caractères à main dans lequel cette fonction est appelée.



    je ne vois pas très bien comment implémenter ce code puisqu'il ne retourne rien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void f(char tab[] /* ... */)
    {
       /* calculs de msb et msb ... */
       tab[0] = lsb;
       tab[1] = msb;
    }
    Ou alors je n'ai tout simplement pas compris.

    merci.

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    le tableau de char est modifié dans la fonction, donc elle retorune bien quelque chose..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

Discussions similaires

  1. Problème avec chaine de caractère
    Par framus.class dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 19/01/2011, 11h50
  2. Problème de chaine de caractère avec "wscript.Run"
    Par vonemya dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 11/07/2008, 14h31
  3. Problème avec chaine de caractère
    Par Mouss340 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 17/12/2007, 20h46
  4. [FLASH 8] Problème de chaine de caractère
    Par dom_dev dans le forum Flash
    Réponses: 7
    Dernier message: 02/03/2006, 17h42
  5. Requete avec chaine de caractère commence par
    Par jazzes_dean dans le forum Langage SQL
    Réponses: 7
    Dernier message: 02/08/2004, 13h07

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