Pointeur arduino
Il ne fait aucun doute que les pointeurs sont l’une des caractéristiques les plus marquantes du langage C et l’une de ses plus grandes forces… et en même temps l’un de ses plus gros problèmes, surtout pour les débutants.
Nous espérons qu’il est maintenant clair pour vous qu’il n’y a rien de si difficile que vous ne puissiez pas apprendre (sérieusement), vous devez juste vous le faire expliquer par quelqu’un qui le comprend un peu (ce qui n’est pas très fréquent) et ensuite y mettre un peu de travail et de volonté.
On dit souvent que tous les langages de programmation ont des outils avec lesquels on peut finir par se tirer dans le pied, mais dans le cas des pointeurs, le truc est plutôt de se faire sauter la jambe et une partie du bras si on est imprudent.
Mettez-vous donc à l’aise car nous allons aborder les pointeurs et cela exige, pour les débutants, une certaine tranquillité d’esprit et une volonté d’apprendre. Mais pour ce faire, nous devons d’abord faire un détour et parler des variables et de la façon dont elles sont stockées en mémoire.
Lorsque nous avons examiné les types de mémoire disponibles dans les différents modèles d’Arduino, nous avons dit que le modèle UNO avait 32k de Flash pour stocker les programmes et 2k de RAM pour stocker les variables.
Chien de garde Arduino
Car est une excellente abréviation pour ces types particulièrement longs et compliqués. Il fonctionne très bien pour définir des exemples répétés!Usage Il y avait plusieurs façons de créer des alias en C++ : L’humble (et dangereux) #define et le moins dangereux typedef. L’utilisation de typedef est préférable à celle de #definition, mais ils présentent quelques problèmes. La première est la lisibilité. Considérons la police de caractères suivante :
Au premier coup d’oeil, surtout si vous n’utilisez pas beaucoup C ++, il peut être difficile de déterminer que ceci crée un alias, fp, c’est un pointeur vers une fonction qui retourne un vide et prend un paramètre int et string. Voyons maintenant le mode C++ 11 :
Maintenant, nous pouvons voir que fp est un alias de quelque chose, et il est un peu plus facile de déterminer qu’il s’agit d’un pointeur de fonction, qui est un alias.La deuxième différence est un peu plus ésotérique, du moins dans la programmation Arduino. Les utilisations peuvent être modélisées, alors que les types ne peuvent pas l’être.NullptrEn C et C++ 98, NULL est en fait défini à 0. Pour être rétrocompatible, le compilateur C++ vous permettra d’initialiser une variable pointeur à 0 ou NULL.Cependant, lorsque vous commencerez à utiliser l’automatique, vous verrez du code comme celui-ci :
Changer le curseur de l’arduino
Comme nous l’avons vu dans “Variables en Arduino”, l’utilisation de variables nous permet de stocker certaines données et d’opérer avec elles tout au long du code de notre projet. Ces données sont stockées à un endroit précis de la mémoire de notre carte contrôleur, c’est-à-dire associées à la variable dont nous pensons avoir un contenu (valeur que nous stockons) et à une adresse mémoire qui nous indique où cette valeur est stockée. Mais, comment pouvons-nous connaître cette adresse ? Pour ce faire, nous utilisons l’opérateur &, qui peut être traduit en langage naturel par “l’adresse de”.
void setup() { Serial.begin(9600);}void loop() { int a = 100 ; Serial.print(“Valeur contenue dans a : “) ; Serial.println(a) ; //imprime la valeur de a Serial.print(“Adresse mémoire de la variable a : “) ; Serial.println((unsigned int)(&a)) ; //imprime l’adresse de a delay(3000);}
Les pointeurs sont un type de variable spécialement préparé pour stocker l’adresse physique d’un objet dans la carte mémoire. Nous pouvons considérer les pointeurs comme un marqueur pointant vers une autre variable (ou un emplacement mémoire), grâce auquel nous pouvons également accéder aux informations stockées à l’emplacement vers lequel pointe le pointeur. C’est pourquoi il est important que le pointeur que nous déclarons soit du même type que la variable qu’il pointera. Attendez une minute, comment les pointeurs sont-ils déclarés ?
Communication arduino tcp/ip
s = * ptr ; // s est maintenant aussi 24 (lu dans & b)Cela ne semble rien de compliqué : j’ai créé un pointeur de ptr en byte, c’est-à-dire byte * ptr et j’y ai écrit l’adresse de la variable b : ptr = & b… Maintenant nous avons accès sur la variable b, à travers le pointeur de ptr, nous pouvons changer sa valeur de cette façon : * ptr = valeur;Essayons de passer une adresse à une fonction et de changer la valeur d’une variable par son adresse à l’intérieur de la fonction. Prenons une fonction qui prend l’adresse d’une variable de type int et élève cette variable au carré. void square(int* val) {
// ici la valeur est déjà == 49Pourquoi cette approche est-elle bonne ? Nous ne créons pas une copie de la variable, comme nous l’avons fait dans la leçon sur les fonctions, nous passons l’adresse et changeons les valeurs directement. Voici ce dont je parle : void setup () {
Ici, nous créons une copie de la variable en RAM, nous interagissons avec cette copie, puis nous la renvoyons et l’assignons.Ce code s’exécute beaucoup plus lentement ! Les pointeurs de tableaux en Arduino.Nous avons eu une leçon séparée sur les tableaux, et là, je ne vous ai pas accablé en vous disant “d’où viennent les tableaux”, parce que les tableaux sont en fait un pointeur et ses amis.Qu’est-ce qu’un tableau en général, et comment fonctionne-t-il ? Le nom du tableau est un pointeur vers le premier élément de ce tableau (nous définissons le type d’élément lors de la déclaration du tableau), c’est-à-dire : montableau [ 0 ] == * montableau, ou comme ceci : montableau == & montableau [ 0 ]… Pour faciliter l’écriture et la lecture du code, des crochets sont introduits, mais en fait cela fonctionne comme ceci : a [ b ] == * ( a + b ) ! Un tableau est une zone de la mémoire remplie de “variables” du type spécifié, et nous pouvons nous y référer. Voici quelques exemples de la façon de travailler avec un tableau sans utiliser de crochets:void setup() {