Tableau de structure Index 0 dans un fonction

Hello
Pour faire court : quand j'appelle l'index 0 d'un tableau depuis une fonction, les données sont fausses.

Les détails

  • Déclaration de Structure :
struct FLASH {
  public:
  int Duration ;      
  int Delay ;            
  int Number;        
  int FlowTimer ;   
};
  • Déclaration du tableau
Int Index;
const FLASH Flash[4] = {{0, 0, 0, 0}, {20, 200, 2, 15000}, {20, 100, 3, 3000}, {20, 50, 5, 1000}};
  • La valeur appelée
Flash[Index].Duration
  • Valeur récupérée si Index = 0 depuis une fonction : 2486 (faux)

  • Valeur récupérer si Index = 1 depuis une fonction : 20 (correct)

  • La valeur retourné par Index = 0 est correcte si appelée depuis Setup()

Ce serait du basic, je chercherais une "option base" , mais là ...

Si la déclaration de flash[] est globale, cela devrait fonctionner sans problème.

Le problème peut venir d'ailleurs. Publie le code complet.

Vous êtes sûr de ne pas avoir défini deux fois le tableau une fois en global et une fois dans le setup ? (Problème de portée des variables).

Votre code d’exemple complet permettra de résoudre votre souci

PS: dans une struct les variables sont par défaut publiques donc pas la peine de mettre public:. Si c’était une classe, ce serait utile.

Mon code est long ...
Justement, les déclarations sont situées dans la partie du code AVANT setup(), et non, je n'ai pas déclaré 2 fois mes variables.

Et je suis sûr de la valeur de Index lors de l'appel du tableau.

J'ai des doutes sur le type nécessaire de Index. Je l'utilise comme un Int, qui est mis à jour par une syntaxe Index=0;
C'est peut être un pointeur qui devrait être défini autrement ou converti avant usage ?

Le bon type serait size_t mais un int fait l’affaire ce n’est pas la le souci

Essayez d’appeler votre index d’un autre nom (index() est une fonction en C++ si c’est un i minuscule que vous avez)

Oui mais par contre, tu peux très bien avoir une autre variable ou un autre tableau en mémoire qui vient écraser une partie de ton tableau si tu as des problèmes de manipulation de pointeur sur une variable ou d'index sur un autre tableau.

C'est pas grave.
On t'oblige pas, mais si tu veux que l'on t'aide il faut que de ton coté tu nous aides. Sans le code c'est juste des suppositions.

pour être concret, voici un exemple avec votre format de données:

ça fonctionne sans souci, le moniteur série affiche bien

Dans setup, pour index = 0 	 	 0	  0
Dans la loop, pour index = 1	20	200
Dans la loop, pour index = 2	20	100
Dans la loop, pour index = 3	20	 50

le code
struct FLASH {
  public:
    int Duration ;
    int Delay ;
    int Number;
    int FlowTimer ;
};

int Index;
const FLASH Flash[4] = {{0, 0, 0, 0}, {20, 200, 2, 15000}, {20, 100, 3, 3000}, {20, 50, 5, 1000}};

void setup() {
  Serial.begin(115200);
  Index = 0;
  Serial.print("Dans setup, pour index = "); Serial.print(Index);
  Serial.print("\t"); Serial.print(Flash[Index].Duration);
  Serial.print("\t"); Serial.println(Flash[Index].Delay);
}

void loop() {
  Index++;
  if (Index >= 4) while (true); // on meurt ici
  Serial.print("Dans la loop, pour index = "); Serial.print(Index);
  Serial.print("\t"); Serial.print(Flash[Index].Duration);
  Serial.print("\t"); Serial.println(Flash[Index].Delay);
}

Bonjour godzilla_janus

J'ai fait l'essai en affichant les indexes 0 et 1, depuis void setup():

	Serial.println(Flash[0].Duration);
	Serial.println(Flash[1].Duration);

retournés de la fonction int returnDuration(int index):

int returnDuration(int index)
{
	return Flash[index].Duration;
}

et affichés dans la fonction void displayDuration():


void displayDuration()
{
	Serial.println("");
	Serial.println(Flash[0].Duration);
	Serial.println(Flash[1].Duration);
}

Pour lkes 3 fois, le résultat a été exacte:

0
20

0
20

0
20

PS:

Il y a une faute de syntaxe, c'est int et non pas Int

Cordialement
jpbbricole

Merci pour vos neurones !
(je dois dire que je suis surpris...)
Je suis en train d'essayer d'édulcorer mon code pour avoir un truc plus lisible.

OK si le problème disparaît à un moment c’est que vous aviez / avez un bug :slight_smile:

(Il n’y a aucune raison que ça ne fonctionne pas)

Alors,
J'avais mis au point mon code sur un Arduino UNO "Genuine". Je n'avais pas constaté l'anomalie.
Il tourne aussi sur de l'attiny85 digispark, mais j'ai du étendre les fonctionnalités et ça rentre plus sur l'attiny.
Là, je passe en qualif sur un NANO à l'origine douteuse : y a du 12V avec des ampères qui se balladent autour, et j'ai pris du jetable. C'est la première fois que je constate mon bugware.

ça peut être une piste ? on a déjà vu du code partir en quenouille pour un pb de compatibilité ?

Je ne sais pas ce sue vous voulez dire par là mais des courants forts peuvent générer des interférences

A partir de données RS232 filtrées par un Maxx3232, mon appli pilote des mosfets qui déclenchent des phares à led ou des buzzers, en 12v.
Il y a aussi un HM-10 qui renvoie les données en Bluetooth.

Je n'avais pas pensé à une perturb électro.

Je crois que je vais repasser par la case UNO pour contrôler ce bazar.

Débranchez les courants forts et regarder si le code plante

Je peux déjà répondre que même uniquement alimenté par le port USB, l'anomalie se reproduit.

Sinon, en cible, le Nano est alimenté en 12v ( par batterie, pas de circuit de charge automobile) et distribue du 3.3v

Alimenter un nano en 12V est une mauvaise idée - le pauvre petit régulateur sur la carte va devoir dégager sous forme de chaleur ~7V x le courant consommé … il a des capacités restreintes et si vous alimentez de nombreuses choses au travers de l’arduino il se peut qu’il surchauffe et fasse planter la nano.

Si ça plante avec juste 5V en USB et qu’il n’y a pas une demande en courant supérieure à 400/500mA (ce que fournit votre USB) alors il y a peut être un bug quelque part

Sans le circuit et le code on ne peut pas grand chose pour vous …

On peut clore ce sujet.
Je n'ai pas trouvé, mais j'ai triché: si la valeur est 0, alors je n'exécute pas ma fonction, et c'est bon.

Merci pour le tuyau des 12v

Le Nano alimente en 3.3v un HM-10 (donné pour 20-Ma) et un maxx3232, que je n'ai pas mesuré.
Je vais voir pour l'alimenter en 5V (j'en ai aussi !)

Ah oui, mais c'est moche !!!

Oui, enfin c'est surtout nul parce qu'il y a manifestement un problème et il le cache sous le tapis.

C'est exactement ce que je disais.