diff --git a/20230116/func-pointers-01.c b/20230116/func-pointers-01.c new file mode 100644 index 0000000000000000000000000000000000000000..b2db5145e720b39de50d37e98365b02f1bb25ca2 --- /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 0000000000000000000000000000000000000000..7c9d60ea9da2416b2f27b944dc500479825dd363 --- /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 0000000000000000000000000000000000000000..003591a933eb6123e6b92ac20c14454de17c2ac3 --- /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 0000000000000000000000000000000000000000..403cb68fa3490e93301ad6ffe574a273ff39bc88 --- /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 0000000000000000000000000000000000000000..8870230b80a2d0e78017133ab339590d1ed33e4b --- /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 0000000000000000000000000000000000000000..995bc6ea0b673144b57f0e2a587a60df6b676228 --- /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 0000000000000000000000000000000000000000..a47689d0c3bd5c8d23594e90c31415df8c221c47 --- /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 0000000000000000000000000000000000000000..0b28bed135607997794ef02d3ddc3c823cbe3515 --- /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 0000000000000000000000000000000000000000..25ca1bba9b9d775134383d0078611ed5dd890911 --- /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 0000000000000000000000000000000000000000..10ad166342d4cf47c9df9e06e8f78211e5776be9 --- /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 0000000000000000000000000000000000000000..d53358e95adc81494c9b3d1a4291614c119008a9 --- /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 0000000000000000000000000000000000000000..230e8ed7d6dc91e2104c08028e2c58d8f654afa3 --- /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 0000000000000000000000000000000000000000..1fe7afcbee05de4cd407d232b019e0906931fe2e --- /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 0000000000000000000000000000000000000000..b551c9c9911df26b7076ab833306b9715ea985b6 --- /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 0000000000000000000000000000000000000000..b330a5f6f3eafaed6cbdc608f98aee7652ecc13d --- /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 0000000000000000000000000000000000000000..9837cbfbaa89bbab67cc31948927e637d6c3d84b --- /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 0000000000000000000000000000000000000000..d6527ad8983e8db8f3b2a0f86416d577fd8dd85a --- /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 0000000000000000000000000000000000000000..2aebb0624adead6acfb2d0017587239faeee343d --- /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 0000000000000000000000000000000000000000..2c998ff1410a786ab03eaa39757971d4f5b14e05 --- /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 0000000000000000000000000000000000000000..ca2c30cffd0bac3a004d74d0cbf46ffe8e152674 --- /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 0000000000000000000000000000000000000000..d98b8f23fc7b88fc1570c32f336e6377d08f0340 --- /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; +}