Nouveau tuto sur la mémoire et pointeurs :)

Pour faire plaisir à Zarb94 et leSept (j'espère) et contribuer à la démocratisation des pointeurs j'ai écrit un petit tuto sur l'Introduction à la mémoire et aux pointeurs sur Arduino

si vous vous êtes toujours fait des noeuds au cerveau sur ce sujet, ça pourra vous occuper un peu par ce temps gris et pluvieux :slight_smile:

bonne lecture

Les pointeurs pour les nuls... Merci

Bonsoir J-M-L

Merci pour ce tuto.
Je veux obtenir le contenu d'une adresse absolue ( ex : contenu de l'adresse 0x0200 ).
J'y arrive mais avec une expression très compliquée.

Comment faire au plus simple?
Merci.

Cordialement,
bidouilleelec

bidouilleelec:
Bonsoir J-M-L

Merci pour ce tuto.
Je veux obtenir le contenu d'une adresse absolue ( ex : contenu de l'adresse 0x0200 ).
J'y arrive mais avec une expression très compliquée.

Comment faire au plus simple?
Merci.

Cordialement,
bidouilleelec

Comme expliqué un pointeur doit avoir un type de données pointée et se note avec une étoile; Donc si vous avez un long par exemple qui commence à l'adresse 0x0200 vous pourriez écrire

long* ptr = (long*) 0x0200;

pour être un peu plus précis, comme on sait qu'une adresse est un uint16_t sur nos arduinos, pour s'assurer que c'est ce que le compilateur prendra on pourrait écrire

long* ptr = (long*) ((uint16_t) 0x0200);

Voici un exemple que vous pouvez essayer.

int t[2] = {22, 33};
int* xPtr1 = t;
int* xPtr2;

void setup() {
  Serial.begin(115200);
  Serial.print(F("Adresse de t[0] = ")); Serial.println((uint16_t) xPtr1);
 // xPtr2 = (int*) ((uint16_t) 514);
 //  Serial.print(F("contenu t[1] = ")); Serial.println(*xPtr2);
}

void loop() {}

faites tourner une fois ce code et regardez l'adresse du tableau. Sur mon MEGA ça dit 512. donc ensuite enlevez les commentaires, ajoutez 2 à cette adresse (la longueur d'un int) et mettez ça dans xPtr2.
vous verrez alors dans le printf la valeur 33 - on aura pointé physiquement sur la bonne case mémoire

Merci J-M-L pour cet excellent tuto. Peut-être que tu peux ajouter un ou deux exemples concrets, voire classiques, pour lesquels les pointeurs sont incontournables ? Ou du moins utiles.

Ma difficulté avec les pointeurs vient je pense du fait que je n'ai que rarement l'occasion de les utiliser, donc j'oublie à chaque fois ce que j'ai appris la dernière fois.

J'ai eu le cas aujourd'hui pour la modification du contenu d'un tableau par une fonction. Et j'ai ramé...

+1 :slight_smile:
merci JML

lesept:
Merci J-M-L pour cet excellent tuto. Peut-être que tu peux ajouter un ou deux exemples concrets, voire classiques, pour lesquels les pointeurs sont incontournables ? Ou du moins utiles.

bonne idée

voici un exemple que je rajouterai là bas

int tableau[] = {1, 2, 3, 4, 5};
const size_t taille = sizeof(tableau) / sizeof(tableau[0]);

void plus10(int* t, int tailleDuTableau)
{
  for (int i = 0; i < tailleDuTableau; i++)
    *(t + i) = *(t + i) + 10;
}

void imprimeTableau(int* t, int tailleDuTableau)
{
  for (int i = 0; i < tailleDuTableau; i++) Serial.println(*(t + i));
  Serial.println("----");
}

void setup() {
  Serial.begin(115200);
  imprimeTableau(tableau, taille);

  plus10(tableau, taille);
  imprimeTableau(tableau, taille );

  plus10(tableau, taille);
  imprimeTableau(tableau, taille);
}

void loop() {}

la console dira

[color=purple]
1
2
3
4
5
----
11
12
13
14
15
----
21
22
23
24
25
----
[/color]

super ça, merci beaucoup !

De rien :slight_smile: