Programmation - Recherche variable

Bonjour,

je débute depuis peu sur arduino et j'ai 1 question sur la programmation

  1. Je déclare au début de mon programme plusieurs variables nommées V1, V2, V3, Vx.... de type INT. J'ai une Variable VARs de type String et VARi de type INT. La variable VARs contient le nom d'une de mes variables exemple : VARs = "V1" et VARi contient la valeur que je veux affecter à la variable dont le nom est contenu dans VARs

Exemple :
V1 = 10;
VARs = "V1";
VARi = 50;
là je voudrais que V1 = 50;

Je sais pas si c'est réalisable. Merci pour votre aide.

Pierre

Yep!

Pas possible!!! Tu dois convertir ton int en char.
Tu as donc le choix entre itoa ou sprintf.

EX: VARs = itoa(V1, buffer,...)

C'est un peu dur de comprendre ce que tu veux faire réellement et comment tu articules ton programme autour de VARs, qui à priori ne sert pas à grand chose. Retour sur afficheur ???

@+

Zoroastre.

Dans ton cas, il faut utiliser des pointeurs. un pointeur est un identificateur (au même titre que le nom donné à une variable).

donc tu aurais tes int v1, v2, v3, puis ton pointeur VARs. il te suffit d'assigner v1 à VARs, puis quand tu appelles VARs, ça modifie v1. J'imagine que tu voudrais ne discuter qu'avec VARs, et de temps en temps rediriger VARs vers v2 ou v3 ou v1... Changer de variable sans changer le code...

et en passant par un tableau :

int v[4]; // déclare un tableau de 4 int (v[0] à v[3])

int i, valeur;  // variables bidons

(...)
i = 3;
valeur = 2;
(...)
v[i] = valeur;  // équivaut à "v[3] = 2";

Je n'ai volontairement pas mis de code d'exemple, car sous arduino, je n'ai toujours pas compris comment utiliser les pointeurs, c'est vraiment très mal expliqué (en fait, j'ai rien trouvé sur l'utilisation des pointeurs...

Je n'ai volontairement pas mis de code d'exemple, car sous arduino, je n'ai toujours pas compris comment utiliser les pointeurs, c'est vraiment très mal expliqué (en fait, j'ai rien trouvé sur l'utilisation des pointeurs...

Rien de spécial sur Arduino.
http://www.commentcamarche.net/contents/c/cpoint.php3

Merci pour vos réponses.

J'ai pris pour exemple V1, V2, Vx mais les variables peuvent avoir des noms totalement différents.

En fait je lis un fichier stocké sur carte SD qui contient le nom de chaque variable et sa valeur

Ex :
[IP]=192.168.1.20
[SENSOR]=WS1170
...

Je voudrais pouvoir mettre dans la variable IP la valeur "192.168.1.20", dans la variable SENSOR la valeur "WS1170", etc...

J'avais effectivement regardé les pointeurs car ça me paraissait être la solution mais je n'ai pas réussi à tout comprendre donc je vais continuer à creuser de ce côté là.

Merci beaucoup.

Merci fdufnews!

Je vois ce que tu veux dire Chacks86 : en PHP on peut très facilement faire ce genre de manip car c'est un langage interprété :

<?PHP

$var1 = 258;
$var2 = 'Coucou';
$a = 'var1';

  echo ("1 - nom : " . $a . ", valeur : " . $a . "
");
  $a = 'var2';
  echo ("2 - nom : " . $a . ", valeur : " . $a);

?>

affichera :

1 - nom : var1, valeur : 258
2 - nom : var2, valeur : Coucou

Mais en arduino, c'est impossible, car une fois compilé, le code ne contient que des adresses mémoires des variables, mais plus les noms que l'on déclare...

Merci Super_Cinci et fdufnews!

Dommage que ce ne soit pas réalisable, je vais essayer de faire autrement.

J'avais une autre idée car j'utilise aussi une structure perso (stockée dans un fichier.c avec mon .pde)

Voici la structure de base :

typedef struct {
	String Nom;
        String Valeur;
	} Var;

dans mon programme je déclare un tableau avec cette structure

Var CONFIG[5];

Je rempli mon tableau avec le fichier stocké sur ma carte SD.
Est-il possible de rappeler rapidement 1 élément du tableau en connaissant le Nom

Ex :

CONFIG[0].Nom = "IP";
CONFIG[0].Valeur = "192.168.1.20";
CONFIG[1].Nom = "SENSOR";
CONFIG[1].Valeur = "WS1170";

je voudrais pouvoir trouver rapidement la structure ou Nom = "IP" sans avoir à faire à chaque fois une boucle en vérifiant si CONFIG*.Nom = "IP"*
Ce n'est peut être pas réalisable non plus.
Merci.

Ok, ok, ok.

Si dans ta structure tu mets :

typedef struct {
	byte Nom;
        String Valeur;
	} Var;

Alors une recherche du genre :

#define CONFIG_taille 5          // taille du tableau

const byte s_RIEN = 0;    // Pas de nom
const byte s_IP = 1;
const byte s_SENSOR = 2;
const byte s_AUTRE_NOM = 3;

Var CONFIG[CONFIG_taille];

CONFIG[0].Nom = s_IP;                      // "IP"
CONFIG[0].Valeur = "192.168.1.20";
CONFIG[1].Nom = s_SENSOR;                      // "SENSOR"
CONFIG[1].Valeur = "WS1170";
CONFIG[2].Nom = 1;                      // "IP"
CONFIG[2].Valeur = "192.168.1.21";
CONFIG[3].Nom = 2;                      // "SENSOR"
CONFIG[3].Valeur = "WS_trucmuche";

for (i=0; i<CONFIG_taille; i++){
  if (CONFIG[i].Nom == s_IP) {                   // comparaison d'un octet : beaucoup plus rapide que comparer une chaîne de caractères
    // traitement de l'IP trouvée... : CONFIG[i].Valeur
  }
}

Je ne vois que ça... je sais pas si ça peut t'aider...

Chacks86:
je voudrais pouvoir trouver rapidement la structure ou Nom = "IP" sans avoir à faire à chaque fois une boucle en vérifiant si CONFIG*.Nom = "IP"*
Ce n'est peut être pas réalisable non plus.
[/quote]
Yop yop,
Si j'ai bien compris :sweat_smile:
A part d'un emplacement connu sur ta carte sd ou dans un tableau impossible de trouver une valeur sans recherche, donc minimum boucle ... :~
En fait il faudrait savoir si tes valeurs sont connues et constantes ou dynamique ?
Dans ce premier cas il suffit de te repérer selon la position de tes valeurs dans le fichier ou tableau par exemple, sinon une méthode de parsing (recherche structurée) est obligatoire comme l'a fait Super_Cinci.
A quel moment tu veux rechercher ses valeurs, 1 fois au début ou tout au long de ton programme ?

si tu débutes il faut absolument que tu fasses un tuto langage C...
Aussi, y a des exemples sur le site de arduino http://arduino.cc/fr/Main/Apprendre

je voudrais pouvoir trouver rapidement la structure ou Nom = "IP" sans avoir à faire à chaque fois une boucle en vérifiant si CONFIG.Nom = "IP"

Tout dépend du nombre de structures à parcourir et de ce que tu entends par rapidement.

Des fois les solutions les plus simples .....

Merci Super_Cinci et fdufnews,

à la vue de vos réponses, je vais rester sur une boucle pour la recherche dans les structures, par contre je vais creuser l'idée d'utiliser les bytes plutôt que les chaines.

Pour les structures, la taille peut changer en fonction du nombre de données lues dans le fichier sur carte SD.

Merci.