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