From fcf4690e3f60681590b5d1702bd2c544a07e4987 Mon Sep 17 00:00:00 2001
From: Manuel Bucher <manuel.bucher@hu-berlin.de>
Date: Wed, 6 Jun 2018 13:02:00 +0200
Subject: [PATCH] =?UTF-8?q?array=20hinzugef=C3=BCgt?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 loesung.c | 87 +++++++++++++++++++++++++++++++++++--------------------
 1 file changed, 55 insertions(+), 32 deletions(-)

diff --git a/loesung.c b/loesung.c
index 01f8716..24ac3c3 100644
--- a/loesung.c
+++ b/loesung.c
@@ -82,7 +82,7 @@ typedef struct Field {
     Tile t_min;
     Tile t_max;
     List tile_list;
-    Tile tile_array[];
+    Tile* (*tile_array);
 } Field;
 
 /** Parsen einer Kachel(Tile) aus einer Zeile von StdIn
@@ -141,17 +141,36 @@ ReadResult read_line(Tile* p_tile){
     return ReadOk;
 }
 
-/**
+/** Min-Max funktionen fuer uint32_t */
+inline uint32_t min(uint32_t a, uint32_t b) { return a < b ? a : b; }
+inline uint32_t max(uint32_t a, uint32_t b) { return a > b ? a : b; }
+
+/** Initialisieren der Variablen im Feld
  *
+ * Voraussetzung: Speicher vom Feld muss allocated sein.
  */
-inline uint32_t min(uint32_t a, uint32_t b) {
-    return a < b ? a : b;
+void field_init(Field *f) {
+    f->t_min.x = UINT32_MAX;
+    f->t_min.y = UINT32_MAX;
+    f->t_max.x = 0;
+    f->t_max.y = 0;
+    // initialisieren der Liste
+    list_init(&f->tile_list);
+    f->tile_array = 0;
 }
-inline uint32_t max(uint32_t a, uint32_t b) {
-    return a > b ? a : b;
+
+/** Freigeben des im Heap reservierten speichers des fields f */
+void field_drop(Field *f) {
+    list_free(&f->tile_list);
+    if(f->tile_array) {
+        free(f->tile_array);
+    }
 }
 
 /** Liest das Input von StdIn und schreibt das Ergebnis in das uebergebene Feld
+ *
+ * Laufzeit: O(n)
+ * Speicherbedarf: O(n)
  *
  * Parameter:
  *  - Field* f pointer auf ein uninitialisiertes Feld, nach dem ausfuehren der
@@ -165,14 +184,7 @@ inline uint32_t max(uint32_t a, uint32_t b) {
  *     ReadErr..., falls die Eingabe ungueltig ist. `f` ist dann nicht vollstaendig
  *               initialisiert
  */
-ReadResult parse_input(Field *f) {
-    f->t_min.x = UINT32_MAX;
-    f->t_min.y = UINT32_MAX;
-    f->t_max.x = 0;
-    f->t_max.y = 0;
-    // initialisieren der Liste
-    list_init(&f->tile_list);
-
+ReadResult field_init_tile_list(Field *f) {
     while (1) {
         Tile *t = list_push(&f->tile_list); // neues Element in die Liste einfuegen
         ReadResult result = read_line(t);
@@ -197,42 +209,53 @@ ReadResult parse_input(Field *f) {
     }
 }
 
+/** Initialisieren des Tile-Arrays
+ *
+ * Laufzeit: O(n)
+ */
+void field_init_tile_array(Field *f) {
+    f->tile_array = malloc(f->tile_list.size * sizeof(Tile*));
+    Tile *cur = f->tile_list.p_top;
+
+    for (uint32_t i = 0; i < f->tile_list.size; i++) {
+        f->tile_array[i] = cur;
+        cur = cur->p_next;
+    }
+}
+
 int main (void)
 {
-    Field f;
-    ReadResult result = parse_input(&f);
+    // erstellen des main Objekt
+    Field field;
+    field_init(&field); // initialiseren der Variablen
+    ReadResult result = field_init_tile_list(&field); // lesen des Inputs
     switch (result) {
     case ReadOk:
-        printf("Valider Input\n");
-        printf("Anzahl: %d\n", f.tile_list.size);
-        printf("Range(%d, %d), (%d, %d)\n",
-               f.t_min.x, f.t_min.y,
-               f.t_max.x, f.t_max.y);
-        printf("Range x: %d, %d\n",
-               f.t_max.x - f.t_min.x,
-               f.t_max.y - f.t_min.y);
+        field_init_tile_array(&field);
         break;
     case ReadEof:
         // bei leerer Eingabe nichts ausgeben
         return EXIT_SUCCESS;
     case ReadErrIntegerOverflow:
-        fprintf(stderr, "Error in line %d: too big integer\n", f.tile_list.size);
-        list_free(&f.tile_list);
+        fprintf(stderr, "Error in line %d: too big integer\n", field.tile_list.size);
+        field_drop(&field);
         return EXIT_FAILURE;
     case ReadErrNonDigitCharacter:
-        fprintf(stderr, "Error in line %d: invalid character\n", f.tile_list.size);
-        list_free(&f.tile_list);
+        fprintf(stderr, "Error in line %d: invalid character\n", field.tile_list.size);
+        field_drop(&field);
         return EXIT_FAILURE;
     case ReadErrTooFewNumbers:
         fprintf(stderr, "Error in line %d: Too few numbers, expected exactly 2\n",
-               f.tile_list.size);
-        list_free(&f.tile_list);
+               field.tile_list.size);
+        field_drop(&field);
         return EXIT_FAILURE;
     case ReadErrTooManyNumbers:
         fprintf(stderr, "Error in line %d: Too much numbers, expected exactly 2\n",
-               f.tile_list.size);
-        list_free(&f.tile_list);
+               field.tile_list.size);
+        field_drop(&field);
         return EXIT_FAILURE;
     }
+
+    field_drop(&field);
     return EXIT_SUCCESS;
 }
-- 
GitLab