diff --git a/src/assets/Pointer-Diagramm.pdf b/src/assets/Pointer-Diagramm.pdf
new file mode 100644
index 0000000..4b382e2
Binary files /dev/null and b/src/assets/Pointer-Diagramm.pdf differ
diff --git a/src/sp1/hausaufgaben.md b/src/sp1/hausaufgaben.md
new file mode 100644
index 0000000..69f4623
--- /dev/null
+++ b/src/sp1/hausaufgaben.md
@@ -0,0 +1,34 @@
+---
+title: "How-To: Hausaufgaben"
+layout: "blog-post.njk"
+date: 2025-05-05
+---
+Der Ablauf der Bearbeitung einer Aufgabe am Beispiel "Aufgabe 0 - epoche"
+
+1. Aufgaben-Repository erstellen (muss im cip ausgeführt werden)
+```sh
+/proj/i4sp1/bin/mkrepo epoche
+```
+Das Repo ist dann im [Gitlab](https://gitlab.cs.fau.de/) der FAU zu finden zu funden
+
+2. Das Repo clonen (lokal herunterladen). Die URL findet ihr unter dem blauen "Code" button auf dem Repo in Gitlab.
+```sh
+git clone [REPO-URL]
+```
+
+3. Lokale Änderungen durchführen
+
+4. Die Änderungen und neuen Dateien dem lokalen commiten
+```sh
+git add . # Änderungen in den Staging bereich schieben
+git commit -m "[COMMIT_MESSAGE]" # Die Änderungen mit einem deskriptiven kommentar zu einem commit zusammenfasssen
+```
+
+5. Alle commmits zu dem FAU Gitlab pushen (**SEHR WICHTIG**). Es kann nur bewertet werden, was vor der deadline gepushed wurde
+```sh
+git push
+```
+möglicherweise funktioniert das nicht auf anhieb und es muss einmal folgender command ausgeführt werden:
+```sh
+git push --set-upstream origin main
+```
\ No newline at end of file
diff --git a/src/sp1/index.md b/src/sp1/index.md
index bf81322..70fa445 100644
--- a/src/sp1/index.md
+++ b/src/sp1/index.md
@@ -4,14 +4,15 @@ layout: blog-page.njk
page_for: "sp1-lesson"
---
## Meine Übungen
-- Tafelübung (T02) Montags 14:15 - 15:45 im [Seminarraum 0.031-113](https://www.campo.fau.de:443/qisserver/pages/startFlow.xhtml?_flowId=showRoomDetail-flow&roomId=788&roomType=3&context=showRoomDetail&navigationPosition=organisation,searchroom)
+- Tafelübung (T02) Montags 14:15 - 15:45 im [Seminarraum 0.031-113 (Aquarium)](https://www.campo.fau.de:443/qisserver/pages/startFlow.xhtml?_flowId=showRoomDetail-flow&roomId=788&roomType=3&context=showRoomDetail&navigationPosition=organisation,searchroom)
- Rechnerübung Donnerstags 16:15 - 18:45 im [CIP1](https://www.campo.fau.de/qisserver/pages/startFlow.xhtml?_flowId=showRoomDetail-flow&roomId=3349&roomType=3&context=showRoomDetail&navigationPosition=organisation,searchroom)
## Wichtige Infos
+- How-To: Hausaufgaben
- Unter `/proj/i4sp1/bin/` im CIP finden sich nützliche SP1-related Programme und scripts, wie
- `mkrepo` zum Aufgaben-Repo erstellen
- `deadline` zum Abgabetermine nachschauen
-- Vorgegebene Compiler-Flags: `-std=c11 -pedantic -D_XOPEN_SOURCE=700 -Wall -Werror -fsanitize=undefined -fno-sanitize-recover -g`
+- Vorgegebene Compiler-Flags: `-std=c11` `-pedantic` `-D_XOPEN_SOURCE=700` `-Wall` `-Werror` `-fsanitize=undefined` `-fno-sanitize-recover` `-g`
## Wichtige Links
- [Aufgaben](https://sys.cs.fau.de/lehre/ss25/sp1/uebung#aufgaben)
@@ -33,8 +34,13 @@ page_for: "sp1-lesson"
- Mail an mich: nova.ruff@fau.de
- [SP-FAQ](https://sys.cs.fau.de/lehre/ss25/sp1/faq)
-
-## Weitere Links
+## Andere Tutoren
- [SP1 Website](https://sys.cs.fau.de/lehre/ss25/sp1)
+- [Lukas (T03)](https://wwwcip.cs.fau.de/~uk16isyq/)
- [Julian (T08)](https://jzbor.de/tut/sp1/)
+- [Stefan (T09)](https://wwwcip.cs.fau.de/~ok73ozus/sp)
+- [Luca (T11)](https://wwwcip.cs.fau.de/~am99ihig/sp)
- [Philip (ehemalig)](https://wwwcip.cs.fau.de/~oj14ozun/sp1/)
+
+## Hilfreiche Links
+- [cdecl.org](https://cdecl.org/) um zu entziffern, was bei Pointern passiert
\ No newline at end of file
diff --git a/src/sp1/ub1.md b/src/sp1/ub1.md
index bc7cffa..7d44186 100644
--- a/src/sp1/ub1.md
+++ b/src/sp1/ub1.md
@@ -7,6 +7,8 @@ date: 2025-05-04
## Manual-Pages
Mit dem Programm `man` kann die Dokumentation von verschiedenen Bibliotheksfunktionen nachgelesen werden: `man 3p printf`
+Oft findet ihr die schreibweise `time(3p)`, d.h. es wird auf die manpage von time aus der section 3p verwiesen: `man 3p time`
+
## Workflow mit git
- `git clone [URL]` - Remote Repo lokal herunterladen
- `git pull` - Neuester Stand eines Repos herunterladen
@@ -16,23 +18,83 @@ Mit dem Programm `man` kann die Dokumentation von verschiedenen Bibliotheksfunkt
- `git commit -m "[COMMMIT_MESSAGE]"` - Änderungen zu dem Repo committen
- `git push` - Neue Commits an das remote Repo kommunizieren (**wichtig zur Übungsabgabe**)
-## Beispiel Program aus der Präsenzübung
+## Die C Programmiersprache
+- Die "main" funktion in C bekommt immer 2 argumente:
+ - `int argc`: enthält 1 + die Anzahl der Argumente, die dem Program gegeben wurden
+ - `char *argv[]`: ein array von char-pointern (also ein char-pointer-pointer)
+- Das ende von char-arrays (string) wird mit dem Zeichen `'\0'` gekennzeichnet
+- Array-Zugriff: `arr[1]` ist gleichbedeutend mit `*(arr + 1)`
+- Struct-Zugriff: `myStruct->value` ist gleichbedeutend mit `(*myStruct).value`
+- Nützliches Pointer Diagramm
+
+## Fehlerbehandlung (wichtig)
+Funktionen können in C fehlschlagen und fehler müssen **immer** abgefangen und behandelt werden (außer in einer bereits laufenden Fehlerbehandlung).
+
+Was der Rückgabewert einer Funktion ist, wenn sie fehlschlägt, steht in dem "RETURN VALUE" Abschnitt der zugehörigen manpage.
+z.B. steht in malloc(3p), dass im Fehlerfall ein "null pointer" returned wird; Wir müssen uns also nach jedem malloc-Aufruf versichern, dass der Rückgabewert nicht ein null pointer war:
```c
-#include
-#include
+#include
int main(int argc, char *argv[]) {
- // using strlen()
- for (int i = 1; i < argc; i++) {
- char *curr_arg = argv[i];
- for (int l = 0; l < strlen(curr_arg); l++) {
- printf("%c\n", curr_arg[l]);
- }
+ // wir wollen 5 ints abspeichern
+ int *p = malloc(sizeof(int) * 5);
+ if (p == NULL) {
+ // es gab einen fehler
+ return -1;
+ }
+ // kein fehler -> es kann weitergemacht werden ...
+}
+```
+
+## malloc und free
+Wichtig ist, dass mit `malloc` allokierter speicher auch wieder manuell mit der Funktion `free()` freigegeben werden **muss** (`free()` kann nicht fehlschlagen und benötigt so auch keine Fehlerbehandlung):
+```c
+#include
+
+int main(int argc, char *argv[]) {
+ int *p = malloc(sizeof(int) * 5);
+ if (p == NULL) {
+ return -1;
}
- // alternative
+ // ... do something with p ...
+
+ free(p);
+}
+```
+
+## Beispiel Programme aus der Präsenzübung
+### Alle dem Program gegebenen Argumente drucken
+```c
+#include
+
+int main(int argc, char *argv[]) {
+ // iterate over arguments passed to program
for (int i = 1; i < argc; i++) {
+ // get reference to char-array for given argument
+ char *curr_arg = argv[i];
+
+ // alternative schreibweise:
+ // char *curr_arg = *(argv + i);
+
+ printf("%s\n", curr_arg);
+ }
+}
+```
+
+### Jeden char der Argumente auf eine eigene Zeile drucken
+Bei diesem Program wurde benutzt, dass in C, char-arrays mit einem '\0'-byte terminiert sind
+```c
+#include
+
+int main(int argc, char *argv[]) {
+ // iterate over arguments passed to program
+ // start at i = 1, because i = 0 is the name of the program
+ for (int i = 1; i < argc; i++) {
+ // get reference to char-array for given argument
char *curr_arg = argv[i];
+
+ // iterate over the current argument, until '\0' is reached (end of string)
int l = 0;
while (curr_arg[l] != '\0') {
printf("%c\n", curr_arg[l]);
@@ -41,3 +103,24 @@ int main(int argc, char *argv[]) {
}
}
```
+
+### Speicher für structs anlegen
+```c
+#include
+
+struct listelement {
+ int value;
+ struct listelement *next;
+};
+
+int main(int argc, char *argv[]) {
+ struct listelement *element1 = malloc(sizeof(struct listelement));
+ if (element1 == NULL) {
+ // fehlerbehandlung ...
+ }
+
+ // ... rest vom program
+
+ free(element1)
+}
+```
\ No newline at end of file