[Résolu !] Problème de pointeurs

Bonjour à tous,

Je débute en C. J'ai travaillé avec les pointeurs sur un autre langage mais là je suis un peu déconcerté.
Voici le problème que je ne résous pas, en tout cas "à quelque chose près" ce que je souhaite réaliser :

// Un tableau à deux dimensions
char Liste [10][20];

// Une Fonction sensée convertir le paramètre en Flottant (float)  : 
//      le paramètre est de la forme "ABC123.456"
//      La sortie doit être le float 123.456
float Str2F (char chaine )
{
      float f;      char c;
      c = chaine.substring ( 3 , chaine.length - 3 );
      f = float ( c );
      return f;
}


void Appelant()
{
      ...
      Liste [1] =  "AZE123.45678";
      float NombreFlottant = Str2F ( Liste[1] );
      ...
}

Facile et pourtant

f = float(c);

ne fonctionne pas ! ce n'est pas un cast et encore moins une conversion de string vers float.

recherche sur google un truc du genre : atof

aller, un chti lien :

http://www.cplusplus.com/reference/clibrary/cstdlib/atof/

ou encore strtod :

http://www.cplusplus.com/reference/clibrary/cstdlib/strtod/

float Str2F (char chaine )
{
      float f;      char c;
      c = chaine.substring ( 3 , chaine.length - 3 );
      f = float ( c );
      return f;
}

Là il y a mélange des genres plus erreur de type.
D'abord:
char chaine définit une variable de type char, c-à-d un caractère uniquement.
Pour définir une chaîne de caractère, il faut déclarer un tableau de char (donc il faut définir une taille de chaîne) char chaine[20]. Définition d'une chaîne de 20 caractères (terminateur de chaîne inclus)
Alternative au tableau de char il y a les objets String définis dans les librairies arduino qui permettent de manipuler des chaînes de caractères. Tu trouveras les explications dans l'aide de l'IDE arduino ou sur le site arduino (je ne te mets pas le lien, je n'arrive pas à accéder au site arduino aujourd'hui)

Ensuite quand je parle de mélange des genre c'est que justement tu mélanges les méthode de la classe String (.substring) avec le type char

 c = chaine.substring ( 3 , chaine.length - 3 );

Merci pour votre réactivité
__Grag 38.

Ça ne fonctionne pas mais c'est censé le faire d'après la référence:

http://www.mon-club-elec.fr/pmwiki_reference_arduino/pmwiki.php?n=Main.ConversionFloat

Y-a-t-il une solution ...toute faite ?

__ fdufnews
String c; n'arrange pas le problème de même que char c[20]; : error: invalid use of member (did you forget the '&' ?)

pour commencer :
float Str2F (char chaine )

si chaine doit être une chaine comme son nom l'indique, ta fonction devient alors :
float Str2F (char *chaine ) ou float Str2F (char chaine[] )

Je ne comprends pas l'interet de la fonction appelant()

Elle ne renvoit rien, et ne modifie rien non plus. NombreFlottant n'existant plus après l'appel de la fonction.

Je crois qu'il faut que tu reprennes un cours de C au début, et surtout que tu ne mélanges pas avec C++, en utilisant pas la classe String.

:astonished:

  1. String existe dans Arduino
  2. nous sommes sur Arduino
  3. c'est un exemple
  4. Le but de ma quête est de convertir une chaine en float ce que tous les languages font couremment depuis plus de trentes ans.
  5. Le rôle d'Appelant est dans l'exemple destiné a

a) initialiser la première ligne du tableau.
b) initialiser NombreFlottant par un appel de la fonction sujet du post.

:zipper_mouth_face:

Et bien, je crois que tu vas te débrouiller tout seul :slight_smile:

  1. j'ai jamais dit le contraire, c'est pour cela que tu déclares tes chaines sans String (char Liste [10][20]; )
  2. ha bon ?
  3. un exemple qui ne fonctionne visiblement pas
  4. Oui, mais visiblement, tu ne fais pas du C depuis si longtemps

a) Ton truc marche même si c'est moche
b) j'ai souligné d'où vient ton problème au dessus

Voilà qui est très positif !
Je pense que quand on a rien à dire,... :zipper_mouth_face:

vohu:
Je crois qu'il faut que tu reprennes un cours de C au début, et surtout que tu ne mélanges pas avec C++, en utilisant pas la classe String.

C'est un début de solution que je cherche pas une polémique.

Dis moi ce dont tu as besoin,... je te dirai comment t'en passer !

Ce petite fonction va s'insérer dans un programme de plusieurs centaine de lignes et qui fonctionne en grande partie. Tout modifier sous prétexte que personne n'a une solution est... excessif.

écoute monsieur, je t'ai dit ce qui était faux dans ton code mais ça ne t'a as plus...

Je résume sur la raison qui m'a poussé à te rediriger vers un tuto C :

  • utilisation erronée des char en tant que chaîne de caractères et confusion avec les méthodes de la classe String (C++)
  • erreurs sur les prototype de fonctions (problème de pointeurs (chaines et tableaux))
  • erreurs dans les déclarations de variables et sur leur portée.

Je te conseille donc de revoir les bases du langage C. Rien d'insultant...

Tu as l'air d'avoir juste envie qu'on te fournisse un code tout fait... ce qui n'est pas quelque chose d'habituel sur ce forum

LibertyCareche:
...Je débute en C.

Ce n'est pas parce qu'on débute en C qu'on débute en tout !
Quand j'ai à faire à quelqu'un qui me dit avoir un problème, je l'aiguille au minimum. et quand je dis un minimum c'est très au dessus de votre maximum !

Comme déjà dit, je cherche un début de solution et pas qu'on me renvoie dans mes quarante mètres.

C'est ce que j'ai fait :

vohu:
Problème:
pour commencer :
float Str2F (char chaine )
Solution:
si chaine doit être une chaine comme son nom l'indique, ta fonction devient alors :
float Str2F (char *chaine ) ou float Str2F (char chaine[] )

Problème:
Je ne comprends pas l'interet de la fonction appelant()
Elle ne renvoit rien, et ne modifie rien non plus. NombreFlottant n'existant plus après l'appel de la fonction.
correction : (en fait elle ne modifie que Liste [1])
Solution:
Je crois qu'il faut que tu reprennes un cours de C au début, et surtout que tu ne mélanges pas avec C++, en utilisant pas la classe String.

Je pense que c'est pas la peine de s'embrouiller la tête avec des fonctions atoi() ou autre, alors que tu confonds encore les char et les char*. Ajouter en plus la lib String ne fait qu'ajouter des problèmes...
Je pense toujours que ma réponse est justifiée...
D'ailleurs, plusieurs membres t'ont donné des réponses qui n'ont pas suffit, dont celle que tu recherches

Voilà,... j'ai modifié l'exemple pour que vous le compreniez. Cf."..." et "...".

LibertyCareche:
{
...
Liste [1] = "AZE123.45678";
float NombreFlottant = Str2F ( Liste[1] );
...
}

Me dire avec quoi je ne dois pas "m'embrouiller la tête" ne fera pas avancer la bête.
Je demande de l'aide et votre aide ne me suffit pas, visiblement. Je pense que ce n'est pas difficile à comprendre. Soit vous continuez sur cette voie et me faite perdre mon temps soit vous devenez plus créatif et me guidez un peu plus sur ce que je ne vois pas et que peut-être, vous ne voyez pas non plus.
Dois-je ré-inventer le fil à couper le beurre ou existe t'il une fonction ?
Le basic le fait depuis 35 ans, le Pascal depuis je ne sais plus... Delphi pareil. Si je demandais comment assigner une chaine à une autre, sans doute me diriez vous chaine1 = chaine2 est la solution. Quel est le problème ici ?

Pour quelqu'un qui nous sort depuis combien d'années certains langages font une pauvre conversion, si tu ne voulais pas perdre ton temps il suffisait d'une seule recherche sur google...

Les 2 premiers résultats, et sans doute beaucoup de suivants...

Ça ne suffit pas ? ou il faut que je recopie ici ?

XD
Avec une avancée aussi spectaculaire, c'est ce que j'ai fini par faire... Comme dans X-Files... la réponse est ailleurs... lol

ravis de t'avoir permis de te détacher de l'assistanat...

Benh... ce n'est pas grâce à vous lol... c'est sur un autre site que j'ai eu la réponse... elle y est et en plusieurs exemplaires. Je ne regrette pas d'avoir commencé ma recherche sur ce site malgré tout... juste vous. :slight_smile:

Un code possible

// Un tableau à deux dimensions
char Liste[10][20];

// Une Fonction sensée convertir le paramètre en Flottant (float)  : 
//      le paramètre est de la forme "ABC123.456"
//      La sortie doit être le float 123.456
float Str2F (char* chaine )
{
      float f;      char c[20];
      strcpy(c,chaine+3);
      f = atof ( c );
      return f;
}


void Appelant()
{
  strcpy(Liste [1],"AZE123.45678");
  float NombreFlottant = Str2F ( Liste[1] );
  Serial.print(NombreFlottant);
}


void setup(void){
  Serial.begin(9600);
  Appelant();
}


void loop(void){
}

Merci pour cette correction fdudnews.

Résultat magnifique de simplicté...

Si je peux abuser :slight_smile: Pourquoi n'y a t-il toujours que deux décimales ?

C'est bien ce que je disais... un assisté.

C'est le comportement par défaut de la classe Print sur laquelle est basée Serial.
size_t println(double, int = 2);
size_t print(double, int = 2);

Il faut passer comme 2eme paramètre le nombre de décimales.

Autre solution utiliser sprintf() qui s'applique a des chaînes de caractères (c'est à dire en C, à des tableaux de caractères utilisant le caractère nul '\0' pour marquer la fin). avr-libc: <stdio.h>: Standard IO facilities