diff --git a/slides/tableaux_fonctions.md b/slides/tableaux_fonctions.md new file mode 100644 index 0000000000000000000000000000000000000000..55a9845b5a99ce94dc0fd64ae25dea6635ff37fc --- /dev/null +++ b/slides/tableaux_fonctions.md @@ -0,0 +1,213 @@ +--- +title: "Tableaux et fonctions" +date: "2021-10-05" +patat: + wrap: true + margins: + left: 10 + right: 10 +--- + +# Les tableaux statiques + +## Qu'est-ce qu'un tableau statique? + +. . . + +* Une **liste** ou un **ensemble** + +. . . + +* d'éléments du **même type** + +. . . + +* alloués de façon **contigüe** (en bloc) en mémoire + +. . . + +* sur la **pile** + +. . . + +* dont la taille **ne peut pas** être changée. + +. . . + +## Remarques + +- Les éléments d’un tableau sont accédés avec `[i]`{.C} où `i`{.C} est l’index de l’élément. +- Le premier élément du tableau à l’index `0`{.C}! +- Lorsqu’un tableau est déclaré, la taille de celui-ci doit toujours être spécifiée, sauf s’il est initialisé lors de sa déclaration. +- Un tableau local à une fonction ne doit **jamais être retourné**! + +# Syntaxe des tableaux + +```C +float tab1[5]; // tableau de floats à 5 éléments + // ses valeurs sont indéfinies + +int tab2[] = {1, 2, 3}; // tableau de 3 entiers, + // taille inférée + +int val = tab2[1]; // val vaut 2 à présent + +int w = tab1[5]; // index hors des limites du tableau + // comportement indéfini! + // pas d'erreur du compilateur +``` + +<!-- TODO QUIZ: + +```C +int a1[5]; // OK +int a2[] = { 1, 2, 3 }; // OK +int a3[4][5]; // OK +int [] a4; // Erreur +int a5[]; // Erreur + +int[] function(void) { // Erreur + int array[5]; // OK + return array; // Erreur +} + +void foo(int a[]) { // OK + a[3] = 0; // OK +} + +void bar(void) { + int a[5]; // OK + foo(a); // OK + a = a[5]; // Erreur +} +``` --> + +<!-- ```C +#include <stdio.h> + +int main(void) { + char i; + char a1[] = { 100,200,300,400,500 }; + char a2[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; + a2[10] = 42; + + for (i = 0; i < 5; i++) { + printf("a1[%d] = %d\n", i, a1[i]); + } + + return 0; +} +``` --> + +# Itérer sur les éléments d'un tableau + +```C +int x[10]; +for (int i = 0; i < 10; ++i) { + x[i] = 0; +} +int j = 0; +while (j < 10) { + x[j] = 1; + j += 1; +} +int j = 0; +do { + x[j] = -1; + j += 1; +} while (j < 9) +``` + +# Représentation des tableaux en mémoire + +## La mémoire est : + +- ... contigüe, +- ... accessible très rapidement + +## Exemple: + +```C +char tab[4] = {79, 91, 100, 88}; +``` + ++------+------+------+------+------+------+------+ +| char | 79 | 91 | 100 | 88 | .... | .... | ++======+======+======+======+======+======+======+ +| addr | 2000 | 2001 | 2002 | 2003 | .... | .... | ++------+------+------+------+------+------+------+ + +## Qu'est-ce que `tab`? + +```C +tab; // 2000, l'adress du 1er élément +&tab[0]; // 2000 == tab +tab[0]; // 79 +sizeof(tab); // 4 +``` + +# Les tableaux comme arguments de fonctions + +- Un tableau en argument est le pointeur vers sa première case. +- Pas moyen de connaître sa taille: `sizeof()`{.C} inutile. +- Toujours spécifier la taille d'un tableau passé en argument. + + ```C + void foo(int tab[]) { // équivalent à int *tab + // que vaut sizeof(tab)? + for (int i = 0; i < ?; ++i) { // taille? + printf("tab[%d] = %d\n", i, tab[i]); + } + } + void bar(int n, int tab[n]) { // [n] optionnel + for (int i = 0; i < n; ++i) { + printf("tab[%d] = %d\n", i, tab[i]); + } + } + ``` + +# Quels sont les bugs dans ce code? + +```C +#include <stdio.h> + +int main(void) { + char i; + char a1[] = { 100,200,300,400,500 }; + char a2[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; + a2[10] = 42; + + for (i = 0; i < 5; i++) { + printf("a1[%d] = %d\n", i, a1[i]); + } + + return 0; +} +``` + +# Quels sont les bugs dans ce code? + +```C +#include <stdio.h> + +int main(void) { + char i; + // 200, .., 500 char overflow + char a1[] = { 100,200,300,400,500 }; + char a2[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; + a2[10] = 42; // [10] out of bounds + + for (i = 0; i < 5; i++) { + printf("a1[%d] = %d\n", i, a1[i]); + } + + return 0; +} +``` + +<!-- TODO quiz: --> + +<!-- que retourne sizeof(tab[]) --> + + +