Pages: [1]   Go Down
Author Topic: [RESOLU]Fonction "Switch case" et variable  (Read 939 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 1
Posts: 85
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour à tous,
Je vous ai en son temps, sollicité pour ce problème  :
http://arduino.cc/forum/index.php?PHPSESSID=f7a762e2a16bc0e57bcb0f3a7fbef5f7&topic=106694.0
Celui-ci est maintenant résolu, le PCB est gravé et fonctionne parfaitement.
Je reviens donc à la programmation.
Le programme fonctionne, mais je vaudrais améliorer sa lisibilité .
Je me sers de la fonction "switch case", avec une trentaine de choix possible.
Pour le moment, je n'arrive à faire fonctionner cette fonction qu'avec une variable de type "char" (1 seul caractère).
Or, j'aimerai, pour la lisibilité, me servir de variable plus explicite (du style ouvrir, ou fermer, ou bien tester, etc).
Et bien , lorsque je déclare ma variable en "string" cela ne fonctionne pas.

Message d'erreur ci-dessous
Quote
NivelUp_06.ino: In function 'void loop()':
NivelUp_06:467: error: invalid conversion from 'int' to 'const char*'
NivelUp_06:467: error: initializing argument 1 of 'String& String::operator=(const char*)'
NivelUp_06:475: error: switch quantity not an integer

Une amorce de solution serait la bienvenue
Cordialement.
JP
« Last Edit: January 07, 2013, 12:27:10 pm by bricopin » Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 224
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Salut,

Peux-tu poster la portion de code incriminée ?
Logged


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

Switch case ne fonctionne qu'avec une variable numérique donc de ce coté pas d'évolution possible.
Par contre pour coder de manière plus lisible rien ne t'empêche de déclarer un enum pour définir tes états et ensuite les utiliser dans les case.

Code:
// déclaration des cas possibles implicitement le premier vaut zéro mais on peut affecter la valeur que l'on veut à n'importe lequel avec un =
enum cas={E_INIT, E_CAS1, E_CAS2, E_CAS3, E_CAS4, E_CAS5};

......

     switch(mavariable){
       case E_INIT:

       case E_CAS1:

       case E_CAS2:

       case E_CAS3:

       case E_CAS4:

      default :
    }
« Last Edit: January 07, 2013, 07:15:13 am by fdufnews » Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 85
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,
OK, merci de vos réponses.
En complément :
Le projet est en deux parties : un programme sur une Arduino Mega 2560 et un programme sur un Pocket PC.
Le PPC transmet des ordre à la Méga, qui elle lui renvoi des infos.
La solution (enum) que vous me présentez résoudrait une partie de mes interrogations coté Arduino.
Mais, il me faudra toujours envoyer mes ordres provenant du PPC à l'aide d'une variable numérique puisque l'Arduino ne comprends que cela.
Je vais quand même garder cette info et verrais par la suite si je l'emploi ou non.
Ainsi que je l'ai dis, globalement le programme fonctionne.
Mais dans le cadre d'une optimisation du code (et donc de sa beauté), j'aurais vraisemblablement d'autres questions à formuler.
Par exemple, je ne connaissais pas la fonction (enum) qui a priori n'apparait pas dans les réferences arduino
http://www.mon-club-elec.fr/pmwiki_reference_arduino/pmwiki.php?n=Main.ReferenceMaxi
Encore merci
JP



Logged

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

Quote
Par exemple, je ne connaissais pas la fonction (enum) qui a priori n'apparait pas dans les réferences arduino
enum est un mot reservé (keyword) du C standard
http://c.developpez.com/cours/bernard-cassagne/node92.php

L'enum peut aussi bien être utilisé dans le logiciel coté Pocket PC (si tu développes en C sur le pocket)

enum alloue automatiquement un numéro à chacun des items définis dans la liste. Si on ne précise pas de valeur le premier item vaut 0, le suivant 1 et ainsi de suite. Si on précise une valeur pour un élément cette valeur lui est affectée et les items déclarés après prendront les numéros suivants. On peut voir l'enum comme une suite de #define qui seraient pris en compte automatiquement par le pré-processeur. Dans un même enum, deux items peuvent porter le même numéro par contre on ne peut pas avoir 2 items ayant le même nom dans un même enum.
Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Comme indiqué, l'enum n'est qu'une façon de rendre le code plus lisible en attribuant un nom en clair dans ton code a une valeur.

Sauf que par défaut, les valeurs ne sont pas forcément identique entre 2 compilateurs (en pratique c'est plutot identique).

Donc pour assurer l'interopérabilité entre ton code C sur PocketPC et ton Arduino, tu peux avoir un fichier H commun, utilisé dans les 2 codes et rédigé de la façon suivante :

Code:
enum cas={  E_INIT = 0,   E_CAS1, E_CAS2, E_CAS3, E_CAS4, E_CAS5};

Cela impose que la 1ere valeur soit à 0 et que les suivantes sont incrémentées de 1 en 1

En faisant #include de ce fichier dans ton code PocketPC et dans ton code Arduino tu t'assures l'interopérabilité des valeurs.

Reste ensuite a t'assurer que les messages soit bien compris entre les 2....
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Offline Offline
Jr. Member
**
Karma: 1
Posts: 85
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Pour le coté PPC, je programme avec WinDev qui permet de décliner l'application sur plusieurs matériel en ne faisant que peu de modif de code.
L'appli cote PPC sera par la suite implanté aussi sur de l'Android.
Mais le langage est un langage bien particulier à Winev.
Donc  ça restera comme ça car ça n’empêche pas mon programme de fonctionner.
Je clos ce sujet et en ouvre un autre pour une autre question
JP
« Last Edit: January 07, 2013, 12:27:34 pm by bricopin » Logged

Pages: [1]   Go Up
Jump to: