pointeur?

Bonsoir,
Je cherche extraire dans un 'long' un 'byte'

long 123456

pointer sur le deuxième chiffre

byte 2

Est-il possible de faire ça?
Merci.

Merci pour tout pepe,
Je viens de regarder tout ça. Je souhaite effectivement extraire les chiffres du long mais je ne parviens pas a utiliser 'atol'. En revanche, je viens de découvrir le modulo. J'ai donc fait:

long l = 1234;
byte b0 = l%10;
byte b1 = (l/10)%10;
byte b2 = (l/100)%10;
byte b3 = (l/1000)%10;

Le résultat est:

l=1234
b0=4
b1=3
b2=2
b3=1

Cest pas mal. Maintenant, je cherche à faire la même chose avec un float
l=0.1234
b0=4
b1=3
b2=2
b3=1

Zarb94:
Cest pas mal. Maintenant, je cherche à faire la même chose avec un float

Bonjour,

Là j'avoue que je ne vois vraiment pas l’intérêt, ou alors c'est pour la beauté du sport et là ça ne se discute pas :slight_smile: .

kamill:
Bonjour,

Là j'avoue que je ne vois vraiment pas l’intérêt, ou alors c'est pour la beauté du sport et là ça ne se discute pas :slight_smile: .

Bonsoir,
Je suis en pleine réflexion pour optimiser mon code qui fonctionne. J
'ai réalisé un menu à choix multiple grasse à une structure, mais elle est lourde et mange pas mal de memoire:

33 ligne de 8 objets qui donne:

1 byte le numéro de page
2 byte y
3 byte x pour l'affichage sur le lcd
4 byte la page de destination
5 char a touche attendue
6 long Code Alarme
7 int Action pour le code
8 String Texte claire

l'idée est d'encapsuler' les info pour gagner de la mémoire de sorte d'avoir 33 ligne de 3 objets mais si par hazard le 1er objet est égal à 0 dans un long, il passera à la trape que dans un float, sije fait un truc du style0.0123xxxxx je garde mon 0.

Évidement, c'est une usine à gaz...

Je pense que tu n'as pas tout compris aux flottants.
Dans un flottant il y a le même nombre de bits que dans un long, donc tu peux prendre le problème dans tous les sens tu ne pourras jamais stocker plus d'informations dans un float que dans un long.

Merci pour vos réponses.

kamill:
Je pense que tu n'as pas tout compris aux flottants.
Dans un flottant il y a le même nombre de bits que dans un long, donc tu peux prendre le problème dans tous les sens tu ne pourras jamais stocker plus d'informations dans un float que dans un long.

Le float servira à sauvegarder un '0' en début.
Avant Aprés
{ 1, 1, 0, 1, 49, 519000, 1, "1 Activer"}, = { 0.010010149, 0.5190001, "1 Activer"},
Je vais faire un traitement pour extraire chaque éléments du float.
En écrivant ce message, je vois que tu à répondu pepe ente temps, j'ai moi aussi réfléchi à la façon d'extraire les élements:

float b = 0.1234;
String j =String(b);
m=j[3];
int o =m.toInt ();
Serial.print("j3= byte o=");
Serial.println((byte) (j[3] - '0'));

Resultat=2

Je vai maintenant regarder la réponse de pepe qui à une autre approche.

Zarb94:
1 byte le numéro de page
2 byte y
3 byte x pour l'affichage sur le lcd
4 byte la page de destination
5 char a touche attendue
6 long Code Alarme
7 int Action pour le code
8 String Texte claire

j'imagine que certaines valeurs sont entières et très petites, alors pourquoi ne pas les regrouper sous 1 seul octet avec les instructions bit()

Bonjour,
L'idée parait intéressante, mais là, je décroche...

Zarb94:
Le float servira à sauvegarder un '0' en début.
Avant Aprés
{ 1, 1, 0, 1, 49, 519000, 1, "1 Activer"}, = { 0.010010149, 0.5190001, "1 Activer"},

Ce truc ne peut pas fonctionner.
Un float n'a une précision que de 6-7 décimales et le résultat est donc "victime" des arrondis de calcul. L'intégrité des valeurs ne sera pas garantie.

Tes données sont constantes, elles ne changent pas pendant l'exécution de ton programme. Donc tu peux les déclarer en mémoire Flash. Et pour les manipuler facilement tu pourrais créer une structure.
Ou bien déclarer uniquement les chaînes de caractères en Flash si tu veux pouvoir changer les autres valeurs pendant l'exécution.

fdufnews:
Ce truc ne peut pas fonctionner.
Un float n'a une précision que de 6-7 décimales et le résultat est donc "victime" des arrondis de calcul. L'intégrité des valeurs ne sera pas garantie.

Tes données sont constantes, elles ne changent pas pendant l'exécution de ton programme. Donc tu peux les déclarer en mémoire Flash. Et pour les manipuler facilement tu pourrais créer une structure.
Ou bien déclarer uniquement les chaînes de caractères en Flash si tu veux pouvoir changer les autres valeurs pendant l'exécution.

Effectivement, :(. Oui, mes données sont constantes. Elles ne sont pas figées, c'est à dire que je peu encore faire quelques modif. Pour la mémoire flash, je suis pas fermé, mais pas très chaud non plus car, si j'ai bien compris, elle à une durée de vie limité par le nombre d'écriture. Donc quand je vais y toucher, mon arduino commencera à 'vieillir'. Mais c'est une possibilité à lequel j’avais pensé.
Que pensez vous de cette altération?

rjnc38:
j'imagine que certaines valeurs sont entières et très petites, alors pourquoi ne pas les regrouper sous 1 seul octet avec les instructions bit()

Zarb94:
1 byte le numéro de page
2 byte y
3 byte x pour l'affichage sur le lcd
4 byte la page de destination
5 char a touche attendue
6 long Code Alarme
7 int Action pour le code
8 String Texte claire

Zarb94:
Bonjour,
L'idée parait intéressante, mais là, je décroche...

par ex ton menu fait 8 pages sur un afficheur 2*16
il faut 3 bits pour gérer le num page (0 à 7)
il faut 1 bit pour gérer la ligne de l'afficheur (0 ou 1)
il faut 4 bits pour gérer la colonne de l'afficheur (0 à 15)
pour gérer ses 3 infos il faut 8 bits donc un seul octet

Zarb94:
Pour la mémoire flash, je suis pas fermé, mais pas très chaud non plus car, si j'ai bien compris, elle à une durée de vie limité par le nombre d'écriture.

Limité, tout est relatif. A chaque fois que tu recharges ton programme tu fais une écriture en Flash.

Ce n'est pas l'origine de ce post ce qui explique que vous ne connaissez pas tous les éléments.
Je réalise un digicode qui fonctionnera avec ma centrale d'alarme (Arduino MEGA)

Actuellement, je tourne sur un UNO R3 (mais il est possible que je migre sur un NANO)
J'ai un clavier capacitif, un lecteur RFID RC522, un afficheur LCD 20x4 i2c
Ce digicode communique avec un softserial par des 'String'.

La partie com est ok, la gestion des codes d’accès est ok. Il me reste plus que l'affichage.
Actuellement, j'ai 8 menu qui par la suite évolueront. Ils sont basé sur une structure qui comporte 33 lignes de 8 info: le niveau du menu à laquelle elle appartiens, la position sur le LCD x et y, le menu de destination, la touche attendue, le code alarme correspondant, l'action true ou false, le texte clair à afficher.
Il s’avère que tout cela commence à de venir instable car j'utilise 79% de la Sram.

Mon code doit pouvoir être optimisé et je commence par la structure qui doit prendre à elle seul plus de 40% de mémoire.

Pour ça, j'ai hésité avec la Flash, mais je me suis donné un dernière chance. Il est certain que la tentation est grande mais je souhaite essayer quand m^me
Les bits:
Cette solution me séduit. Pour ça:
4 bits pour la page (de 1 à 7 mais il y aura une évolution)
2 bits pour la ligne (de 0 à 3)
5 bits pour la colonne (de 0 à 19)
5 bits pour la destination (page du menu)
7 bits pour la touche (char 72 je modifierai peut être c point)
20 bits pour le code alarme (600000)
1 bit pour l'action

Soit 44 bits ou 6 octets?

C'est une usine à gaz à créer!

fdufnews:
Limité, tout est relatif. A chaque fois que tu recharges ton programme tu fais une écriture en Flash.

Elle s’efface à chaque chargements? Je comptai commenter la structure après le 1er chargement.

Merci pepe,
Je viens de faire un essais, et j'ai poussé le vis de faire un essais
avec une ligne de ma structure tel quel et ça fonctionne!!!
{ 1, 1, 0, 1, 49, 519000, 1, "1 Activer"},
Si je comprend bien, dés lors que la déclaration est faite avec les bits réel: 'uint16_t ***:X;', je remplie le tableau en clair et s'est ok!

Edit:
Je n'utilise que 212 Octets soit 10% contre 40% il me semble!