From 563fead74caaf118c7a13fd4daaedfdba38d467f Mon Sep 17 00:00:00 2001 From: Rory Healy Date: Wed, 25 Aug 2021 16:40:18 +1000 Subject: [PATCH] reading of datasets added --- .vscode/launch.json | 29 ++++++++++++ .vscode/tasks.json | 27 ++++++++++++ Makefile | 2 +- voronoi.c | 105 +++++++++++++++++++++++++------------------- voronoi.h | 6 ++- voronoi1 | Bin 20272 -> 20848 bytes 6 files changed, 121 insertions(+), 48 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 .vscode/tasks.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..686040f --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,29 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "gcc-10 - Build and debug active file", + "type": "cppdbg", + "request": "launch", + "program": "${fileDirname}/${fileBasenameNoExtension}", + "args": ["dataset_1.csv", "poly_1split.txt", "output.txt"], + "stopAtEntry": false, + "cwd": "${fileDirname}", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ], + "preLaunchTask": "C/C++: gcc-10 build active file", + "miDebuggerPath": "/usr/bin/gdb" + } + ] +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..df21863 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,27 @@ +{ + "tasks": [ + { + "type": "cppbuild", + "label": "C/C++: gcc-10 build active file", + "command": "/usr/bin/gcc-10", + "args": [ + "-g", + "${file}", + "-o", + "${fileDirname}/${fileBasenameNoExtension}" + ], + "options": { + "cwd": "${fileDirname}" + }, + "problemMatcher": [ + "$gcc" + ], + "group": { + "kind": "build", + "isDefault": true + }, + "detail": "Task generated by Debugger." + } + ], + "version": "2.0.0" +} \ No newline at end of file diff --git a/Makefile b/Makefile index cda8daa..32c22e8 100755 --- a/Makefile +++ b/Makefile @@ -1,2 +1,2 @@ voronoi1 : voronoi.c - gcc -Wall -Wextra -pedantic -g -o voronoi1 voronoi.c + gcc -Wall -Wextra -Werror -pedantic -g -o voronoi1 voronoi.c diff --git a/voronoi.c b/voronoi.c index a6c9356..c76b593 100755 --- a/voronoi.c +++ b/voronoi.c @@ -12,7 +12,7 @@ #define OPEN_FILE_ERROR "Error: Unable to open file %s\n" #define NUM_FILE_ERROR "Error: Incorrect number of inputs (3 required).\n" -#define MALLOC_ERROR "Error: Cannot allocate memory.\n" +#define MEMORY_ALLOCATION_ERROR "Error: Cannot allocate memory.\n" #define ARGC_CORRECT_LEN 4 #define NUM_CSV_FIELDS 6 @@ -20,20 +20,24 @@ #define MAX_CSV_ENTRY_LEN 512 int main(int argc, char **argv) { - /* Input and output files */ + // /* Input and output files */ FILE *dataset = NULL, *polygonData = NULL, *output = NULL; checkInputArgs(argc, argv, &dataset, &polygonData, &output); /* Stores information about the watchtowers given in dataset file */ - watchtower_t *watchtowers = (watchtower_t *) malloc(sizeof(watchtower_t)); - if (watchtowers == NULL) { - fputs(MALLOC_ERROR, stderr); - exit(EXIT_FAILURE); - } - - readWatchtowers(watchtowers, dataset); + watchtower_t **watchtowers = malloc(sizeof(*watchtowers)); + checkNullPointer(watchtowers); + int numWatchtowers = 0; + watchtowers = readWatchtowers(watchtowers, dataset, &numWatchtowers); /* Cleaning up data */ + for (int i = 0; i < numWatchtowers; i++) { + free(watchtowers[i]->id); + free(watchtowers[i]->manager); + free(watchtowers[i]->postcode); + free(watchtowers[i]); + } + free(watchtowers); fclose(dataset); fclose(polygonData); @@ -68,25 +72,34 @@ void checkInputArgs(int argc, char **argv, FILE **datasetFile, \ } } -/* Reads the CSV file and stores the information in the watchtowers array */ -void readWatchtowers(watchtower_t *watchtowers, FILE* datasetFile) { +/* Reads the CSV file and stores the information in the watchtowers array. + * Returns the number of watchtowers read. + */ +watchtower_t** readWatchtowers(watchtower_t **watchtowers, FILE* datasetFile, \ + int *numWatchtowers) { /* Maximum length of a single CSV line */ - size_t lineBufferSize = MAX_CSV_ENTRY_LEN; + size_t lineBufferSize = MAX_CSV_ENTRY_LEN + 1; /* Stores the current line from the CSV */ char *lineBuffer = (char *) malloc(lineBufferSize * sizeof(char)); - if (lineBuffer == NULL) { - fprintf(stderr, MALLOC_ERROR); - exit(EXIT_FAILURE); - } + checkNullPointer(lineBuffer); - int numWatchtowers = 1; + int maxSizeWatchtowers = 1; /* Discard the header line, then read the rest of the CSV */ getline(&lineBuffer, &lineBufferSize, datasetFile); while (getline(&lineBuffer, &lineBufferSize, datasetFile) > 0) { + /* Check if there enough space in the watchtowers array */ + if (*numWatchtowers == maxSizeWatchtowers) { + maxSizeWatchtowers *= 2; + watchtower_t **temp = realloc(watchtowers, \ + maxSizeWatchtowers * sizeof(*watchtowers)); + checkNullPointer(temp); + watchtowers = temp; + } + /* The current tower being filled in with information */ - watchtower_t *currTower = (watchtower_t *) malloc(sizeof(watchtower_t)); + watchtowers[*numWatchtowers] = malloc(sizeof(*watchtowers[*numWatchtowers])); /* Stores the current CSV field for the current line */ char *token = strtok(lineBuffer, ","); @@ -103,48 +116,50 @@ void readWatchtowers(watchtower_t *watchtowers, FILE* datasetFile) { * watchtower with no space wasted. */ case 0: - currTower->id = (char *) malloc(sizeof(char) * \ - tokenLength + 1); - strcpy(currTower->id, token); - currTower->id[tokenLength] = '\0'; + watchtowers[*numWatchtowers]->id = (char *) malloc( \ + sizeof(char) * tokenLength + 1); + checkNullPointer(watchtowers[*numWatchtowers]->id); + strcpy(watchtowers[*numWatchtowers]->id, token); + watchtowers[*numWatchtowers]->id[tokenLength] = '\0'; break; case 1: - currTower->postcode = (char *) malloc(sizeof(char) * \ - tokenLength + 1); - strcpy(currTower->postcode, token); - currTower->postcode[tokenLength] = '\0'; + watchtowers[*numWatchtowers]->postcode = (char *) malloc( \ + sizeof(char) * tokenLength + 1); + checkNullPointer(watchtowers[*numWatchtowers]->postcode); + strcpy(watchtowers[*numWatchtowers]->postcode, token); + watchtowers[*numWatchtowers]->postcode[tokenLength] = '\0'; break; case 3: - currTower->manager = (char *) malloc(sizeof(char) * \ - tokenLength + 1); - strcpy(currTower->manager, token); - currTower->manager[tokenLength] = '\0'; + watchtowers[*numWatchtowers]->manager = (char *) malloc( \ + sizeof(char) * tokenLength + 1); + checkNullPointer(watchtowers[*numWatchtowers]->manager); + strcpy(watchtowers[*numWatchtowers]->manager, token); + watchtowers[*numWatchtowers]->manager[tokenLength] = '\0'; break; case 2: - currTower->population = strtol(token, NULL, 10); + watchtowers[*numWatchtowers]->population = \ + strtol(token, NULL, 10); break; case 4: - currTower->x = strtod(token, NULL); + watchtowers[*numWatchtowers]->x = strtod(token, NULL); break; case 5: - currTower->y = strtod(token, NULL); + watchtowers[*numWatchtowers]->y = strtod(token, NULL); break; } token = strtok(NULL, ","); } - // printf("ID: %s\nPostcode: %s\nManager: %s\n", \ - // currTower->id, currTower->postcode, currTower->manager); - // printf("Population: %d\nx: %f\ny: %f\n", \ - // currTower->population, currTower->x, currTower->y); - /* Add currTower to the watchtowers array */ - - - /* Clean up currTower before reading next CSV line */ - free(currTower->id); - free(currTower->manager); - free(currTower->postcode); - free(currTower); + *numWatchtowers += 1; } + free(lineBuffer); + return watchtowers; +} + +void checkNullPointer(void *ptr) { + if (!ptr) { + fputs(MEMORY_ALLOCATION_ERROR, stderr); + exit(EXIT_FAILURE); + } } diff --git a/voronoi.h b/voronoi.h index db6961d..cb34dcd 100755 --- a/voronoi.h +++ b/voronoi.h @@ -1,4 +1,4 @@ -typedef struct watchtower { +typedef struct Watchtower { char *id; char *postcode; char *manager; @@ -9,4 +9,6 @@ typedef struct watchtower { void checkInputArgs(int argc, char **argv, FILE **datasetFile, \ FILE **polygonFile, FILE **outputFile); -void readWatchtowers(watchtower_t *watchtowers, FILE* datasetFile); \ No newline at end of file +watchtower_t** readWatchtowers(watchtower_t **watchtowers, FILE* datasetFile, \ + int *numWatchtowers); +void checkNullPointer(void *ptr); diff --git a/voronoi1 b/voronoi1 index d2723d666324b8f0625b113390a4e64636dd8e8d..41afb537f631b825827fba53fb62aecaee03eae8 100755 GIT binary patch delta 6016 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 delta 4740 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 t(os<6_XK7sM`!DB503=$mB2h5mGE