diff --git a/doble_initial b/doble_initial new file mode 100755 index 0000000..f15a725 Binary files /dev/null and b/doble_initial differ 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