From 28afa369d5e1fbe09c86777012629ddfe1e2543d Mon Sep 17 00:00:00 2001 From: Tobias Busch Date: Sun, 30 Nov 2025 22:33:04 +0100 Subject: [PATCH] stackv1 --- doble_initial | Bin 0 -> 35840 bytes highscores.txt | 4 +++ makefile | 43 +++++++++++++++--------- stack.c | 32 +++++++++++++++--- stack.h | 4 +++ test_stack.c | 89 +++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 153 insertions(+), 19 deletions(-) create mode 100755 doble_initial create mode 100644 test_stack.c diff --git a/doble_initial b/doble_initial new file mode 100755 index 0000000000000000000000000000000000000000..f15a7257c565f008859f08a10463ce143e12e474 GIT binary patch literal 35840 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 literal 0 HcmV?d00001 diff --git a/highscores.txt b/highscores.txt index 4edd5a7..0b90ef4 100644 --- a/highscores.txt +++ b/highscores.txt @@ -1 +1,5 @@ +player2;17901 +player_name2;14920 +player2;14844 +player_name;6977 player1;3999 diff --git a/makefile b/makefile index 1f15f75..b792156 100644 --- a/makefile +++ b/makefile @@ -1,15 +1,15 @@ -CC = gcc +```CC = gcc FLAGS = -g -Wall -lm ifeq ($(OS),Windows_NT) - include makefile_windows.variables + include makefile_windows.variables else - UNAME = $(shell uname) - ifeq ($(UNAME),Linux) - include makefile_linux.variables - else - include makefile_mac.variables - endif + UNAME = $(shell uname) + ifeq ($(UNAME),Linux) + include makefile_linux.variables + else + include makefile_mac.variables + endif endif raylibfolder = ./raylib @@ -19,7 +19,7 @@ unityfolder = ./unity # Initiales Programm bauen (zum ausprobieren) # -------------------------- doble_initial: - $(CC) -o doble_initial $(BINARIES)/libdoble_complete.a + $(CC) -o doble_initial $(BINARIES)/libdoble_complete.a # -------------------------- # Selbst implementiertes Programm bauen @@ -27,23 +27,36 @@ doble_initial: program_obj_files = stack.o bintree.o numbers.o timer.o highscore.o doble : main.o $(program_obj_files) - $(CC) $(FLAGS) $^ -o doble + $(CC) $(FLAGS) $^ -o doble -$(program_obj_filesobj_files): %.o: %.c +# HINWEIS: Hier war ein Tippfehler im Original (obj_filesobj_files), ich habe ihn korrigiert: +$(program_obj_files): %.o: %.c $(CC) -c $(FLAGS) $^ -o $@ # -------------------------- # Unit Tests # -------------------------- -unitTests: - echo "needs to be implemented" +# Name des Test-Programms +TEST_BIN = test_runner + +# Das Target 'unitTests' baut das Test-Programm und führt es aus +# Es benötigt unittest.o und stack.o (damit der Stack getestet werden kann) +unitTests: unittest.o stack.o + @echo "--- Erstelle Test-Executable ---" + $(CC) $(FLAGS) unittest.o stack.o -o $(TEST_BIN) + @echo "--- Starte Tests ---" + ./$(TEST_BIN) + +# Regel, um unittest.c zu kompilieren +unittest.o: test_stack.c + $(CC) -c $(FLAGS) test_stack.c -o unittest.o # -------------------------- # Clean # -------------------------- clean: ifeq ($(OS),Windows_NT) - del /f *.o doble + del /f *.o doble $(TEST_BIN) else - rm -f *.o doble + rm -f *.o doble $(TEST_BIN) endif \ No newline at end of file diff --git a/stack.c b/stack.c index e3a90d4..4fabf41 100644 --- a/stack.c +++ b/stack.c @@ -8,26 +8,50 @@ * `clearStack`: gibt den gesamten Speicher frei. */ // Pushes data as pointer onto the stack. -StackNode *push(StackNode *stack, void *data) +StackNode *push(StackNode *stack, void *data) // es gibt bereits ein stack element, dieses wird übergeben + die daten, die in den stack müssen { + if(!stack || !data) + return 0; + + StackNode *newNode = calloc(1, sizeof(StackNode)); //Speicher reserviert für data und prev, jeweils nur zeiger + if (!newNode) + return 0; + + newNode->prev = stack; + newNode->data = data; + + return newNode; } // Deletes the top element of the stack (latest added element) and releases its memory. (Pointer to data has to be // freed by caller.) StackNode *pop(StackNode *stack) { - + if(!stack) + return 0; + StackNode *prev = stack->prev; + free(stack); + return prev; } // Returns the data of the top element. void *top(StackNode *stack) { - + if(!stack) + return 0; + return stack->data; } // Clears stack and releases all memory. -void clearStack(StackNode *stack) +void clearStack(StackNode *stack) //Annahme: erstes Element: prev = NULL; { + if(!stack) + return; + StackNode *stack_tmp = stack; + + while(stack_tmp) { + stack_tmp = pop(stack_tmp); + } } \ No newline at end of file diff --git a/stack.h b/stack.h index f7d542d..1c6a92b 100644 --- a/stack.h +++ b/stack.h @@ -8,6 +8,10 @@ The latest element is taken from the stack. */ #include //TODO: passenden Datentyp als struct anlegen +typedef struct node { + void* data; + struct node* prev; +} StackNode; // Pushes data as pointer onto the stack. StackNode *push(StackNode *stack, void *data); diff --git a/test_stack.c b/test_stack.c new file mode 100644 index 0000000..aaa0bd6 --- /dev/null +++ b/test_stack.c @@ -0,0 +1,89 @@ +#include +#include +#include +#include "stack.h" + +void test_pushFailsOnNullPointer(StackNode *stack, void *data) { + + StackNode* test = push(NULL, data); + if (test != 0) { + printf("Pass test_pushFailsOnNullPointerStack\n"); + } else + printf("Did Not Pass test_pushFailsOnNullPointerStack EXPECTED Stac Node\n"); + + StackNode* test = push(stack, NULL); + if (test == 0) { + printf("Pass test_pushFailsOnNullPointerData\n"); + return; + } + printf("Did Not Pass test_pushFailsOnNullPointerData EXPECTED 0\n"); + return; +} + +void test_popFailsOnNullPointer() { + + StackNode* test = pop(NULL); + if (test == 0) { + printf("Pass test_pushFailsOnNullPointerStack\n"); + return; + } + printf("Did Not Pass test_pushFailsOnNullPointerStack EXPECTED 0\n"); + + return; +} + +void test_topFailsOnNullPointer() { + + int* test = top(NULL); + if (test == 0) { + printf("Pass test_pushFailsOnNullPointerStack\n"); + return; + } + printf("Did Not Pass test_pushFailsOnNullPointerStack EXPECTED 0\n"); + + return; +} + +int main() +{ + StackNode *stack0 = NULL; + int test0 = 3; + int* dataTest0 = &test0; + stack0->data = dataTest0; + + char test1[5] = "test\0"; + char* dataTest1 = &test1; + + float test2 = 3.14; + float* dataTest2 = &test2; + + printf("============================\nstack tests\n============================\n"); + test_pushFailsOnNullPointer(stack0, dataTest0); + test_popFailsOnNullPointer(); + test_topFailsOnNullPointer(); + + StackNode *stack1 = push(stack0, dataTest1); + if(strcmp(stack1->data ,dataTest1) == 0) { + printf("Pass test_pushString\n"); + } else + printf("Fails test_pushString\n expected: %s\n was: %s\n", dataTest1, stack1->data); + + StackNode *stack2 = push(stack1, dataTest2); + if(stack2->data == dataTest2) { + printf("Pass test_pushFloat\n"); + } else + printf("Fails test_pushFloat\n expected: %f\n was: %d\n", dataTest2, stack2->data); + + int array[10] = {1,2,3,4,5,6,7,8,9,10}; + + for(size_t i = 0; i<10; i++) { + stack2 = push(stack2, &array[i]); + } + for(size_t i = 0; i<10; i++) { + int* data = top(stack2); + printf("%d\n", data); + stack2 = pop(stack2); + } + + return EXIT_SUCCESS; +} \ No newline at end of file