Initialisation d'un "unsigned long"

Bonjour,

C'est sans doute la demande la plus bête qu'on ait faite sur le forum mais il se trouve que je bute sur

l'initialisation d'un unsigned long.

Ce code : unsigned long coup=50000;

me donne 0 lorsque j'affiche la variable coup

Ma question est donc comment initialiser un unsigned long ?

En faisant l'affectation dans setup(), ça ne marche pas non plus :slightly_frowning_face: .

Je vous remercie.

Bonjour,

unsigned long coup=50000UL;

C'est quand même bizarre que ça te donne 0. Ce devrait plutôt être tronqué.

Peut être que tu l'initialise comme variable local.

Initialise la variable en tout début de code comme sa elle sera global (si ce n'est pas déjà fait bien sur).

Bonjour

Sans code c'est difficile de t'aider, mais à mon avis il est probable que tu ne cherches pas au bon endroit

Soit tu l'affiches de manière incorrecte = ce que tu vois n'est pas le contenu de la variable

Soit tu altères sa valeur de manière non voulue, par exemple (un grand classique) par débordement mémoire d'une chaîne de caractères qui se trouve après dans le code (placée avant dans la ram par le compilateur).

akuma8:
Bonjour,

C’est sans doute la demande la plus bête qu’on ait faite sur le forum mais il se trouve que je bute sur

l’initialisation d’un unsigned long.

Ce code :

unsigned long coup=50000;

Non il n’y a pas de demande bête, si tu poses la question c’est que tu as un pb !
Mais difficile à reproduire :

[Edit 2/12 04:55] Essais manip sur images

-Standby: Peut être que tu l'initialise comme variable local.

Initialise la variable en tout début de code comme sa elle sera global (si ce n'est pas déjà fait bien sur).

Elle est globale

Tu l'affiches comment?

bricoleau: Bonjour

Sans code c'est difficile de t'aider, mais à mon avis il est probable que tu ne cherches pas au bon endroit

Soit tu l'affiches de manière incorrecte = ce que tu vois n'est pas le contenu de la variable

Soit tu altères sa valeur de manière non voulue, par exemple (un grand classique) par débordement mémoire d'une chaîne de caractères qui se trouve après dans le code (placée avant dans la ram par le compilateur).

Elle vaut bien 0 parce qu'en exécutant le programme, l'état qui dépend de la variable "coup" se déclenche

alors que je souhaite l'initialiser afin d'éviter justement ce déclenchement.

Peut-on gérer l'emplacement des variables dans la ram ?

kamill: Tu l'affiches comment?

Voici comment je l'affiche :

Serial.println(coup,DEC);

bricoleau:

Soit tu altères sa valeur de manière non voulue, par exemple (un grand classique) par débordement mémoire d’une chaîne de caractères qui se trouve après dans le code (placée avant dans la ram par le compilateur).

Y a quoi comme autre variable globale à la suite de unsigned long coup ?

Non il n’est jamais nécessaire de gérer l’emplacement des variables dans la ram.

Par contre il est toujours nécessaire de s’assurer que les tableaux et autres chaînes de caractères sont gérés correctement, sans dépassement d’indice par rapport à l’espace mémoire alloué.

bricoleau:
Sans code c’est difficile de t’aider

bricoleau: Y a quoi comme autre variable globale à la suite de unsigned long coup ?

Non il n'est jamais nécessaire de gérer l'emplacement des variables dans la ram.

Par contre il est toujours nécessaire de s'assurer que les tableaux et autres chaînes de caractères sont gérés correctement, sans dépassement d'indice par rapport à l'espace mémoire alloué.

Les unsigned long que j'ai sont les suivants :

unsigned long tp_attente=0; 
unsigned long capture;
unsigned long chrono=0;
unsigned long tmp=0;
unsigned long tmp2=0;
unsigned long coup=50000UL; // initialisation pour éviter tout conflit au démarrage 
unsigned long temps =0;
unsigned long petite_att1=0; // Courte attente avant de faire une impulsion arrière lors de la butée fermeture
unsigned long petite_att2=0;
unsigned long t3s =0;
unsigned long test_led_manu=0;
unsigned long temps_sortie_z1_A=0;
unsigned long coup_blower=2000;//initialisation qui évite qu'au démarrage il y ait conflit
unsigned long temps_reverse; // capture temps pour revenir en arrière

Toutes mes chaines de caractères sont placées dans la FLASH.

Une variable ne change pas de valeur toute seule.

Est-ce qu'il y a des endroits dans ton programme où tu altères volontairement le contenu la variable coup?

Si oui, vérifie le code à ce niveau là

Si non, cela ne peut être qu'un débordement mémoire : - pointeur mal valorisé - ou tableau utilisé avec un indice hors cadre - ou insuffisance de ram disponible / écrasement

Et si tu ne trouves pas, sème des petits cailloux avec une fonction du style

 void verifierCoup(int ref)
{
  if (coup == 0)
  {
    Serial.print(ref);
    Serial.println(" : coup a zero !);
  }
}

Et tu l'appelles depuis un peu partout en faisant varier la ref : verifierCoup(0), verifierCoup(1), etc...

Par dichotomie, tu finiras bien par identifier quelle est l'instruction du code qui altère cette variable.

bricoleau: Une variable ne change pas de valeur toute seule.

Est-ce qu'il y a des endroits dans ton programme où tu altères volontairement le contenu la variable coup?

Si oui, vérifie le code à ce niveau là

Si non, cela ne peut être qu'un débordement mémoire : - pointeur mal valorisé - ou tableau utilisé avec un indice hors cadre - ou insuffisance de ram disponible / écrasement

Et si tu ne trouves pas, sème des petits cailloux avec une fonction du style

 void verifierCoup(int ref)
{
  if (coup == 0)
  {
    Serial.print(ref);
    Serial.println(" : coup a zero !);
  }
}

Et tu l'appelles depuis un peu partout en faisant varier la ref : verifierCoup(0), verifierCoup(1), etc...

Par dichotomie, tu finiras bien par identifier quelle est l'instruction du code qui altère cette variable.

Merci.

En suivant ton astuce j'ai trouvé le coupable en plus d'une saturation ram.