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