Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
wiki:tutoriels:arduino:manipuler-un-tableau-en-c [2021/06/01 16:47] damien.muti |
wiki:tutoriels:arduino:manipuler-un-tableau-en-c [2024/06/06 09:34] (Version actuelle) damien.muti [Version 3] |
||
---|---|---|---|
Ligne 19: | Ligne 19: | ||
===== Exemples d' | ===== Exemples d' | ||
==== Création et initialisation d'un tableau ==== | ==== Création et initialisation d'un tableau ==== | ||
+ | Méthode directe : | ||
< | < | ||
int tableau[4]; | int tableau[4]; | ||
Ligne 27: | Ligne 28: | ||
tableau[3] = 8; | tableau[3] = 8; | ||
</ | </ | ||
+ | |||
+ | autre méthode: | ||
+ | < | ||
+ | int taille = 5; | ||
+ | int tableau[taille]; | ||
+ | </ | ||
+ | |||
+ | Initialiser un tableau - méthode directe: | ||
+ | < | ||
+ | int tableau[4], i = 0; | ||
+ | |||
+ | // Initialisation du tableau | ||
+ | for (i = 0 ; i < 4 ; i++) | ||
+ | { | ||
+ | tableau[i] = 0; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Initialiser un tableau - méthode rapide : | ||
+ | < | ||
+ | |||
+ | int tableau[4] = {0, 0, 0, 0}; | ||
+ | |||
+ | </ | ||
+ | ou | ||
+ | < | ||
+ | int tableau[4] = {10, 23}; // Valeurs insérées : 10, 23, 0, 0 | ||
+ | </ | ||
+ | ou | ||
+ | < | ||
+ | int tableau[4] = {0}; // Toutes les cases du tableau seront initialisées à 0 | ||
+ | </ | ||
+ | |||
+ | ==== Allocation dynamique d'un tableau ==== | ||
+ | Toutes les explications sur l' | ||
+ | |||
+ | Il faut utiliser la fonction: | ||
+ | * // | ||
+ | |||
+ | En résumé : | ||
+ | |||
+ | __**Déclaration du tableau (entiers)**__: | ||
+ | |||
+ | < | ||
+ | int* tableau = NULL; // Ce pointeur va servir de tableau après l' | ||
+ | </ | ||
+ | |||
+ | __**Création du tableau (entiers)**__: | ||
+ | En supposant que // | ||
+ | < | ||
+ | tableau = = malloc(tailleDuTableau * sizeof(int)); | ||
+ | </ | ||
+ | |||
+ | __**Initialisation du tableau (entiers)**__: | ||
+ | < | ||
+ | for (i = 0 ; i < nombreDAmis ; i++){ | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Le programme total est le suivant : | ||
+ | |||
+ | < | ||
+ | int main(int argc, char *argv[]) | ||
+ | { | ||
+ | int nombreDAmis = 0, i = 0; | ||
+ | int* ageAmis = NULL; // Ce pointeur va servir de tableau après l' | ||
+ | |||
+ | // On demande le nombre d'amis à l' | ||
+ | printf(" | ||
+ | scanf(" | ||
+ | |||
+ | if (nombreDAmis > 0) // Il faut qu'il ait au moins un ami (je le plains un peu sinon :p) | ||
+ | { | ||
+ | ageAmis = malloc(nombreDAmis * sizeof(int)); | ||
+ | if (ageAmis == NULL) // On vérifie si l' | ||
+ | { | ||
+ | exit(0); // On arrête tout | ||
+ | } | ||
+ | |||
+ | // On demande l'âge des amis un à un | ||
+ | for (i = 0 ; i < nombreDAmis ; i++) | ||
+ | { | ||
+ | printf(" | ||
+ | scanf(" | ||
+ | } | ||
+ | |||
+ | // On affiche les âges stockés un à un | ||
+ | printf(" | ||
+ | for (i = 0 ; i < nombreDAmis ; i++) | ||
+ | { | ||
+ | printf(" | ||
+ | } | ||
+ | |||
+ | // On libère la mémoire allouée avec malloc, on n'en a plus besoin | ||
+ | free(ageAmis); | ||
+ | } | ||
+ | |||
+ | return 0; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Passage de tableaux à une fonction ==== | ||
+ | |||
+ | Pour envoyer en paramètre d' | ||
+ | |||
+ | La fonction doit être capable d' | ||
+ | |||
+ | La variable //tableau// peut en fait être considérée comme un pointeur (une référence sur une adresse en mémoire de l' | ||
+ | |||
+ | < | ||
+ | // Prototype de la fonction d' | ||
+ | void affiche(int *tableau, int tailleTableau); | ||
+ | |||
+ | int main(int argc, char *argv[]) | ||
+ | { | ||
+ | int tableau[4] = {10, 15, 3}; | ||
+ | |||
+ | // On affiche le contenu du tableau | ||
+ | affiche(tableau, | ||
+ | |||
+ | return 0; | ||
+ | } | ||
+ | |||
+ | void affiche(int *tableau, int tailleTableau) | ||
+ | { | ||
+ | int i; | ||
+ | |||
+ | for (i = 0 ; i < tailleTableau ; i++) | ||
+ | { | ||
+ | printf(" | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | On peut aussi utiliser la syntaxe suivante : | ||
+ | < | ||
+ | void affiche(int tableau[], int tailleTableau) | ||
+ | </ | ||
+ | |||
+ | ===== Enregistrement de données et calcul de moyenne ===== | ||
+ | |||
+ | La mesure d'une valeur issue d'un capteur peut être affectée par du bruit, ce qui entraîne des variations significatives autour d'une valeur moyenne. Pour atténuer cet effet, il est utile de conserver les N dernières mesures et d'en calculer la moyenne. | ||
+ | |||
+ | |||
+ | Lorsqu' | ||
+ | |||
+ | ==== Version 1 ==== | ||
+ | |||
+ | < | ||
+ | float *tab_mesures; | ||
+ | #define NB_MOYENNE 20 | ||
+ | float moy = 1.0; | ||
+ | |||
+ | void mettreAJourTableau(float nouvelleValeur) { | ||
+ | // Décaler les valeurs vers la gauche | ||
+ | for (int i = 0; i < NB_MOYENNE - 1; i++) { | ||
+ | tab_mesures[i] = tab_mesures[i + 1]; | ||
+ | } | ||
+ | // Ajouter la nouvelle valeur à la fin du tableau | ||
+ | tab_mesures[NB_MOYENNE - 1] = nouvelleValeur; | ||
+ | } | ||
+ | |||
+ | float calculerMoyenne() { | ||
+ | float somme = 0; | ||
+ | for (int i = 0; i < NB_MOYENNE; i++) { | ||
+ | somme += tab_mesures[i]; | ||
+ | } | ||
+ | float moyenne = somme / NB_MOYENNE; | ||
+ | return moyenne; | ||
+ | } | ||
+ | |||
+ | |||
+ | void setup(){ | ||
+ | // création du tableau de mesures des volumes du micros (volts) | ||
+ | tab_mesures = (float *)malloc(sizeof(float) * NB_MOYENNE); | ||
+ | // initialisation du tableau de moyenne | ||
+ | for (int i = 0; i < NB_MOYENNE; i++) { | ||
+ | tab_mesures[i] = 1.5; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void loop(){ | ||
+ | int mesure = analogRead(A0); | ||
+ | mettreAJourTableau(mesure); | ||
+ | float moy = calculerMoyenne(); | ||
+ | Serial.println(moy); | ||
+ | |||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Version 2 ==== | ||
+ | |||
+ | < | ||
+ | const int N_moy = 10; // Taille du tableau | ||
+ | int valeurs[N_moy]; | ||
+ | |||
+ | void setup() { | ||
+ | Serial.begin(9600); | ||
+ | for (int i = 0; i < N_moy; i++) { | ||
+ | valeurs[i] = 0; // Initialisation du tableau à 0 | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | int valeur_lue = lireCapteur(); | ||
+ | mettreAJourTableau(valeur_lue, | ||
+ | float moyenne = calculerMoyenne(valeurs); | ||
+ | Serial.print(" | ||
+ | Serial.println(moyenne); | ||
+ | | ||
+ | delay(1000); | ||
+ | } | ||
+ | |||
+ | int lireCapteur() { | ||
+ | // Remplacez ceci par le code pour lire votre capteur digital | ||
+ | // Exemple : int valeur = digitalRead(pinDuCapteur); | ||
+ | int valeur = random(0, 1023); | ||
+ | return valeur; | ||
+ | } | ||
+ | |||
+ | void mettreAJourTableau(int nouvelleValeur, | ||
+ | // Décaler les valeurs vers la gauche | ||
+ | for (int i = 0; i < N_moy - 1; i++) { | ||
+ | tableau[i] = tableau[i + 1]; | ||
+ | } | ||
+ | // Ajouter la nouvelle valeur à la fin du tableau | ||
+ | tableau[N_moy - 1] = nouvelleValeur; | ||
+ | } | ||
+ | |||
+ | float calculerMoyenne(int tableau[]) { | ||
+ | int somme = 0; | ||
+ | for (int i = 0; i < N_moy; i++) { | ||
+ | somme += tableau[i]; | ||
+ | } | ||
+ | return (float)somme / N_moy; | ||
+ | } | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | ==== Version 3 ==== | ||
+ | |||
+ | < | ||
+ | const int N_moy = 10; // Taille du tableau | ||
+ | int valeurs[N_moy]; | ||
+ | |||
+ | void setup() { | ||
+ | Serial.begin(9600); | ||
+ | for (int i = 0; i < N_moy; i++) { | ||
+ | valeurs[i] = 0; // Initialisation du tableau à 0 | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | int valeur_lue = lireCapteur(); | ||
+ | mettreAJourTableau(valeur_lue, | ||
+ | float moyenne = calculerMoyenne(valeurs); | ||
+ | Serial.print(" | ||
+ | Serial.println(moyenne); | ||
+ | | ||
+ | delay(1000); | ||
+ | } | ||
+ | |||
+ | int lireCapteur() { | ||
+ | // Remplacez ceci par le code pour lire votre capteur digital | ||
+ | // Exemple : int valeur = digitalRead(pinDuCapteur); | ||
+ | int valeur = random(0, 1023); | ||
+ | return valeur; | ||
+ | } | ||
+ | |||
+ | void mettreAJourTableau(int nouvelleValeur, | ||
+ | // Décaler les valeurs vers la gauche | ||
+ | for (int i = 0; i < N_moy - 1; i++) { | ||
+ | tableau[i] = tableau[i + 1]; | ||
+ | } | ||
+ | // Ajouter la nouvelle valeur à la fin du tableau | ||
+ | tableau[N_moy - 1] = nouvelleValeur; | ||
+ | } | ||
+ | |||
+ | float calculerMoyenne(int *tableau) { | ||
+ | int somme = 0; | ||
+ | for (int i = 0; i < N_moy; i++) { | ||
+ | somme += tableau[i]; | ||
+ | } | ||
+ | return (float)somme / N_moy; | ||
+ | } | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | ==== Détails Techniques ==== | ||
+ | |||
+ | **Tableaux et Pointeurs en C/C++** : Lorsque vous passez un tableau à une fonction, vous passez en fait un pointeur vers le premier élément du tableau. Ainsi, int tableau[] et int *tableau sont équivalents dans le contexte des paramètres de fonction. Les deux notations permettent à la fonction de modifier les éléments du tableau original. | ||
+ | |||
+ | |||
+ | **Accès aux éléments** : Vous pouvez accéder aux éléments du tableau en utilisant l' | ||
+ | |||
+ | |||
+ | En résumé, vous pouvez utiliser l'une ou l' |