Go Down

Topic: Programmation - Recherche variable (Read 550 times) previous topic - next topic

Chacks86

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

zoroastre

#1
Feb 09, 2012, 06:52 am Last Edit: Feb 09, 2012, 06:58 am by zoroastre Reason: 1
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.
Veuillez indiquer [RESOLU] dans l'entête du titre en éditant votre premier message ;)

Super_Cinci

#2
Feb 09, 2012, 07:36 am Last Edit: Feb 09, 2012, 07:38 am by Super_Cinci Reason: 1
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 :

Code: [Select]

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


fdufnews

Quote
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

Chacks86

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.

Super_Cinci

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é :

Code: [Select]

<?PHP

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

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

?>


affichera :
Code: [Select]

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

Chacks86

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 :

Code: [Select]

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


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

Code: [Select]

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 :

Code: [Select]

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.

Super_Cinci

Ok, ok, ok.

Si dans ta structure tu mets :

Code: [Select]

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


Alors une recherche du genre :

Code: [Select]

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

osaka


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.



Yop yop,
Si j'ai bien compris  :smiley-sweat:
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 ?

vohu

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

fdufnews

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

Chacks86

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.

Go Up