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 :

Y-a-t-il la possiblité de déplacer une virgule dans un char


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 167
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 167
    Par défaut Y-a-t-il la possiblité de déplacer une virgule dans un char
    Bonjour,

    Pour le moment je ne sais pas qu'est la cause de mon problème.

    Je récupère la position d'un GPS d'un char

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char lat[15];
    char lon[15];
    Mon code fonction saud que la fonction fournie par la librairie me retourne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    608.476655
    4613.163213
    alors qu'il devrait retourner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    6.08476655
    46.13163213
    En attendant, je souhaiterais savoir s'il y a la possiblité de déplacer le point de 2 positions, car je doute qu'un puisse diviser un char par 100?

  2. #2
    Membre actif 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
    Par défaut
    Si tu sais que tu auras toujours un décalage de deux cases dans ton tableau pour la position de la virgule, tu peux la déplacer manuellement en cherchant où elle est dans ton tableau et en la décalant de deux cases. Mais c'est sale.

    Le mieux serait que tu nous montre ton algo pour arriver à ce résultat comme ça on pourra peut être te dire d'où viens le problème

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 167
    Par défaut
    D'accord,

    voici la fonction qui me retourne les valeur
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    char GPSGSM::getPar(char *str_long, char *str_lat, char *str_alt, char *str_time, char *str_speed) 
    {
    	char ret_val=0;
    	char *p_char; 
    	char *p_char1;
    	gsm.SimpleWriteln("AT+CGPSINF=0");
    	gsm.WaitResp(5000, 100, "OK");
    	if(gsm.IsStringReceived("OK"))
    		ret_val=1;
     
    	//longitude
    	p_char = strchr((char *)(gsm.comm_buf),',');
    	p_char1 = p_char+1;  //we are on the first char of longitude
    	p_char = strchr((char *)(p_char1), ',');
    	if (p_char != NULL) {
              *p_char = 0; 
        }
    	strcpy(str_long, (char *)(p_char1));
     
    	// latitude
    	p_char++;
    	p_char1 = strchr((char *)(p_char), ',');
    	if (p_char1 != NULL) {
              *p_char1 = 0; 
        }	
    	strcpy(str_lat, (char *)(p_char));
     
    	// altitude
    	p_char1++;
    	p_char = strchr((char *)(p_char1), ',');
    	if (p_char != NULL) {
              *p_char = 0; 
        }	
    	strcpy(str_alt, (char *)(p_char1));
     
    	// UTC time
    	p_char++;
    	p_char1 = strchr((char *)(p_char), ',');
    	if (p_char1 != NULL) {
              *p_char1 = 0; 
        }	
    	strcpy(str_time, (char *)(p_char));	
     
    	// TTFF
    	p_char1++;
    	p_char = strchr((char *)(p_char1), ',');
    	if (p_char != NULL) {
              *p_char = 0; 
        }	
     
    	// num
    	p_char++;
    	p_char1 = strchr((char *)(p_char), ',');
    	if (p_char1 != NULL) {
              *p_char1 = 0; 
        }	
     
    	// speed
    	p_char1++;
    	p_char = strchr((char *)(p_char1), ',');
    	if (p_char != NULL) {
              *p_char = 0; 
        }		
    	strcpy(str_speed, (char *)(p_char1));	
     
    	return ret_val;
    }
    J'espère que c'est ben ce que tu demande?
    Mais ca me semble du bidoullage. Es-ce que ca pourrait avoir avec l'antenne?

  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 : 38
    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
    déplacer une virgule dans un char

    Je récupère la position d'un GPS d'un char
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char lat[15];
    char lon[15];
    je doute qu'un puisse diviser un char par 100
    Tu comprends rien à ce que je t'explique dans chaque discussion ou tu fais exprès ?

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 167
    Par défaut
    Salut Bktero,

    ...heu, je me sens mal à l'aise fasce à ton message et toutes tes explications détaillées.
    Jai honte de ne pas avoir trouvé la réponse malgré tes explications

  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 : 38
    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
    Le problème n'est pas que tu ne trouves pas la réponse à ta question. Les forums sont là pour t'aider

    Le problème est que ta question est mal posée : il n'y a rien à déplacer dans un char à part des bits. Et le fait qu'elle soit mal posée veut dire 2 choses :
    • soit tu n'utilises pas les bons mot même si tu as compris, et ce n'est pas bien : emploie les bons mots pour montrer que tu as compris
    • soit tu n'as pas encore intégré le point essentiel que je rappelle juste après.

    Un char n'est pas une chaine de caractères.

    Je comprends que tu souhaites avancer sur ton application, c'est plus marrant que de lire des cours. D'ailleurs, est-ce un loisir ou est-ce ton travail ? Néanmoins, tant que tu ne comprendras pas ce qu'est une chaine de caractères, tu perdras ton temps et risqueras les bogues à coder une application qui passe son temps à manipuler des chaines de caractères.


    Quelles remarques (quand même) sur ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *p_char; 
    char *p_char1;
    Donne des noms qui veulent dire quelque chose à tes variables. Ainsi, en lisant le code, on peut le comprendre. Ici, c'est très difficile au premier coup d'oeil.

    Tu fais des cast un peu partout. Au mieux ils sont inutiles, au pire ils sont bizarres. Pourquoi tous ces cast ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char GPSGSM::getPar(char *str_long, char *str_lat, char *str_alt, char *str_time, char *str_speed)
    Je ne suis pas fan de la notation hongroise système dont tu sembles t'inspirer mais c'est un choix. En revanche, vu le nombre de paramètres de ta fonction, tu devrais sûrement faire une structure.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy(str_long, (char *)(p_char1));
    Je n'ai pas vu d'allocation mémoire pour str_long, l'as-tu faite ailleurs ?

    Globalement, j'ai l'impression que tu utilises deux pointeurs pour déterminer la position de début et la position de fin d'une chaine. Ensuite, tu fais des *p_char1 = 0; pour pouvoir copier la sous-chaine avec strcpy() qui va s'arrêter au bon endroit. Deux possibilités :
    • il existe strtok() si tu es d'accord de casser ton buffer d'entrée comme tu le fais ici
    • tu peux calculer le nombre de caractères avec une arithmétique de pointeurs et utiliser strncpy() pour préserver le buffer d'entrée


    Des remarques qui ne sont pas du C :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gsm.SimpleWriteln("AT+CGPSINF=0");
    gsm.WaitResp(5000, 100, "OK");
    Soit tu utilises un objet global nommé gsm et ce n'est pas terrible ; soit tu utilises des méthodes qu'on appelle statiques en Java , cad accessibles sans instance (je ne sais plus si C++ possède un tel mécanisme et si oui comment) et ce n'est en général pas trop apprécié en conception objet.

    La remarque suivante me fait pencher pour le cas 1.

    ...gsm.comm_buf...
    Ca sent le champ publique qui n'est pas une constante. Et c'est généralement mal en objet car cela casse l'abstraction qui est l'un des principaux objectifs de la POO.

  7. #7
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    787
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 787
    Par défaut
    A la lecture de la fonction getPar(), les données sont fournies par une fonction externe, et la fonction getPar() ne fait que découper le string reçu en 4 strings distincts.
    Donc, la position du '.' est bien indépendante du programme.

    Si il faut déplacer le '.' de 2 positions vers la gauche (et conserver la version string des valeurs), la solution de Sve@r est sans doute la plus rapide, mais ceci devrait aussi faire l'affaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sprintf(tmp,"%f",strtod(lat,NULL)/100.);
    (j'ignore ce qui se passe si on on remplace tmp par lat)

    Question annexe: que va-t-il se passer dans la fonction getPar() si if(gsm.IsStringReceived("OK")) est faux?

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Le problème, c'est surtout qu'on a ici un nombre décimal écrit dans une chaîne de caractères.
    Le plus simple est de convertir cette chaîne en nombre à virgule flottante, et de garder cette valeur par la suite.
    Oui mais alors on aura un souci lié à la façon dont l'ordi code les nombres à virgule flottante (perte de précision possible). Ceci dit, on peut présumer que le nombre sera un jour ou l'autre converti en flottant et que ce souci arrivera alors à ce moment là...

    Citation Envoyé par edgarjacobs Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sprintf(tmp,"%f",strtod(lat,NULL)/100.);
    (j'ignore ce qui se passe si on on remplace tmp par lat)
    Hum... peut-être risque d'effet de bord. Mieux vaut rester avec tmp...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Déplacer une colonne dans une table...
    Par ralkif dans le forum PostgreSQL
    Réponses: 10
    Dernier message: 07/10/2009, 06h50
  2. Comment déplacer une ligne dans une TStringGrid
    Par blondelle dans le forum C++Builder
    Réponses: 2
    Dernier message: 19/11/2008, 19h08
  3. déplacer une étiquette dans un état sous conditions
    Par françois35 dans le forum IHM
    Réponses: 6
    Dernier message: 28/08/2008, 14h36
  4. Déplacer une image dans un formulaire
    Par WITER dans le forum IHM
    Réponses: 2
    Dernier message: 01/11/2007, 03h47
  5. [débutant]déplacer une ligne dans CListCtrl
    Par mouss31 dans le forum MFC
    Réponses: 4
    Dernier message: 30/10/2006, 14h32

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