From 889ab95434fbbf61793b509fe7d93eb6c3ae9e6f Mon Sep 17 00:00:00 2001
From: Peter Gerwinski <peter.gerwinski@hs-bochum.de>
Date: Thu, 28 Jan 2021 19:17:47 +0100
Subject: [PATCH] Weitere Beispiele 28.1.2021

---
 20210128/hp-20210128.pdf | Bin 170721 -> 170732 bytes
 20210128/hp-20210128.tex |   2 +-
 20210128/objects-1.c     |  28 ++++++++++++++++
 20210128/objects-2.c     |  28 ++++++++++++++++
 20210128/objects-3.c     |  34 ++++++++++++++++++++
 20210128/objects-3a.c    |  34 ++++++++++++++++++++
 20210128/objects-4.c     |  34 ++++++++++++++++++++
 20210128/objects-5.c     |  34 ++++++++++++++++++++
 20210128/objects-5a.c    |  35 ++++++++++++++++++++
 20210128/objects-6.c     |  39 ++++++++++++++++++++++
 20210128/objects-7.c     |  43 +++++++++++++++++++++++++
 20210128/objects-8.c     |  59 +++++++++++++++++++++++++++++++++
 20210128/objects-8a.c    |  61 +++++++++++++++++++++++++++++++++++
 20210128/objects-8b.c    |  59 +++++++++++++++++++++++++++++++++
 20210128/objects-9.c     |  66 +++++++++++++++++++++++++++++++++++++
 20210128/objects-9a.c    |  68 +++++++++++++++++++++++++++++++++++++++
 20210128/unions-1.c      |  16 +++++++++
 20210128/unions-2.c      |  15 +++++++++
 20210128/unions-3.c      |  15 +++++++++
 20210128/unions-4.c      |  15 +++++++++
 20 files changed, 684 insertions(+), 1 deletion(-)
 create mode 100644 20210128/objects-1.c
 create mode 100644 20210128/objects-2.c
 create mode 100644 20210128/objects-3.c
 create mode 100644 20210128/objects-3a.c
 create mode 100644 20210128/objects-4.c
 create mode 100644 20210128/objects-5.c
 create mode 100644 20210128/objects-5a.c
 create mode 100644 20210128/objects-6.c
 create mode 100644 20210128/objects-7.c
 create mode 100644 20210128/objects-8.c
 create mode 100644 20210128/objects-8a.c
 create mode 100644 20210128/objects-8b.c
 create mode 100644 20210128/objects-9.c
 create mode 100644 20210128/objects-9a.c
 create mode 100644 20210128/unions-1.c
 create mode 100644 20210128/unions-2.c
 create mode 100644 20210128/unions-3.c
 create mode 100644 20210128/unions-4.c

diff --git a/20210128/hp-20210128.pdf b/20210128/hp-20210128.pdf
index fb8d32701478cbfa971c264403c555d07f5d54f9..2f7012a249447a82c6d97afb9afd8378019fdefa 100644
GIT binary patch
delta 1949
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

delta 1993
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

diff --git a/20210128/hp-20210128.tex b/20210128/hp-20210128.tex
index 87af238..f291a00 100644
--- a/20210128/hp-20210128.tex
+++ b/20210128/hp-20210128.tex
@@ -909,7 +909,7 @@
     \item
       Zeiger auf verschiedene Strukturen\\
       mit einem gemeinsamen Anteil von Datenfeldern\\
-      \textarrow\ "`verwandte"' \newterm{Objekte}, \newterm{Klassen} von Objekten
+      \textarrow\ "`verwandte"' \newterm{Objekte}, \newterm{Klassenhierarchie} von Objekten
     \item
       Struktur, die \emph{nur\/} den gemeinsamen Anteil enthält\\
       \textarrow\ "`Vorfahr"', \newterm{Basisklasse}, \newterm{Vererbung}
diff --git a/20210128/objects-1.c b/20210128/objects-1.c
new file mode 100644
index 0000000..1a62866
--- /dev/null
+++ b/20210128/objects-1.c
@@ -0,0 +1,28 @@
+#include <stdio.h>
+
+typedef struct
+{
+  int type;
+} t_base;
+
+typedef struct
+{
+  int type;
+  int content;
+} t_integer;
+
+typedef struct
+{
+  int type;
+  char *content;
+} t_string;
+
+int main (void)
+{
+  t_integer i = { 1, 42 };
+  t_string s = { 2, "Hello, world!" };
+
+  t_base *object[] = { &i, &s };
+
+  return 0;
+}
diff --git a/20210128/objects-2.c b/20210128/objects-2.c
new file mode 100644
index 0000000..a47cfb4
--- /dev/null
+++ b/20210128/objects-2.c
@@ -0,0 +1,28 @@
+#include <stdio.h>
+
+typedef struct
+{
+  int type;
+} t_base;
+
+typedef struct
+{
+  int type;
+  int content;
+} t_integer;
+
+typedef struct
+{
+  int type;
+  char *content;
+} t_string;
+
+int main (void)
+{
+  t_integer i = { 1, 42 };
+  t_string s = { 2, "Hello, world!" };
+
+  t_base *object[] = { (t_base *) &i, (t_base *) &s };
+
+  return 0;
+}
diff --git a/20210128/objects-3.c b/20210128/objects-3.c
new file mode 100644
index 0000000..ff9224c
--- /dev/null
+++ b/20210128/objects-3.c
@@ -0,0 +1,34 @@
+#include <stdio.h>
+
+typedef struct
+{
+  int type;
+} t_base;
+
+typedef struct
+{
+  int type;
+  int content;
+} t_integer;
+
+typedef struct
+{
+  int type;
+  char *content;
+} t_string;
+
+int main (void)
+{
+  t_integer i = { 1, 42 };
+  t_string s = { 2, "Hello, world!" };
+
+  t_base *object[] = { (t_base *) &i, (t_base *) &s };
+
+  for (int i = 0; i < 2; i++)
+    if (object[i]->type == 1)
+      printf ("Integer: %d\n", object[i]->content);
+    else if (object[i]->type == 2)
+      printf ("String: \"%s\"\n", object[i]->content);
+
+  return 0;
+}
diff --git a/20210128/objects-3a.c b/20210128/objects-3a.c
new file mode 100644
index 0000000..a285a87
--- /dev/null
+++ b/20210128/objects-3a.c
@@ -0,0 +1,34 @@
+#include <stdio.h>
+
+typedef struct
+{
+  int type;
+} t_base;
+
+typedef struct
+{
+  int type;
+  int content;
+} t_integer;
+
+typedef struct
+{
+  int type;
+  char *content;
+} t_string;
+
+int main (void)
+{
+  t_integer i = { 1, 42 };
+  t_string s = { 2, "Hello, world!" };
+
+  t_base *object[] = { &i, &s };
+
+  for (int i = 0; i < 2; i++)
+    if (object[i]->type == 1)
+      printf ("Integer: %d\n", object[i]->content);
+    else if (object[i]->type == 2)
+      printf ("String: \"%s\"\n", object[i]->content);
+
+  return 0;
+}
diff --git a/20210128/objects-4.c b/20210128/objects-4.c
new file mode 100644
index 0000000..ef7bffe
--- /dev/null
+++ b/20210128/objects-4.c
@@ -0,0 +1,34 @@
+#include <stdio.h>
+
+typedef struct
+{
+  int type;
+} t_base;
+
+typedef struct
+{
+  int type;
+  int content;
+} t_integer;
+
+typedef struct
+{
+  int type;
+  char *content;
+} t_string;
+
+int main (void)
+{
+  t_integer i = { 1, 42 };
+  t_string s = { 2, "Hello, world!" };
+
+  t_base *object[] = { (t_base *) &i, (t_base *) &s };
+
+  for (int i = 0; i < 2; i++)
+    if (object[i]->type == 1)
+      printf ("Integer: %d\n", (t_integer *) object[i]->content);
+    else if (object[i]->type == 2)
+      printf ("String: \"%s\"\n", (t_string *) object[i]->content);
+
+  return 0;
+}
diff --git a/20210128/objects-5.c b/20210128/objects-5.c
new file mode 100644
index 0000000..820181d
--- /dev/null
+++ b/20210128/objects-5.c
@@ -0,0 +1,34 @@
+#include <stdio.h>
+
+typedef struct
+{
+  int type;
+} t_base;
+
+typedef struct
+{
+  int type;
+  int content;
+} t_integer;
+
+typedef struct
+{
+  int type;
+  char *content;
+} t_string;
+
+int main (void)
+{
+  t_integer i = { 1, 42 };
+  t_string s = { 2, "Hello, world!" };
+
+  t_base *object[] = { (t_base *) &i, (t_base *) &s };
+
+  for (int i = 0; i < 2; i++)
+    if (object[i]->type == 1)
+      printf ("Integer: %d\n", ((t_integer *) object[i])->content);
+    else if (object[i]->type == 2)
+      printf ("String: \"%s\"\n", ((t_string *) object[i])->content);
+
+  return 0;
+}
diff --git a/20210128/objects-5a.c b/20210128/objects-5a.c
new file mode 100644
index 0000000..14f1cad
--- /dev/null
+++ b/20210128/objects-5a.c
@@ -0,0 +1,35 @@
+#include <stdio.h>
+
+typedef struct
+{
+  int nutzlos;
+  int type;
+} t_base;
+
+typedef struct
+{
+  int content;
+  int type;
+} t_integer;
+
+typedef struct
+{
+  char *content;
+  int type;
+} t_string;
+
+int main (void)
+{
+  t_integer i = { 42, 1 };
+  t_string s = { "Hello, world!", 2 };
+
+  t_base *object[] = { (t_base *) &i, (t_base *) &s };
+
+  for (int i = 0; i < 2; i++)
+    if (object[i]->type == 1)
+      printf ("Integer: %d\n", ((t_integer *) object[i])->content);
+    else if (object[i]->type == 2)
+      printf ("String: \"%s\"\n", ((t_string *) object[i])->content);
+
+  return 0;
+}
diff --git a/20210128/objects-6.c b/20210128/objects-6.c
new file mode 100644
index 0000000..86847c9
--- /dev/null
+++ b/20210128/objects-6.c
@@ -0,0 +1,39 @@
+#include <stdio.h>
+
+typedef struct
+{
+  int type;
+} t_base;
+
+typedef struct
+{
+  int type;
+  int content;
+} t_integer;
+
+typedef struct
+{
+  int type;
+  char *content;
+} t_string;
+
+void print_object (t_base *this)
+{
+  if (this->type == 1)
+    printf ("Integer: %d\n", ((t_integer *) this)->content);
+  else if (this->type == 2)
+    printf ("String: \"%s\"\n", ((t_string *) this)->content);
+}
+
+int main (void)
+{
+  t_integer i = { 1, 42 };
+  t_string s = { 2, "Hello, world!" };
+
+  t_base *object[] = { (t_base *) &i, (t_base *) &s };
+
+  for (int i = 0; i < 2; i++)
+    print_object (object[i]);
+
+  return 0;
+}
diff --git a/20210128/objects-7.c b/20210128/objects-7.c
new file mode 100644
index 0000000..b9b24ad
--- /dev/null
+++ b/20210128/objects-7.c
@@ -0,0 +1,43 @@
+#include <stdio.h>
+
+#define T_BASE    0
+#define T_INTEGER 1
+#define T_STRING  2
+
+typedef struct
+{
+  int type;
+} t_base;
+
+typedef struct
+{
+  int type;
+  int content;
+} t_integer;
+
+typedef struct
+{
+  int type;
+  char *content;
+} t_string;
+
+void print_object (t_base *this)
+{
+  if (this->type == T_INTEGER)
+    printf ("Integer: %d\n", ((t_integer *) this)->content);
+  else if (this->type == T_STRING)
+    printf ("String: \"%s\"\n", ((t_string *) this)->content);
+}
+
+int main (void)
+{
+  t_integer i = { T_INTEGER, 42 };
+  t_string s = { T_STRING, "Hello, world!" };
+
+  t_base *object[] = { (t_base *) &i, (t_base *) &s, NULL };
+
+  for (int i = 0; object[i]; i++)
+    print_object (object[i]);
+
+  return 0;
+}
diff --git a/20210128/objects-8.c b/20210128/objects-8.c
new file mode 100644
index 0000000..0c93e8f
--- /dev/null
+++ b/20210128/objects-8.c
@@ -0,0 +1,59 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#define T_BASE    0
+#define T_INTEGER 1
+#define T_STRING  2
+
+typedef struct
+{
+  int type;
+} t_base;
+
+typedef struct
+{
+  int type;
+  int content;
+} t_integer;
+
+typedef struct
+{
+  int type;
+  char *content;
+} t_string;
+
+void print_object (t_base *this)
+{
+  if (this->type == T_INTEGER)
+    printf ("Integer: %d\n", ((t_integer *) this)->content);
+  else if (this->type == T_STRING)
+    printf ("String: \"%s\"\n", ((t_string *) this)->content);
+}
+
+t_integer *new_integer (int i)
+{
+  t_integer *p = malloc (sizeof (t_integer));
+  p->type = T_INTEGER;
+  p->content = i;
+  return p;
+}
+
+t_string *new_string (char *s)
+{
+  t_string *p = malloc (sizeof (t_string));
+  p->type = T_STRING;
+  p->content = s;
+  return p;
+}
+
+int main (void)
+{
+  t_base *object[] = { (t_base *) new_integer (42),
+                       (t_base *) new_string ("Hello, world!"),
+                       NULL };
+
+  for (int i = 0; object[i]; i++)
+    print_object (object[i]);
+
+  return 0;
+}
diff --git a/20210128/objects-8a.c b/20210128/objects-8a.c
new file mode 100644
index 0000000..76c3cc5
--- /dev/null
+++ b/20210128/objects-8a.c
@@ -0,0 +1,61 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#define T_BASE    0
+#define T_INTEGER 1
+#define T_STRING  2
+
+typedef struct
+{
+  int type;
+} t_base;
+
+typedef struct
+{
+  int type;
+  int content;
+} t_integer;
+
+typedef struct
+{
+  int type;
+  char *content;
+} t_string;
+
+char *content = "Ätsch.";
+
+void print_object (t_base *this)
+{
+  if (this->type == T_INTEGER)
+    printf ("Integer: %d\n", ((t_integer *) this)->content);
+  else if (this->type == T_STRING)
+    printf ("String: \"%s\"\n", ((t_string *) this)->content);
+}
+
+t_integer *new_integer (int i)
+{
+  t_integer *p = malloc (sizeof (t_integer));
+  p->type = T_INTEGER;
+  p->content = i;
+  return p;
+}
+
+t_string *new_string (char *s)
+{
+  t_string *p = malloc (sizeof (t_string));
+  p->type = T_STRING;
+  p->content = s;
+  return p;
+}
+
+int main (void)
+{
+  t_base *object[] = { (t_base *) new_integer (42),
+                       (t_base *) new_string ("Hello, world!"),
+                       NULL };
+
+  for (int i = 0; object[i]; i++)
+    print_object (object[i]);
+
+  return 0;
+}
diff --git a/20210128/objects-8b.c b/20210128/objects-8b.c
new file mode 100644
index 0000000..a9d7b5a
--- /dev/null
+++ b/20210128/objects-8b.c
@@ -0,0 +1,59 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#define T_BASE    0
+#define T_INTEGER 1
+#define T_STRING  2
+
+typedef struct
+{
+  int type;
+} t_base;
+
+typedef struct
+{
+  int type;
+  int content;
+} t_integer;
+
+typedef struct
+{
+  int type;
+  char *content;
+} t_string;
+
+void print_object (t_base *this)
+{
+  if (this->type == T_INTEGER)
+    printf ("Integer: %d\n", ((t_integer *) this)->content);
+  else if (this->type == T_STRING)
+    printf ("String: \"%s\"\n", ((t_string *) this)->content);
+}
+
+t_base *new_integer (int i)
+{
+  t_integer *p = malloc (sizeof (t_integer));
+  p->type = T_INTEGER;
+  p->content = i;
+  return (t_base *) p;
+}
+
+t_base *new_string (char *s)
+{
+  t_string *p = malloc (sizeof (t_string));
+  p->type = T_STRING;
+  p->content = s;
+  return (t_base *) p;
+} 
+
+int main (void)
+{
+  t_base *object[] = { new_integer (42),
+                       new_string ("Hello, world!"),
+                       NULL };
+
+  for (int i = 0; object[i]; i++)
+    print_object (object[i]);
+
+  return 0;
+}
diff --git a/20210128/objects-9.c b/20210128/objects-9.c
new file mode 100644
index 0000000..41468b0
--- /dev/null
+++ b/20210128/objects-9.c
@@ -0,0 +1,66 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#define T_BASE    0
+#define T_INTEGER 1
+#define T_STRING  2
+
+typedef struct
+{
+  int type;
+} t_base;
+
+typedef struct
+{
+  int type;
+  int content;
+} t_integer;
+
+typedef struct
+{
+  int type;
+  char *content;
+} t_string;
+
+typedef union
+{
+  t_base base;
+  t_integer integer;
+  t_string string;
+} t_object;
+
+void print_object (t_object *this)
+{
+  if (this->base.type == T_INTEGER)
+    printf ("Integer: %d\n", this->integer.content);
+  else if (this->base.type == T_STRING)
+    printf ("String: \"%s\"\n", this->string.content);
+}
+
+t_object *new_integer (int i)
+{
+  t_object *p = malloc (sizeof (t_integer));
+  p->integer.type = T_INTEGER;
+  p->integer.content = i;
+  return p;
+}
+
+t_object *new_string (char *s)
+{
+  t_object *p = malloc (sizeof (t_string));
+  p->string.type = T_STRING;
+  p->string.content = s;
+  return p;
+}
+
+int main (void)
+{
+  t_object *object[] = { new_integer (42),
+                         new_string ("Hello, world!"),
+                         NULL };
+
+  for (int i = 0; object[i]; i++)
+    print_object (object[i]);
+
+  return 0;
+}
diff --git a/20210128/objects-9a.c b/20210128/objects-9a.c
new file mode 100644
index 0000000..46431c9
--- /dev/null
+++ b/20210128/objects-9a.c
@@ -0,0 +1,68 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#define T_BASE    0
+#define T_INTEGER 1
+#define T_STRING  2
+
+typedef struct
+{
+  int type;
+} t_base;
+
+typedef struct
+{
+  int type;
+  int content;
+} t_integer;
+
+typedef struct
+{
+  int type;
+  char *content;
+} t_string;
+
+typedef union
+{
+  t_base base;
+  t_integer integer;
+  t_string string;
+} t_object;
+
+void print_object (t_object *this)
+{
+  if (this->base.type == T_INTEGER)
+    printf ("Integer: %d\n", this->integer.content);
+  else if (this->base.type == T_STRING)
+    printf ("String: \"%s\"\n", this->string.content);
+}
+
+t_object *new_integer (int i)
+{
+  t_object *p = malloc (sizeof (t_integer));
+  p->integer.type = T_INTEGER;
+  p->integer.content = i;
+  return p;
+}
+
+t_object *new_string (char *s)
+{
+  t_object *p = malloc (sizeof (t_string));
+  p->string.type = T_STRING;
+  p->string.content = s;
+  return p;
+}
+
+int main (void)
+{
+  t_object *object[] = { new_integer (42),
+                         new_string ("Hello, world!"),
+                         NULL };
+
+  for (int i = 0; object[i]; i++)
+    print_object (object[i]);
+
+  for (int i = 0; object[i]; i++)
+    free (object[i]);
+  return 0;
+}
diff --git a/20210128/unions-1.c b/20210128/unions-1.c
new file mode 100644
index 0000000..b75a606
--- /dev/null
+++ b/20210128/unions-1.c
@@ -0,0 +1,16 @@
+#include <stdio.h>
+#include <stdint.h>
+
+typedef union
+{
+  int8_t i;
+  uint8_t u;
+} num8_t;
+
+int main (void)
+{
+  num8_t test;
+  test.i = -1;
+  printf ("%d\n", test.u);
+  return 0;
+}
diff --git a/20210128/unions-2.c b/20210128/unions-2.c
new file mode 100644
index 0000000..8f3c5d8
--- /dev/null
+++ b/20210128/unions-2.c
@@ -0,0 +1,15 @@
+#include <stdio.h>
+#include <stdint.h>
+
+typedef union
+{
+  char s[8];
+  uint64_t x;
+} num_char_t;
+
+int main (void)
+{
+  num_char_t test = { "Hello" };
+  printf ("%lx\n", test.x);
+  return 0;
+}
diff --git a/20210128/unions-3.c b/20210128/unions-3.c
new file mode 100644
index 0000000..2162c06
--- /dev/null
+++ b/20210128/unions-3.c
@@ -0,0 +1,15 @@
+#include <stdio.h>
+#include <stdint.h>
+
+typedef union
+{
+  char s[8];
+  uint64_t x;
+} num_char_t;
+
+int main (void)
+{
+  num_char_t test = { "Hello" };
+  printf ("%ld\n", test.x);
+  return 0;
+}
diff --git a/20210128/unions-4.c b/20210128/unions-4.c
new file mode 100644
index 0000000..5838bc1
--- /dev/null
+++ b/20210128/unions-4.c
@@ -0,0 +1,15 @@
+#include <stdio.h>
+#include <stdint.h>
+
+typedef union
+{
+  char s[8];
+  uint64_t x;
+} num_char_t;
+
+int main (void)
+{
+  num_char_t test = { x: 478560413000 };
+  printf ("%s\n", test.s);
+  return 0;
+}
-- 
GitLab