Go Down

Topic: Stocker des constantes dans un fichier annexe? (Read 326 times) previous topic - next topic

inrepublica

Bonjour,

Dans un de mes petits programmes j'ai besoin de stocker plusieurs constantes qui vont me servir a afficher des bitmap à l'aide de la librairie de chez Adafruit.

Un exemple:
Code: [Select]

const unsigned char icone01d [] PROGMEM = {
0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x03, 0x00,
0x18, 0x00, 0xc0, 0x03, 0x80, 0x00, 0x01, 0xc0, 0x01, 0xc0, 0x00, 0x03, 0x80, 0x00, 0xe0, 0x00,
0x07, 0x00, 0x00, 0x60, 0x7e, 0x06, 0x00, 0x00, 0x01, 0xff, 0x80, 0x00, 0x00, 0x07, 0xff, 0xe0,
0x00, 0x00, 0x0f, 0x81, 0xf0, 0x00, 0x00, 0x0e, 0x00, 0x70, 0x00, 0x00, 0x1c, 0x00, 0x38, 0x00,
0x00, 0x1c, 0x00, 0x38, 0x00, 0x00, 0x38, 0x00, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x1c, 0x00, 0xfe,
0x38, 0x00, 0x1c, 0x7f, 0xfe, 0x38, 0x00, 0x1c, 0x7f, 0x00, 0x38, 0x00, 0x1c, 0x00, 0x00, 0x38,
0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x38, 0x00, 0x00, 0x1c, 0x00, 0x38, 0x00, 0x00, 0x0e, 0x00,
0x70, 0x00, 0x00, 0x0f, 0x81, 0xf0, 0x00, 0x00, 0x07, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xff, 0x80,
0x00, 0x00, 0x60, 0x7e, 0x06, 0x00, 0x00, 0xe0, 0x00, 0x07, 0x00, 0x01, 0xc0, 0x00, 0x03, 0x80,
0x03, 0x80, 0x00, 0x01, 0xc0, 0x03, 0x00, 0x18, 0x00, 0xc0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00,
0x18, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00,};


Comme j'en ai une bonne dizaine à utiliser je me demandais s'il est possible de les stocker dans un fichier annexe afin de ne pas surcharger mon fichier principale.

A l'aide d'un #include icone.ino est-ce possible?

Merci de votre aide.

jfs59

Bonjour,

bien sur il suffit de les mettre dans un fichier images.h et de faire un include
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours.

Lao Tseu.

inrepublica

Merci de votre réponse! S'il s'agit d'un fichier .h le code doit être en C et non plus en code arduino non? Par exemple si j'ajoute des fonctions dans ce .h je peux toujours utiliser la syntaxe Arduino?

_pepe_

#3
Dec 07, 2017, 02:09 pm Last Edit: Dec 07, 2017, 02:46 pm by _pepe_
Bonjour

Le « langage » Arduino n'est rien d'autre que le langage C++ (compatible avec le langage C) associé à une bibliothèque logicielle (dont la référence est donnée par ici) et à des options de compilation prédéterminées.

On peut donc choisir de faire ou non des appels au « langage » Arduino (c'est-à-dire aux objets et fonctions de sa bibliothèque) dans tout ou partie du programme. Les fichiers autres que le fichier .ino principal doivent juste inclure le fichier d'entête Arduino.h quand ils font référence à des éléments du « langage » Arduino.


Le fichier .h peut être inclus directement dans un fichier .ino, .cpp ou .c, voire dans un autre fichier .h.

Autrement, il faut penser qu'il est nécessaire de rajouter quelques éléments dans le cas où l'on mélange du langage C et du langage C++, afin d'assurer l'interface entre les deux.

_pepe_

#4
Dec 07, 2017, 02:27 pm Last Edit: Dec 07, 2017, 02:46 pm by _pepe_
Dans le cas présent, il me semble préférable de définir le tableau (i.e. donner ses valeurs) dans le code du programme (dans un fichier ..ino, .cpp ou .c) et, si nécessaire, de le déclarer (i.e. indiquer son existence) dans un fichier d'entête .h (ou .hpp). C'est ainsi qu'on organise habituellement l'écriture des programmes.

inrepublica

Si je comprend bien ce que vous me préconisez il me faut deux fichiers, icone.h qui déclare les tableaux et icone.c qui les définis? Avec icone.h qui inclut icone.c?

_pepe_

#6
Dec 07, 2017, 03:07 pm Last Edit: Dec 07, 2017, 03:08 pm by _pepe_
Si je comprend bien ce que vous me préconisez il me faut deux fichiers, icone.h qui déclare les tableaux et icone.c qui les définis?
Oui, c'est ce qu'on fait en principe. Mais ce n'est pas une obligation.

On crée des fichiers séparés pour alléger le code et le rendre plus lisible, ou bien pour le rendre modulaire et réutilisable par parties.

Dans le cas de petits programmes, on peut tout-à-fait réduire le nombre de ces fichiers en regroupant ensemble différentes parties du code.

Avec icone.h qui inclut icone.c?
Non l'inverse.


Par exemple, on pourrait avoir :

• dans le fichier icone.h :
Code: (icone.h) [Select]
#include <avr/pgmspace.h> // pour la déclaration de PROGMEM

extern const unsigned char icone01d [] PROGMEM;

• dans le fichier icone.c :
Code: (icone.c) [Select]
#include "icone.h"

const unsigned char icone01d [] PROGMEM = {
0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
...
...
};

• dans le fichier principal :
Code: (MonProgramme.ino) [Select]
#include "icone.h"

void setup() {
  ...

inrepublica

Ok super, merci pour vos conseils. Je m'en vais tester ça!

inrepublica

Je viens de tester, c'est nickel. J'ai juste changé <avr/pgmspace.h> par <pgmspace.h> car j'utilise un ESP8266.

Encore merci!

Go Up