J'ai voulu essayé de créer une librairie dans laquelle je pourrai rentré la valeur de la pin souhaitée et que dans la librairie, une fonction configure cette pin en sortie, et une 2ème fonction change simplement la valeur précédente (Si elle était à 1, met un 0...), puis une petite attente de 500ms.
Ce que je ne comprend pas dans le tuto cité ci-dessus, c'est comment ils font pour appeler une des fonctions.
Pour appeler leur fonction "dot" ils font cela : morse.dot();
Que signifie ce point entre les deux noms ? il s'agit "d'instance" ? Je ne comprends pas de quoi il s'agit...
C'est de la programmation objet
morse est un objet = une instance de la classe définie par la bibliothèque.
dot() est une méthode applicable à cet objet
Si ces termes te semblent abscons, je te suggère de commencer par faire le tour de quelques tutos sur la programmation objet en C++
Merci beaucoup de ta réponse.
Est-il possible d'appeler une fonction qui est dans une librairie sans utiliser cette particularité du C++ ? Je connais uniquement le C...
gaelperr:
Est-il possible d'appeler une fonction qui est dans une librairie sans utiliser cette particularité du C++ ? Je connais uniquement le C...
Tu mélanges "est dans une librairie" et "fonctionne en C++". C'est totalement indépendant.
En tous cas, si une fonction est définie comme membre (non-statique) d'une classe, c'est du C++, tu ne peux pas y couper (et tu ne peux appeler cette fonction sans avoir un objet de la classe)
Il faut s'entendre sur les termes.
Une library, en français bibliothèque, c'est du code que, pour le réutiliser facilement, on place dans des fichiers.
Si, en plus, on utilise une IDE cette IDE défini des emplacements spéciaux pour y déposer les fichiers bibliothèques. Les emplacements étant fixes et connus l'utilisateur n'a pas besoin de communiquer l'adresse des fichiers au compilateur.
Le fichier ino que tu écris n'est pas transmis tel quel au compilateur.
L'IDE Arduino le transforme en un vrai fichier cpp en y ajoutant les prototypes de fonctions, la fonction main() dans laquelle sont appelés la fonction init() dont tu n'a probablement jamais entendu parlé, la fonction setup() et la boucle infinie dans laquelle est appelée la fonction loop().
Il est compilé et si on utilise une ou plusieurs bibliothèques leurs fichiers sont aussi compilés un par un.
Tous les fichiers compilés sont liés par l'éditeur de lien (Linker).
Univers arduino :
Il existe des bibliothèques de fonctions et des bibliothèques de classes (programmation orienté objet).
Très majoritairement tu trouvera des bibliothèques de classe.
Mais il existe aussi des bibliothèques de fonctions.
Par exemple la fonction digitalWrite(x) appartient à une bibliothèque de fonction à savoir le fichier wiring_digital.c .
On déduit que c'est une bibliothèque de fonction parce que le fichier est en extension c.
Le nom du fichier rappelle qu'Arduino est un fork du projet Wiring.
Les bibliothèques de classes s'utilisent selon les règles de la programmation objet.
Avis d'un tout petit programmeur : La lecture d'un tuto d'initiation au cpp ne fera jamais de mal et fera même gagner du temps.
Difficile d'échapper à la programmation objet dans le monde arduino.
Tout le monde passe par exemple par Serial.print()
Les usages de base ne sont pas très durs à appréhender. Il y a plein de tutos disponibles là-dessus.
Après tu n'es pas obligé de t'attaquer aux notions plus complexes d'héritage, polymorphisme ou généricité.
Quoique je suspecte beaucoup de monde dans le coin, d'utiliser allègrement la méthode .print() un peu partout, sans avoir notion de sa définition sous-jacente
Difficile d'échapper à la programmation objet dans le monde arduino.
Oui.
Mais il y a des exceptions et une de taille : l'I2C
Je ne connais aucune bibliothèque qui hérite de la classe Two-Wire.
Toutes les bibli que je connais utilisent l'objet Wire instancié directement dans le fichier de la classe Two-Wire.
C'est a un tel point que quasiment tout le monde pense que Wire c'est une bibliothèque alors que c'est un objet.
J'en ai pris note, malheureusement ça ne change rien a mon programme
Voici aussi le code du programme principal :
#include <Inverse.h>
Inverse inverse(7);
void setup()
{
}
void loop()
{
Inverse change();
delay(500);
}
Dans l'exemple, ils mettent "Inverse.change();" avec un point entre les deux, mais chez moi si je fais comme ça, une erreur apparaît car il ne comprend pas ce que ça signifie..
68tjs:
Il faut s'entendre sur les termes.
Une library, en français bibliothèque, c'est du code que, pour le réutiliser facilement, on place dans des fichiers.
Si, en plus, on utilise une IDE cette IDE défini des emplacements spéciaux pour y déposer les fichiers bibliothèques. Les emplacements étant fixes et connus l'utilisateur n'a pas besoin de communiquer l'adresse des fichiers au compilateur.
Le fichier ino que tu écris n'est pas transmis tel quel au compilateur.
L'IDE Arduino le transforme en un vrai fichier cpp en y ajoutant les prototypes de fonctions, la fonction main() dans laquelle sont appelés la fonction init() dont tu n'a probablement jamais entendu parlé, la fonction setup() et la boucle infinie dans laquelle est appelée la fonction loop().
Il est compilé et si on utilise une ou plusieurs bibliothèques leurs fichiers sont aussi compilés un par un.
Tous les fichiers compilés sont liés par l'éditeur de lien (Linker).
Univers arduino :
Il existe des bibliothèques de fonctions et des bibliothèques de classes (programmation orienté objet).
Très majoritairement tu trouvera des bibliothèques de classe.
Mais il existe aussi des bibliothèques de fonctions.
Par exemple la fonction digitalWrite(x) appartient à une bibliothèque de fonction à savoir le fichier wiring_digital.c .
On déduit que c'est une bibliothèque de fonction parce que le fichier est en extension c.
Le nom du fichier rappelle qu'Arduino est un fork du projet Wiring.
Les bibliothèques de classes s'utilisent selon les règles de la programmation objet.
Avis d'un tout petit programmeur : La lecture d'un tuto d'initiation au cpp ne fera jamais de mal et fera même gagner du temps.
Et comment peut on créer une bibliothèque de fonction et non de classe ?
Tu définis tes fonctions dans un fichier .cpp (éventuellement dans un fichier .c) et tu déclares ces fonctions dans un fichier .h.
Tu inclus le fichier .h dans ton programme qui appelle les fonctions.
Il est de bonne pratique de donner le même nom au fichier .h et .cpp.
Et comment peut on créer une bibliothèque de fonction et non de classe ?
Ben simplement en mettant le code des fonctions dans un fichier C et les entêtes dans un fichier h.
Pour le fichier c tu peux voir des exemples dans le "core" de l'IDE :
~arduino-1.8.4/hardware/arduino/avr/cores/arduino
Par exemple tu ouvre un fichier d'extension c pris dans cette liste
$ ls *.c
hooks.c
WInterrupts.c
wiring_analog.c
wiring.c
wiring_digital.c
wiring_pulse.c
wiring_shift.c
Ce ne sont pas les bibliothèques de fonctions qui manquent dans l'IDE Wiring/Arduino.
Pour l'IDE les déclarations concernant ces fichiers sont rassemblées dans le fichier Arduino.h.
Pour les bibliothèques personnelles son écriture ne diffère pas vraiment selon que le fichier compagnon est un c ou un cpp
Emplacement de ces fichiers :
Je ne sais pas si l'IDE arduino accepte que l'on installe une bibliothèque ne contenant que des fichiers c comme une bibliothèque contenant des fichiers cpp.
Il me semble que rien ne devrait l’empêcher mais cela reste à vérifier.
De toute façon il reste toujours possible de copier les fichiers de la bibliothèque dans le même répertoire que celui du fichier ino.
Ou mieux de placer tous les fichiers bibliothèque dans un répertoire à part et de lier symboliquement les fichiers utiles dans le répertoire qui contient le fichier ino.
Le lien symbolique fait comme si le fichier était dans le répertoire contenant le fichier ino alors qu'en fait le fichier reste dans son répertoire d'origine. Il n'existe donc qu'une seule copie du fichier sur le disque dur.
L'IDE ne doit pas procéder autrement pour faire croire au compilateur que tous les fichiers sont dans le répertoire de travail.
Lier symboliquement un fichier est ultra facile sous Linux, sous windaube je ne sais pas.
En fait, avec un compilateur classique du type GCC, le développeur devrait indiquer au compilateur tous les chemin où se situent les fichier .h et .c de chaque bibliothèque.
Avec l'IDE ARDUINO, l'outil arduino-builder fait tout le boulot pour vous, à partir du moment où lesdites bibliothèques sont situées sous le répertoire "libraries" bien sûr.
Le terme bibliothèque est erroné dans le monde ARDUINO, car une bibliothèque est un ensemble d'objets compilés, réunis dans un fichier unique, portant généralement l'extension .a, ou .so sous LINUX, .lib sous windows.
Dans le monde ARDUINO, rien n'est pré-compilé apparemment.
ARDUINO est fait pour vous simplifier la vie, bande de petits veinards.
Je constate avec plaisir que je ne suis pas le seul linuxien sur ce forum ...