j'ai besoin d'aide. Ça fait un bout que je cherche, j'ai compris des choses, mais il m'en reste encore a saisir
Je travail sur un projet pour contrôler de la console de mon bateau de pêche sportive, un petit moteur de 4 hp, ( contrôler la vitesse & le sens de rotation de l'hélice ).
La partie mécanique est très avancé et je commence bâtir le programme qui va aller dans un Mega 2560.
je vais utiliser 15 broches donc 5 analogiques et tout le mécanisme et électronique va loger sous le capot du petit moteur. Donc le tout est assez miniaturiser.
La je cherche depuis 3 a 4 jours de quel façon je peux me servir de pointeurs pour appeler des procédures sans succès.
Merci a la communauté
idorual
struct
{
int MaVariableS = 10;
}a;
int MaVariable = 5;
int *pMonPointeurMaVariable = &MaVariable;
void (*pMaProcedure)(void);
/* Je cherche la faute de syntaxe ou de logique
occasionnant l'erreur suivante pour la ligne ci-dessous.
En compilan: 'pMaProcedure' does not name a type
La version de l'ide est la 1.8.9 */
pMaProcedure = &Procedure;
void loop() {
*pMaProcedure;
}
void Procedure()
{
(*pMonPointeurMaVariable) = (*pMonPointeurMaVariable) + (*pMaVariableS);
}
Arduino:1.8.9 (Windows 7), Carte : "Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)"
C:\Program Files (x86)\arduinoide\arduino-1.8.9\arduino-builder -dump-prefs -logger=machine -hardware C:\Program Files (x86)\arduinoide\arduino-1.8.9\hardware -tools C:\Program Files (x86)\arduinoide\arduino-1.8.9\tools-builder -tools C:\Program Files (x86)\arduinoide\arduino-1.8.9\hardware\tools\avr -built-in-libraries C:\Program Files (x86)\arduinoide\arduino-1.8.9\libraries -libraries C:\Users\cricri\Documents\Arduino\libraries -fqbn=arduino:avr:mega:cpu=atmega2560 -vid-pid=1A86_7523 -ide-version=10809 -build-path C:\Users\cricri\AppData\Local\Temp\arduino_build_882368 -warnings=default -build-cache C:\Users\cricri\AppData\Local\Temp\arduino_cache_406596 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.arduinoOTA.path=C:\Program Files (x86)\arduinoide\arduino-1.8.9\hardware\tools\avr -prefs=runtime.tools.arduinoOTA-1.2.1.path=C:\Program Files (x86)\arduinoide\arduino-1.8.9\hardware\tools\avr -prefs=runtime.tools.avrdude.path=C:\Program Files (x86)\arduinoide\arduino-1.8.9\hardware\tools\avr -prefs=runtime.tools.avrdude-6.3.0-arduino14.path=C:\Program Files (x86)\arduinoide\arduino-1.8.9\hardware\tools\avr -prefs=runtime.tools.avr-gcc.path=C:\Program Files (x86)\arduinoide\arduino-1.8.9\hardware\tools\avr -prefs=runtime.tools.avr-gcc-5.4.0-atmel3.6.1-arduino2.path=C:\Program Files (x86)\arduinoide\arduino-1.8.9\hardware\tools\avr -verbose C:\Users\cricri\Documents\Arduino\sketch_may10a\sketch_may10a.ino
C:\Program Files (x86)\arduinoide\arduino-1.8.9\arduino-builder -compile -logger=machine -hardware C:\Program Files (x86)\arduinoide\arduino-1.8.9\hardware -tools C:\Program Files (x86)\arduinoide\arduino-1.8.9\tools-builder -tools C:\Program Files (x86)\arduinoide\arduino-1.8.9\hardware\tools\avr -built-in-libraries C:\Program Files (x86)\arduinoide\arduino-1.8.9\libraries -libraries C:\Users\cricri\Documents\Arduino\libraries -fqbn=arduino:avr:mega:cpu=atmega2560 -vid-pid=1A86_7523 -ide-version=10809 -build-path C:\Users\cricri\AppData\Local\Temp\arduino_build_882368 -warnings=default -build-cache C:\Users\cricri\AppData\Local\Temp\arduino_cache_406596 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.arduinoOTA.path=C:\Program Files (x86)\arduinoide\arduino-1.8.9\hardware\tools\avr -prefs=runtime.tools.arduinoOTA-1.2.1.path=C:\Program Files (x86)\arduinoide\arduino-1.8.9\hardware\tools\avr -prefs=runtime.tools.avrdude.path=C:\Program Files (x86)\arduinoide\arduino-1.8.9\hardware\tools\avr -prefs=runtime.tools.avrdude-6.3.0-arduino14.path=C:\Program Files (x86)\arduinoide\arduino-1.8.9\hardware\tools\avr -prefs=runtime.tools.avr-gcc.path=C:\Program Files (x86)\arduinoide\arduino-1.8.9\hardware\tools\avr -prefs=runtime.tools.avr-gcc-5.4.0-atmel3.6.1-arduino2.path=C:\Program Files (x86)\arduinoide\arduino-1.8.9\hardware\tools\avr -verbose C:\Users\cricri\Documents\Arduino\sketch_may10a\sketch_may10a.ino
Using board 'mega' from platform in folder: C:\Program Files (x86)\arduinoide\arduino-1.8.9\hardware\arduino\avr
Using core 'arduino' from platform in folder: C:\Program Files (x86)\arduinoide\arduino-1.8.9\hardware\arduino\avr
Detecting libraries used...
"C:\\Program Files (x86)\\arduinoide\\arduino-1.8.9\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10809 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR "-IC:\\Program Files (x86)\\arduinoide\\arduino-1.8.9\\hardware\\arduino\\avr\\cores\\arduino" "-IC:\\Program Files (x86)\\arduinoide\\arduino-1.8.9\\hardware\\arduino\\avr\\variants\\mega" "C:\\Users\\cricri\\AppData\\Local\\Temp\\arduino_build_882368\\sketch\\sketch_may10a.ino.cpp" -o nul
Generating function prototypes...
"C:\\Program Files (x86)\\arduinoide\\arduino-1.8.9\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10809 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR "-IC:\\Program Files (x86)\\arduinoide\\arduino-1.8.9\\hardware\\arduino\\avr\\cores\\arduino" "-IC:\\Program Files (x86)\\arduinoide\\arduino-1.8.9\\hardware\\arduino\\avr\\variants\\mega" "C:\\Users\\cricri\\AppData\\Local\\Temp\\arduino_build_882368\\sketch\\sketch_may10a.ino.cpp" -o "C:\\Users\\cricri\\AppData\\Local\\Temp\\arduino_build_882368\\preproc\\ctags_target_for_gcc_minus_e.cpp"
"C:\\Program Files (x86)\\arduinoide\\arduino-1.8.9\\tools-builder\\ctags\\5.8-arduino11/ctags" -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives "C:\\Users\\cricri\\AppData\\Local\\Temp\\arduino_build_882368\\preproc\\ctags_target_for_gcc_minus_e.cpp"
Compilation du croquis...
"C:\\Program Files (x86)\\arduinoide\\arduino-1.8.9\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10809 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR "-IC:\\Program Files (x86)\\arduinoide\\arduino-1.8.9\\hardware\\arduino\\avr\\cores\\arduino" "-IC:\\Program Files (x86)\\arduinoide\\arduino-1.8.9\\hardware\\arduino\\avr\\variants\\mega" "C:\\Users\\cricri\\AppData\\Local\\Temp\\arduino_build_882368\\sketch\\sketch_may10a.ino.cpp" -o "C:\\Users\\cricri\\AppData\\Local\\Temp\\arduino_build_882368\\sketch\\sketch_may10a.ino.cpp.o"
sketch_may10a:15:6: error: 'pMaProcedure' does not name a type
pMaProcedure = &Procedure;
^
C:\Users\cricri\Documents\Arduino\sketch_may10a\sketch_may10a.ino: In function 'void Procedure()':
sketch_may10a:22:65: error: 'pMaVariableS' was not declared in this scope
(*pMonPointeurMaVariable) = (*pMonPointeurMaVariable) + (*pMaVariableS);
^
exit status 1
'pMaProcedure' does not name a type
Vous devez soit initialiser le pointeur au moment de sa déclaration (ce qu'on appelle la définition), soit si vous voulez l'affecter ensuite, il s'agit alors d'un bout de code et cela doit se faire au sein d'une fonction (un bout de code qui va s'exécuter).
N'oubliez pas non plus que la définition de la fonction (ou la déclaration de son prototype) doit précéder son utilisation. Il faut donc que la fonction soit AVANT dans le code (même si l'IDE fait des manip sans vous le dire sur le code pour vous aider, vaut mieux prendre de bonnes habitudes)
donc soit vous écrivez (en affectant dans le setup() le pointeur)
Merci beaucoup d'avoir pris le temps d'éplucher la problématique de mon code.
Bravo ,ton explication et tes conseils ont été pertinents. j'ai compris la logique, j'ai fait le changement et à la suite, tout a compilé à merveille .
Je suis très reconnaissant. Ce sont des gens comme toi, beaucoup plus expérimentés qui nous encouragent à persister .
j'ai une question qui me fait bien rocher. De quel type on déclare un pointeur qui doit pointer vers le nom d'une structure.
exemple:
struct u
{
byte variable = 10;
}a;
(Type?) *Pointeur = a;
J'ai essayer plusieurs façons tout en analysant les messages d'erreur, mais sans avoir trouver. je serais aux anges si tu me mettrais sur une piste de solution.
si vous avez un type T, alors un pointeur vers un élément de ce type sera de type T[color=red]*[/color]
voici un exemple
struct element_t {
char code;
uint32_t distance;
};
element_t unElement = {'x', 512};
element_t* unPointeurSurElement = &unElement;
void setup()
{
Serial.begin(115200);
// la variable en direct
Serial.print(unElement.code);
Serial.print(", ");
Serial.println(unElement.distance);
// la variable à travers le pointeur
Serial.print(unPointeurSurElement->code);
Serial.print(", ");
Serial.println(unPointeurSurElement->distance);
}
void loop() {}
element_t c'est le type de la structure. donc pour déclarer (et définir) un exemplaire de ce type on va écrireelement_t unElement = {'x', 512};et pour déclarer (et définir) un pointeur vers ce type on va écrireelement_t* unPointeurSurElement = &unElement;
si vous faites tourner le code, vous verrez qu'on accède aux mêmes données en direct ou par le pointeur. Seule la syntaxe d'accès change bien sûr
j'ai un autre problème; de surchauffe... je parle de intellectuellement .
Cette fois je ne comprend pas...
j'ai fais une exemple simple, avec une variable int.
exemple:
/*----------------------
Déclaration variable */
int a;
/* Affectation valeur /
a = 1;
/----------------------*/
Pourtant, la syntaxe sur une variable c'est supposé être simple....????!!!!!
Mais je n'arrive pas a satisfaire le compilateur. Toujours une erreur à la compilation.
L'ide Arduino est le 1.8.9.
Nom programme du compilateur + l'erreur: 'avr-g++' "error: 'a' does not name a type" + " a = 1 " + "exit status 1" + " 'a' does not a type"
Pour vous qui avez beaucoup d’expérience, il y a sans doute une explication simple, pour moi la tète est à la veille de me sauter.
Je veux comprendre et apprendre, pour continuer mon projet.
j'ai un autre problème; de surchauffe... je parle de intellectuellement .
Cette fois je ne comprend pas...
j'ai fais une exemple simple, avec une variable int.
exemple:
/*----------------------
Déclaration variable */
int a;
/* Affectation valeur /
a = 1;
/----------------------*/
Nom programme du compilateur + l'erreur: 'avr-g++' "error: 'a' does not name a type" + " a = 1 " + "exit status 1" + " 'a' does not a type"
Il FAUT poster TOUT le code.
C'est probablement parceque a n'est pas globale et n'est pas déclarée au bon endroit, donc invisible là où elle est utilisée.
La déclaration de la variable (son nom et son type) on peut faire ça « où on veut »
la définition de la variable (le compilateur va réserver la mémoire et affecter une valeur) ne peut se faire qu’au moment de la déclaration. Si on veut le faire en deux fois, il faut mettre l’affectation Dans une fonction, le setup par exemple
Donc soit (EDITED)
int a = 1; // déclaration, définition et initialisation en même temps
ou alors
int a; // déclaration seule en variable globale, visible dans toutes les fonctions ci dessous et initialisation car les variables globales numériques sont mises à 0
void setup()
{
a = 1; // affectation à l’exécution
}
void loop() {}
suivant où on déclare la variable, on ne peut pas l'utiliser de la même manière (scope)
void setup()
{
int a; // variable locale à la fonction setup, disparait ensuite et n'est pas accessible par la loop() par exemple
a = 1; // initialisation à l’exécution car une variable locale n'est pas initialisée automatiquement
// on aurait aussi pu tout faire d'un coup int a = 1;
}
void loop() {}
déclarer c'est dire au compilateur le type et le nom de la variableextern int toto; // déclaration de l'existence de toto
On peut aussi déclarer et (tenter de) réserver la mémoire int toto; // déclaration de l'existence de toto(la mémoire sera vraiment allouée plus tard après les phases d'optimisation de code)
dans ce cas (à moins d'une variable globale et la règle qu'elles seront initialisée à 0) toto pour moi n'est pas défini, il peut prendre n'importe quelle valeur. (mais on pourrait dire pas initialisé)
la définition c'est donner sa valeur initiale (remplir la case mémoire) (donc initialiser)
Mais il y a d'autres interprétations qui disent que définir, c'est juste quand on a vraiment le type et la mémoire identifiée... et effectivement ensuite on emploie affectation ou initialization.
Question de convention... vous n'avez pas tort non plus, je peux être aussi d'accord avec votre façon de décrire les choses
après réflexion - vous m'avez convaincu, je propose
déclarer = Une déclaration introduit un identifiant et décrit son type (un objet, a type de base, une fonction,...) Une déclaration est ce dont le compilateur a besoin pour accepter ensuite des références à cet identifiant.
définir = c'est l'instantiatoin/l'allocation de la mémoire pour cet identifiant. C'est ce dont le linker a besoin pour connecter les références à cet identifiant et la mémoire concernée.
On peut déclarer une variable autant de fois qu'on le veut mais on ne peut la définir qu'une seule fois
initialiser = (pour une variable) première valeur mise dans la case mémoire
Bonjour à tous ... oufff j'ai provoquer un tsunami d'explications. je vous en remercie tous et tout est tellement pertinent.
Je vient d'allumer... sur l'énoncé, à savoir qu'une variable déclarer au début d'un programme ne peux être employer à d'autre endroit que dans des procédures ou des fonctions. je n'avait pas saisi cela pour l'arduino, mais la c'est.. a vie .
je vais m'en rappeler.. j'ai tellement chercher ouff merci beaucoup...
Dire que des fois ça ne prend pas grand chose pour se remettre sur les rails.
Tout ça pour vous dire que vous êtres très utile.
Je vais retourné a mon casse tête tout en sachant que j'ai beaucoup de béquilles en ca de besoin
Merci J-M-L
Tu as une très bonne façon intellectuel de décrire les étapes d'une Variable passant au travers les dédales du compilateur. En te relisant, relisant et relisant mainte fois , Ça donne une occasion au néophyte comme moi de se familiariser et de pouvoir comprendre la façon d'harmoniser l'ordre, l'emplacement, comment procédé pour créé et se servir de diverses variables rattaché aux taches d'un programme.
Vous êtes très utile a la communauté, j'apprécie beaucoup
idorual:
En bon Québéquoi, je dirai que 'vous êtes vite sul piton' c'est super !!! merci les gars.
vous me pousser sur le droit chemin 'au rythme grand V'. J'apprécié grandement.
Me reste a faire mes devoirs, mais j'y vais avec enthousiasme. Je vous tien au courant..
Hmmmmm, n'oublie pas tes devoirs de français, aussi...