From a905d1e4ca0179518be914e10c2577313a4b4623 Mon Sep 17 00:00:00 2001 From: Peter Gerwinski <peter.gerwinski@hs-bochum.de> Date: Mon, 16 Jan 2023 14:33:25 +0100 Subject: [PATCH] Notizen und Beispiele 16.1.2023 --- 20230116/func-pointers-01.c | 12 +++++++++++ 20230116/func-pointers-02.c | 18 +++++++++++++++++ 20230116/func-pointers-03.c | 14 +++++++++++++ 20230116/func-pointers-04.c | 23 +++++++++++++++++++++ 20230116/func-pointers-05.c | 23 +++++++++++++++++++++ 20230116/func-pointers-06.c | 26 ++++++++++++++++++++++++ 20230116/func-pointers-07.c | 26 ++++++++++++++++++++++++ 20230116/func-pointers-08.c | 36 +++++++++++++++++++++++++++++++++ 20230116/func-pointers-09.c | 35 ++++++++++++++++++++++++++++++++ 20230116/func-pointers-10.c | 34 +++++++++++++++++++++++++++++++ 20230116/hp-20230116.txt | 19 +++++++++++++++++ 20230116/pointers-01.c | 12 +++++++++++ 20230116/pointers-01.pas | 12 +++++++++++ 20230116/pointers-02.c | 12 +++++++++++ 20230116/pointers-03.c | 15 ++++++++++++++ 20230116/struct-pointers-01.c | 18 +++++++++++++++++ 20230116/struct-pointers-02.c | 18 +++++++++++++++++ 20230116/struct-pointers-03.c | 18 +++++++++++++++++ 20230116/struct-pointers-03.pas | 17 ++++++++++++++++ 20230116/struct-pointers-04.c | 17 ++++++++++++++++ 20230116/struct-pointers-05.c | 17 ++++++++++++++++ 21 files changed, 422 insertions(+) create mode 100644 20230116/func-pointers-01.c create mode 100644 20230116/func-pointers-02.c create mode 100644 20230116/func-pointers-03.c create mode 100644 20230116/func-pointers-04.c create mode 100644 20230116/func-pointers-05.c create mode 100644 20230116/func-pointers-06.c create mode 100644 20230116/func-pointers-07.c create mode 100644 20230116/func-pointers-08.c create mode 100644 20230116/func-pointers-09.c create mode 100644 20230116/func-pointers-10.c create mode 100644 20230116/hp-20230116.txt create mode 100644 20230116/pointers-01.c create mode 100644 20230116/pointers-01.pas create mode 100644 20230116/pointers-02.c create mode 100644 20230116/pointers-03.c create mode 100644 20230116/struct-pointers-01.c create mode 100644 20230116/struct-pointers-02.c create mode 100644 20230116/struct-pointers-03.c create mode 100644 20230116/struct-pointers-03.pas create mode 100644 20230116/struct-pointers-04.c create mode 100644 20230116/struct-pointers-05.c diff --git a/20230116/func-pointers-01.c b/20230116/func-pointers-01.c new file mode 100644 index 0000000..b2db514 --- /dev/null +++ b/20230116/func-pointers-01.c @@ -0,0 +1,12 @@ +#include <stdio.h> + +void hello (void) +{ + printf ("Hello, world!\n"); +} + +int main (void) +{ + hello (); + return 0; +} diff --git a/20230116/func-pointers-02.c b/20230116/func-pointers-02.c new file mode 100644 index 0000000..7c9d60e --- /dev/null +++ b/20230116/func-pointers-02.c @@ -0,0 +1,18 @@ +#include <stdio.h> + +void hello (void) +{ + printf ("Hello, world!\n"); +} + +int main (void) +{ + /* h ist ein Zeiger auf eine Funktion; + h soll auf die Funktion hello() zeigen; */ + /* Merken: "*h ist eine Funktion." */ + /* void *h (void) wäre eine Funktion, die keine Parameter bekommt + und einen Zeiger auf void zurückgibt. */ + void (*h) (void) = hello; + h (); + return 0; +} diff --git a/20230116/func-pointers-03.c b/20230116/func-pointers-03.c new file mode 100644 index 0000000..003591a --- /dev/null +++ b/20230116/func-pointers-03.c @@ -0,0 +1,14 @@ +#include <stdio.h> + +void hello (void) +{ + printf ("Hello, world!\n"); +} + +int main (void) +{ + typedef void (*funcptr) (void); + funcptr h = hello; + h (); + return 0; +} diff --git a/20230116/func-pointers-04.c b/20230116/func-pointers-04.c new file mode 100644 index 0000000..403cb68 --- /dev/null +++ b/20230116/func-pointers-04.c @@ -0,0 +1,23 @@ +#include <stdio.h> + +typedef struct +{ + void (*greeting) (void); // Zeiger auf Funktion, nicht initialisiert +} +object; + +void hello (void) +{ + printf ("Hello, world!\n"); +} + +int main (void) +{ + object o; + + o.greeting = hello; // "Konstruktor" - Initiallisieren des Funktions-Zeigers + //Ohne Klammerpaar: Adresse der Funktion + o.greeting (); // mit Klammerpaar: Funktion aufrufen + + return 0; +} diff --git a/20230116/func-pointers-05.c b/20230116/func-pointers-05.c new file mode 100644 index 0000000..8870230 --- /dev/null +++ b/20230116/func-pointers-05.c @@ -0,0 +1,23 @@ +#include <stdio.h> + +typedef struct +{ + void (*greeting) (void); // Zeiger auf Funktion, nicht initialisiert +} +object; + +void hello (void) +{ + printf ("Hello, world!\n"); +} + +int main (void) +{ + object *o; + // FEHLER: Verwendung von "o" ohne daß "o" auf etwas Sinnvolles zeigt! + o->greeting = hello; // "Konstruktor" - Initiallisieren des Funktions-Zeigers + // Ohne Klammerpaar: Adresse der Funktion + o->greeting (); // mit Klammerpaar: Funktion aufrufen + + return 0; +} diff --git a/20230116/func-pointers-06.c b/20230116/func-pointers-06.c new file mode 100644 index 0000000..995bc6e --- /dev/null +++ b/20230116/func-pointers-06.c @@ -0,0 +1,26 @@ +#include <stdio.h> +#include <stdlib.h> + +typedef struct +{ + void (*greeting) (void); // Zeiger auf Funktion, nicht initialisiert +} +object; + +void hello (void) +{ + printf ("Hello, world!\n"); +} + +int main (void) +{ + object *o; + + o = malloc (sizeof (object)); // Speicherplatz dynamisch erzeugen + + o->greeting = hello; // "Konstruktor" - Initiallisieren des Funktions-Zeigers + // Ohne Klammerpaar: Adresse der Funktion + o->greeting (); // mit Klammerpaar: Funktion aufrufen + + return 0; +} diff --git a/20230116/func-pointers-07.c b/20230116/func-pointers-07.c new file mode 100644 index 0000000..a47689d --- /dev/null +++ b/20230116/func-pointers-07.c @@ -0,0 +1,26 @@ +#include <stdio.h> + +typedef struct +{ + void (*greeting) (void); // Zeiger auf Funktion, nicht initialisiert +} +object; + +void hello (void) +{ + printf ("Hello, world!\n"); +} + +int main (void) +{ + object *o; + + object apfel; // Speicherplatz innerhalb von main() reservieren + o = &apfel; // Zeiger darauf zeigen lassen + + o->greeting = hello; // "Konstruktor" - Initiallisieren des Funktions-Zeigers + // Ohne Klammerpaar: Adresse der Funktion + o->greeting (); // mit Klammerpaar: Funktion aufrufen + + return 0; +} diff --git a/20230116/func-pointers-08.c b/20230116/func-pointers-08.c new file mode 100644 index 0000000..0b28bed --- /dev/null +++ b/20230116/func-pointers-08.c @@ -0,0 +1,36 @@ +#include <stdio.h> + +typedef struct +{ + void (*greeting) (void); // Zeiger auf Funktion, nicht initialisiert +} +object; + +void hello_apple (void) +{ + printf ("Hello, apple!\n"); +} + +void hello_pear (void) +{ + printf ("Hello, pear!\n"); +} + +int main (void) +{ + object *a; + object *b; + + object apfel; // Speicherplatz innerhalb von main() reservieren + a = &apfel; // Zeiger darauf zeigen lassen + a->greeting = hello_apple; // "Konstruktor": virtuelle Methode initialisieren + + object birne; // Speicherplatz innerhalb von main() reservieren + b = &birne; // Zeiger darauf zeigen lassen + b->greeting = hello_pear; // "Konstruktor": virtuelle Methode initialisieren + + a->greeting (); + b->greeting (); + + return 0; +} diff --git a/20230116/func-pointers-09.c b/20230116/func-pointers-09.c new file mode 100644 index 0000000..25ca1bb --- /dev/null +++ b/20230116/func-pointers-09.c @@ -0,0 +1,35 @@ +#include <stdio.h> + +typedef struct +{ + void (*greeting) (void); // Zeiger auf Funktion, nicht initialisiert +} +object; + +void hello_apple (void) +{ + printf ("Hello, apple!\n"); +} + +void hello_pear (void) +{ + printf ("Hello, pear!\n"); +} + +int main (void) +{ + object *o[2]; // Array mit 2 Zeigern auf Objekte + + object apfel; // Speicherplatz innerhalb von main() reservieren + o[0] = &apfel; // Zeiger darauf zeigen lassen + o[0]->greeting = hello_apple; // "Konstruktor": virtuelle Methode initialisieren + + object birne; // Speicherplatz innerhalb von main() reservieren + o[1] = &birne; // Zeiger darauf zeigen lassen + o[1]->greeting = hello_pear; // "Konstruktor": virtuelle Methode initialisieren + + for (int i = 0; i < 2; i++) + o[i]->greeting (); + + return 0; +} diff --git a/20230116/func-pointers-10.c b/20230116/func-pointers-10.c new file mode 100644 index 0000000..10ad166 --- /dev/null +++ b/20230116/func-pointers-10.c @@ -0,0 +1,34 @@ +#include <stdio.h> +#include <stdlib.h> + +typedef struct +{ + void (*greeting) (void); // Zeiger auf Funktion, nicht initialisiert +} +object; + +void hello_apple (void) +{ + printf ("Hello, apple!\n"); +} + +void hello_pear (void) +{ + printf ("Hello, pear!\n"); +} + +int main (void) +{ + object *o[2]; // Array mit 2 Zeigern auf Objekte + + o[0] = malloc (sizeof (object)); // "Konstrutor": Speicherplatz dynamisch reservieren + o[0]->greeting = hello_apple; // "Konstruktor": virtuelle Methode initialisieren + + o[1] = malloc (sizeof (object)); // "Konstrutor": Speicherplatz dynamisch reservieren + o[1]->greeting = hello_pear; // "Konstruktor": virtuelle Methode initialisieren + + for (int i = 0; i < 2; i++) + o[i]->greeting (); + + return 0; +} diff --git a/20230116/hp-20230116.txt b/20230116/hp-20230116.txt new file mode 100644 index 0000000..d53358e --- /dev/null +++ b/20230116/hp-20230116.txt @@ -0,0 +1,19 @@ +Klausur-Themen, 16.01.2023, 13:57:20 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + - Seiteneffekte + - Arrays, Zeiger, Strings + - Speicherzellen + - Bit-Manipulation + - Endianness + - Alignment + - Algorithmen, Landau-Symbol + - Objekte, Zeiger auf Funktionen + +--> Es ist mal wieder Zeit für: + - Seiteneffekte + - Mikrocontroller + +Zeiger, 16.01.2023, 11:30:23 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + - auf Funktionen + - auf Structs und Unions diff --git a/20230116/pointers-01.c b/20230116/pointers-01.c new file mode 100644 index 0000000..230e8ed --- /dev/null +++ b/20230116/pointers-01.c @@ -0,0 +1,12 @@ +#include <stdio.h> + +int main (void) +{ + int a = 7; + int b = 13; + int *p = &a; + printf ("*p = %d\n", *p); + p = &b; + printf ("*p = %d\n", *p); + return 0; +} diff --git a/20230116/pointers-01.pas b/20230116/pointers-01.pas new file mode 100644 index 0000000..1fe7afc --- /dev/null +++ b/20230116/pointers-01.pas @@ -0,0 +1,12 @@ +program Pointers; + +var + a: Integer = 7; + b: Integer = 13; + p: ^Integer = @a; + +begin + WriteLn ('p^ = ', p^); + p := @b; + WriteLn ('p^ = ', p^) +end. diff --git a/20230116/pointers-02.c b/20230116/pointers-02.c new file mode 100644 index 0000000..b551c9c --- /dev/null +++ b/20230116/pointers-02.c @@ -0,0 +1,12 @@ +#include <stdio.h> + +int main (void) +{ + int a = 7; + int b = 13; + int *p = &a; + printf ("*p = %d\n", *p); + *p = &b; /* falsch */ + printf ("*p = %d\n", *p); + return 0; +} diff --git a/20230116/pointers-03.c b/20230116/pointers-03.c new file mode 100644 index 0000000..b330a5f --- /dev/null +++ b/20230116/pointers-03.c @@ -0,0 +1,15 @@ +#include <stdio.h> + +int main (void) +{ + int a = 7; + int b = 13; + int *p; + p = &a; + printf ("*p = %d\n", *p); + *p = &b; /* falsch: Zuweisung der Speicheradresse von b an die Zahl a, + weil p zu diesem Zeitpunkt auf a zeigt */ + printf ("*p = %d\n", *p); + printf ("a = %d\n", a); + return 0; +} diff --git a/20230116/struct-pointers-01.c b/20230116/struct-pointers-01.c new file mode 100644 index 0000000..9837cbf --- /dev/null +++ b/20230116/struct-pointers-01.c @@ -0,0 +1,18 @@ +#include <stdio.h> + +typedef struct +{ + int a; + int b; +} +data; + +int main (void) +{ + data d; + d.a = 7; + d.b = 13; + data *p = &d; + printf ("*p = { %d, %d }\n", *p.a, *p.b); + return 0; +} diff --git a/20230116/struct-pointers-02.c b/20230116/struct-pointers-02.c new file mode 100644 index 0000000..d6527ad --- /dev/null +++ b/20230116/struct-pointers-02.c @@ -0,0 +1,18 @@ +#include <stdio.h> + +typedef struct +{ + int a; + int b; +} +data; + +int main (void) +{ + data d; + d.a = 7; + d.b = 13; + data *p = &d; + printf ("*p = { %d, %d }\n", (*p).a, (*p).b); + return 0; +} diff --git a/20230116/struct-pointers-03.c b/20230116/struct-pointers-03.c new file mode 100644 index 0000000..2aebb06 --- /dev/null +++ b/20230116/struct-pointers-03.c @@ -0,0 +1,18 @@ +#include <stdio.h> + +typedef struct +{ + int a; + int b; +} +data; + +int main (void) +{ + data d; + d.a = 7; + d.b = 13; + data *p = &d; + printf ("*p = { %d, %d }\n", p->a, p->b); + return 0; +} diff --git a/20230116/struct-pointers-03.pas b/20230116/struct-pointers-03.pas new file mode 100644 index 0000000..2c998ff --- /dev/null +++ b/20230116/struct-pointers-03.pas @@ -0,0 +1,17 @@ +program StructPointers; + +type + data = record + a, b: Integer + end; + +var + d: data; + p: ^data; + +begin + d.a := 7; + d.b := 13; + p := @d; + WriteLn ('p^ = { ', p^.a, ', ', p^.b, ' }') +end. diff --git a/20230116/struct-pointers-04.c b/20230116/struct-pointers-04.c new file mode 100644 index 0000000..ca2c30c --- /dev/null +++ b/20230116/struct-pointers-04.c @@ -0,0 +1,17 @@ +#include <stdio.h> + +typedef struct +{ + int a; + int b; +} +data; + +int main (void) +{ + data d; + d.a = 7; + d.b = 13; + printf ("d = { %d, %d }\n", d->a, d->b); + return 0; +} diff --git a/20230116/struct-pointers-05.c b/20230116/struct-pointers-05.c new file mode 100644 index 0000000..d98b8f2 --- /dev/null +++ b/20230116/struct-pointers-05.c @@ -0,0 +1,17 @@ +#include <stdio.h> + +typedef struct +{ + int a; + int b; +} +data; + +int main (void) +{ + data d; + d.a = 7; + d.b = 13; + printf ("d = { %d, %d }\n", d.a, d.b); + return 0; +} -- GitLab