From f0314e1c54bb5469341de49199304f876aa9bcbd Mon Sep 17 00:00:00 2001
From: Orestis <orestis.malaspinas@pm.me>
Date: Mon, 11 Oct 2021 22:19:05 +0200
Subject: [PATCH] ajout slides tableaux/fonctions

---
 slides/tableaux_fonctions.md | 213 +++++++++++++++++++++++++++++++++++
 1 file changed, 213 insertions(+)
 create mode 100644 slides/tableaux_fonctions.md

diff --git a/slides/tableaux_fonctions.md b/slides/tableaux_fonctions.md
new file mode 100644
index 0000000..55a9845
--- /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[]) -->
+
+
+
-- 
GitLab