Pages: [1] 2   Go Down
Author Topic: [Résolu !] Problème de pointeurs  (Read 1707 times)
0 Members and 1 Guest are viewing this topic.
Lormaison
Offline Offline
Newbie
*
Karma: 0
Posts: 48
Omnes vulnerant, ultima necat !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 :

Code:
// 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
« Last Edit: November 03, 2012, 04:50:15 pm by LibertyCareche » Logged

Quidquid agis, prudenter agas, et respice finem !

France
Offline Offline
Sr. Member
****
Karma: 2
Posts: 380
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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/
« Last Edit: November 03, 2012, 10:29:31 am by Grag38 » Logged

France
Offline Offline
Faraday Member
**
Karma: 36
Posts: 3445
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
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
Code:
c = chaine.substring ( 3 , chaine.length - 3 );

Logged

Lormaison
Offline Offline
Newbie
*
Karma: 0
Posts: 48
Omnes vulnerant, ultima necat !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 '&' ?)
« Last Edit: November 10, 2012, 05:49:48 am by LibertyCareche » Logged

Quidquid agis, prudenter agas, et respice finem !

Offline Offline
Sr. Member
****
Karma: 0
Posts: 332
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Lormaison
Offline Offline
Newbie
*
Karma: 0
Posts: 48
Omnes vulnerant, ultima necat !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

           smiley-eek
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.

            smiley-zipper
Logged

Quidquid agis, prudenter agas, et respice finem !

Offline Offline
Sr. Member
****
Karma: 0
Posts: 332
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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
5)
   a) Ton truc marche même si c'est moche
   b) j'ai souligné d'où vient ton problème au dessus
« Last Edit: November 03, 2012, 01:41:06 pm by vohu » Logged

Lormaison
Offline Offline
Newbie
*
Karma: 0
Posts: 48
Omnes vulnerant, ultima necat !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Voilà qui est très positif !
Je pense que quand on a rien à dire,...  smiley-zipper

      
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.

Quote
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.
« Last Edit: November 03, 2012, 01:55:37 pm by LibertyCareche » Logged

Quidquid agis, prudenter agas, et respice finem !

Offline Offline
Sr. Member
****
Karma: 0
Posts: 332
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

é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


Logged

Lormaison
Offline Offline
Newbie
*
Karma: 0
Posts: 48
Omnes vulnerant, ultima necat !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

...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.
Logged

Quidquid agis, prudenter agas, et respice finem !

Offline Offline
Sr. Member
****
Karma: 0
Posts: 332
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

C'est ce que j'ai fait :
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
« Last Edit: November 03, 2012, 02:16:48 pm by vohu » Logged

Lormaison
Offline Offline
Newbie
*
Karma: 0
Posts: 48
Omnes vulnerant, ultima necat !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

{
      ...
      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 ?
Logged

Quidquid agis, prudenter agas, et respice finem !

Offline Offline
Sr. Member
****
Karma: 0
Posts: 332
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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...
https://www.google.fr/#hl=fr&q=convert+char*+float&

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

Ça ne suffit pas ? ou il faut que je recopie ici ?
« Last Edit: November 03, 2012, 03:18:01 pm by vohu » Logged

Lormaison
Offline Offline
Newbie
*
Karma: 0
Posts: 48
Omnes vulnerant, ultima necat !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 smiley-lol
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
Logged

Quidquid agis, prudenter agas, et respice finem !

Offline Offline
Sr. Member
****
Karma: 0
Posts: 332
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Pages: [1] 2   Go Up
Jump to: