====== MANIPULER UN TABLEAU EN C ====== * Auteur : Damien MUTI DESGROUAS * Date : 01/06/2021 * Licence : libre ! * Contexte : Apprentissage * Fichiers : liens éventuels ===== Présentation ===== Il est très utile de manipuler des tableaux (ou listes) en langage C (celui d'Arduino). Cela permet d'automatisation de la manipulation des données. Par exemple, si on souhaite manipuler une grille de LED, ou plusieurs servomoteurs, etc. ===== Références et tutoriels ===== Les tutoriels suivants sont très explicite sur la déclaration, l'initialisation et la manipulatioon des tableaux en C : * OpenClassrooms - Les bases : [[https://openclassrooms.com/fr/courses/19980-apprenez-a-programmer-en-c/15540-les-tableaux|Les Tableaux | les bases sur les tableaux]] * OpenClassrooms -Allocation dynamique d'un tableau : [[https://openclassrooms.com/fr/courses/19980-apprenez-a-programmer-en-c/16595-lallocation-dynamique|Allocation dynamique d'un tableau]] * Développement Informatique : [[https://developpement-informatique.com/article/276/pointeurs-et-tableaux-en-langage-c|Pointeurs et tableaux]] ===== Exemples d'utilisation ===== ==== Création et initialisation d'un tableau ==== Méthode directe : int tableau[4]; tableau[0] = 10; tableau[1] = 23; tableau[2] = 505; 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'allocation dynamique d'un tableau sont sur le lien suivant : [[https://openclassrooms.com/fr/courses/19980-apprenez-a-programmer-en-c/16595-lallocation-dynamique|Openclassrooms]]. Il faut utiliser la fonction: * //malloc(sizeof(type))// En résumé : __**Déclaration du tableau (entiers)**__: int* tableau = NULL; // Ce pointeur va servir de tableau après l'appel du malloc __**Création du tableau (entiers)**__: En supposant que //talleDuTableau// ait été défini : tableau = = malloc(talleDuTableau * sizeof(int)); // On alloue de la mémoire pour le tableau; __**Initialisation du tableau (entiers)**__: for (i = 0 ; i < nombreDAmis ; i++){ tableau[i] = 0; } 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'appel du malloc // On demande le nombre d'amis à l'utilisateur printf("Combien d'amis avez-vous ? "); scanf("%d", &nombreDAmis); if (nombreDAmis > 0) // Il faut qu'il ait au moins un ami (je le plains un peu sinon :p) { ageAmis = malloc(nombreDAmis * sizeof(int)); // On alloue de la mémoire pour le tableau if (ageAmis == NULL) // On vérifie si l'allocation a marché ou non { exit(0); // On arrête tout } // On demande l'âge des amis un à un for (i = 0 ; i < nombreDAmis ; i++) { printf("Quel age a l'ami numero %d ? ", i + 1); scanf("%d", &ageAmis[i]); } // On affiche les âges stockés un à un printf("\n\nVos amis ont les ages suivants :\n"); for (i = 0 ; i < nombreDAmis ; i++) { printf("%d ans\n", ageAmis[i]); } // 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'entrée un tableau en C, il faut envoyer l'adresse du tableau (&tableau) et sa talle (sizeof(tableau)). La fonction doit être capable d'initialiser un tableau de n'importe quelle taille. Or, dans cette fonction, on ne connaît, a priori, pas la taille du tableau en paramètre d'entrée. C'est pour cela qu'il faut envoyer en plus une variable qu'on appelle par "//exempletailleTableau//". 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'ordinateur), on peut donc le passer en paramètre d'entrée de la fonction comme un pointeur. // Prototype de la fonction d'affichage 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, 4); return 0; } void affiche(int *tableau, int tailleTableau) { int i; for (i = 0 ; i < tailleTableau ; i++) { printf("%d\n", tableau[i]); } } On peut aussi utiliser la syntaxe suivante : void affiche(int tableau[], int tailleTableau)