From 47470ba55268fbc07ee1421dbcc278376ffa87f6 Mon Sep 17 00:00:00 2001 From: Rory Healy Date: Mon, 23 Aug 2021 12:24:42 +1000 Subject: [PATCH] small code refactor --- .vscode/c_cpp_properties.json | 34 ++++++++++++++++++++++ output.txt | 0 voronoi.c | 52 +++++++++++++++++++++++++++++----- voronoi.h | 14 +++++++-- voronoi1 | Bin 20040 -> 20688 bytes 5 files changed, 91 insertions(+), 9 deletions(-) create mode 100644 .vscode/c_cpp_properties.json create mode 100644 output.txt diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..dfe7034 --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,34 @@ +{ + "configurations": [ + { + "name": "Win32", + "includePath": [ + "${workspaceFolder}/**" + ], + "defines": [ + "_DEBUG", + "UNICODE", + "_UNICODE" + ], + "compilerPath": "C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\bin\\gcc.exe", + "cppStandard": "gnu++14", + "intelliSenseMode": "windows-gcc-x64" + }, + { + "name": "Linux", + "includePath": [ + "${workspaceFolder}/**" + ], + "defines": [ + "_DEBUG", + "UNICODE", + "_UNICODE" + ], + "compilerPath": "/usr/bin/gcc", + "cppStandard": "gnu++14", + "intelliSenseMode": "linux-gcc-x64", + "cStandard": "c17" + } + ], + "version": 4 +} diff --git a/output.txt b/output.txt new file mode 100644 index 0000000..e69de29 diff --git a/voronoi.c b/voronoi.c index 29a247b..ff16e13 100644 --- a/voronoi.c +++ b/voronoi.c @@ -1,11 +1,47 @@ +/* voronoi.c +* +* Created by Rory Healy (healyr@student.unimelb.edu.au) +* 12th August 2021 +* +*/ + #include +#include #include #include "voronoi.h" +#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" + int main(int argc, char **argv) { FILE *dataset = NULL, *polygonData = NULL, *output = NULL; checkInputArgs(argc, argv, &dataset, &polygonData, &output); + watchtower_t *watchtowers = (watchtower_t *) malloc(sizeof(watchtower_t)); + if (watchtowers == NULL) { + fputs(MALLOC_ERROR, stderr); + exit(EXIT_FAILURE); + } + + char *buffer; + size_t bufsize = 32; + size_t characters; + + buffer = (char *)malloc(bufsize * sizeof(char)); + if( buffer == NULL) + { + perror("Unable to allocate buffer"); + exit(1); + } + + printf("Type something: "); + characters = getline(&buffer,&bufsize,stdin); + printf("%zu characters were read.\n",characters); + printf("You typed: '%s'\n",buffer); + + // Cleaning up data + free(watchtowers); fclose(dataset); fclose(polygonData); fclose(output); @@ -14,29 +50,31 @@ int main(int argc, char **argv) { void checkInputArgs(int argc, char **argv, FILE **datasetFile, \ FILE **polygonFile, FILE **outputFile) { - char *openFileError = "Error: Unable to open file %s\n"; - char *numFilesError = "Error: Incorrect number of inputs (3 required).\n"; - if (argc != 4) { - fputs(numFilesError, stderr); + fputs(NUM_FILE_ERROR, stderr); exit(EXIT_FAILURE); } *datasetFile = fopen(argv[1], "r"); if (*datasetFile == NULL) { - fprintf(stderr, openFileError, argv[1]); + fprintf(stderr, OPEN_FILE_ERROR, argv[1]); exit(EXIT_FAILURE); } *polygonFile = fopen(argv[2], "r"); if (*polygonFile == NULL) { - fprintf(stderr, openFileError, argv[2]); + fprintf(stderr, OPEN_FILE_ERROR, argv[2]); exit(EXIT_FAILURE); } *outputFile = fopen(argv[3], "w"); if (*outputFile == NULL) { - fprintf(stderr, openFileError, argv[3]); + fprintf(stderr, OPEN_FILE_ERROR, argv[3]); exit(EXIT_FAILURE); } } + +void readWatchtowers(watchtower_t *watchtowers, FILE* datasetFile) { + int numTowers = 1; + +} diff --git a/voronoi.h b/voronoi.h index 2d45b10..ebee5ca 100644 --- a/voronoi.h +++ b/voronoi.h @@ -1,2 +1,12 @@ -void checkInputArgs(int argc, char **argv, FILE **datasetFile, \ -FILE **polygonFile, FILE **outputFile); +typedef struct { + char *id; + char *postcode; + char *manager; + int population; + double x; + double y; +} watchtower_t; + +void checkInputArgs(int argc, char **argv, FILE **datasetFile, \ +FILE **polygonFile, FILE **outputFile); +void readWatchtowers(watchtower_t *watchtowers, FILE* datasetFile); diff --git a/voronoi1 b/voronoi1 index 196cd80ff21f9f666bbe13afa56ee9a3b1bb4f2a..a1ce3160ad3803b85b559374ec2f22a8c171eec4 100644 GIT binary patch literal 20688 zcmeHPeQ;dWb-%l-Cp}rx>eI%?4t@}WjX^8fvW;yJtZd0%5q}6G^9|3d-6v_oYFF&O zwJjP4$0{_6qtu?s1b2o%44G+}NzyuP(jmbUPn_l;wr;3@H}ELl3F;F?HLK%i&hXZn(3UKCSF#6lFVN$?lM{JEZKG zUZ4sgG39ttOz5*&#nVd-$S4`|TL`b+UCPc&yOlmuDudFe-?robm-70Q-5Z85+}E>ar*GvRK&U6og=A5N3^aGep?AVT>|ebfjz{i_z1h7zjC=LtZOG@B(mB4FC;JqdA7l9l2c+-9W zS9wA3A$%Ie<-!O%LcadCDLm}K1;$^DhTA4#9ZJ|@FgV~=k|Jxz6DctmOQy4y7>Op6=@?8eQ2XFd;52raBdAHvbL4!-@QGVPFelY zfh0K^8cC;=Bhyh`P!a9+%TEB5{)nIdW6lT62O0GS2HF*kdnz|+KPZuav9o+ci1 zvkw(`nqbY%MhiSmK;~v|EATY&n49fl9<{HNweJ?P{@@?Qe7t_;Jb&23=REv~hqpZZ z{T_awhu`htdpvxnhu`St*Zo`X#H$ZPCjKch{x28$`gcugI}pLhWZjPu*vMq(Su{7l zxCtg790$7vnaHHJp2(Jq_F{DHyLg&FU0a=>u3vcs>f)TD(65&I8~sGC{WvmlA#(QJ zTOwyK1|q%}BCmdIx4^*Y^9N9Uj)0jc8NJvuZIJX>&vXPX>l{a~gMS?X z%`Ji1TV&Q!Fk4G1lbvq^rNyk6`R+#mjxGMn>#304(~(J-PW%Yo9Pv9OK8f00fYS?+ zi5Fn}-GcFFr7>9$ex`uO9ejo=wZ_R$QT}=-{}Sa5Cx4#uEy&CABFA=Lj7K_ZWngV> zrUrtS&$*)CK5_U%L?1QT2k*P5cTM!XK7RPa3Y)@KM~y((D5@N`EvVE?H{3X3TkDj1 zAu>LNy9%1Tu@?$dhv^R~5aiX5rp}NMA#9h;mdXt%;p^8?m^Q9(Y@87N5eyyYuSgdN z)A$sWN%5ChO_1|($N9A5eA?q2%H({H?h5q8VZ#)vhN&Wwc? ziG3;B-ZAX-ylfyhIA~==|JbNyWYZ&-J)B4lZ8gNz59f^7a5NK*VRI;J9K=SEk+Gt2 zc)2^BGi>O`w;HRj&aTEfU6tFLils9dD`p$1+{l2HG17xZA~l+`v&NbZSU;3YWUTnL zaFKC3K-tY#i}uHi!364fb#{?BNLs$-fgAfk>G44KzvuHb1um`0*T}r-(Zx_Bp4Zh{IRr+y-)8=a* z{NY&x3an}%vI-yCOMT|ue0~a41RHh)m)=@mb5K7bZn=Ex+KyFM5lnvX!>14Rl!gQ% z5pLrX0e+eQm8h&Q;qx-e`y9#_J;8>@{M+j)134e6B;T8$cCMbw=MzQp{RR2oLOzQ2 zUJhEYzm2R>eSCh256LZ1u_M^<$Nt{n(k};kg2rS;PjJnbwC-U0W0jHM=JBeX!Eh?L zxhvS-6pd5j61j-R8N1z;mas64P3TExhPfr+A%SWJFr#kiz?I%N0*^bxLv$56bVk(fWWA%YXH8 zK27{7+KWZvx%f$y;dj~2D>=Wr^_HV9u&E)_QbiXl%0!uoVfB8Nv#Lb-s)4kQp~UZy zUFNW2N&$?YR~6xUUr>7djv1GKg~C}6`z*43C{9Aygmc=f{9%WY<)zZLh<2wb%Jq(;)cKTpKy_V=J5yG!j@SFR(FN|)g zeE^Ctz{x^}{#(iWtCwv73FuW{LqUOxDtc+YLJ#=#cVQp!S8XTQS4r=}2mD$Xx>|*X z*IZ$uRRi?DLJB9BCCS-2%Kyo7%2(YIR6 zY^pv6OxGt!a)V?V^rfhK#b(JY)vqA6Es`;GdJ(!}t7O*b-yzA3l4;koB)Lg4n`Ou< zIwcdp*!Pwya`ZIZc5KSE6RlFd-qum6P9cC_3KGOXW04kEJFqxvFZ zdL?7)blp|lT0>f=(A) z#ocv}fE?GyN$uXtOpufMo5b9=>@y&z^m~c9UsmU7{i|g2K=n?L(|Up=<|6F3i)ZvE zDs;cB+mzl)k^y}bVu?qU2st~M3s7n{3byS^&8czmIemNt^>2^ zh*Y?TvTw+&g>R`#5~MG#0aw7O8sX?7xH%iDCB~tehxjQEF7(ErJOt8JmS4~Fs ziMXip*U&H!vbI$L$>{npq*WD?Y0%qYQ>9hY&{mI=^6g$ldH;#K8dpo@8>kKb6MaqZfco~x zBK;?l2uBU{n%_i4d>xfl>Yghf|B&4ie@7l^zuDKZjH(Hn#v3Jj4T=0G_B#c1bo^A6 z_c#@>L3h}`#;=i^4J#Zrg7PRPl{!_Yoq=KZ!_uFUMYH;+n`ss!DV>MGExdQ``oVU;acYklIw<$@0Mj;=he%oA>pNu zZ(Bxw8#R|ZKd$E{w|@ef7qb4UW8G3L>uq*?LyE&vZdq?LRdfm53Go-`y@2=yMc4P6 zU>&~Y5i{!3wp=zthilq~VzD-ysxdchP)BTrQn|J*ZHZJYnTuOO>M7<@y@7iG z(Zl9qMIjEPGwD=15sFbwaY`a?4TgqkA|{oQ#c;{mnOw{^cl7S+0f4bLpQE!DX@K}S zV^726NoZG!YCjMCK!Z;YX*F+aD~@XGj%wPtwq8G@>3^?P=k&L=+NZQ7k7~8w(;7ad zRo$vp-}9`dJ*hS6&02&0nx+luIsM?X&pxZwKCAie*4F6vYC4$?!SsqJwU(n$HQ-6p zZ7p=SR((`|xg`FHC$;9ITH_`9zEfKF&06*Qn(u%=fDSTy_nLU3Z(6Ci0L{u%A?ak? zOb-rbEnCFXIXd4FkJ?eNJMf?#hdcI~+2{dF+GK~*85_^+Z9%4{Ev548i8*TH$jV?c zI+PU$qjqfAPGe6%X;6^^@F;NVB=aEl3#1)w7f7!r9Ye`jS*n^y=WOf<$fEfe3n|`N z@QI!tN!e}jw!JAUo=F_A+TzxMwpe;(bbWh!dq-O|n@tR*My!;bb>-XF@mU!hV;M5! z7q!F0DVhg`8OvqNSUQ;-!SS1Pa%?D_>P8HZAI&ABb|Re;(ag{RI>2RYUw4BuIWk&D z>|Dy~9I{eYCJ_T0&BTT~okL_s>yXikQPdfOdh1{`JC=$K(~!(%TXU&{iB!DRrp=Zt zgz}tE>u4rzV{as#ff*EGt^~1UG&{^Th(j(rUG_|o`}u0our+C{ZrVU2i*iKa31^w4 zS|Vz72>nF zr+HHVt3qBMx@7^JJmhs@F#z{5<0q_r1JVo2Ghx42JXW!*akdSChDKAC?0~VJCfl4g*%E z8}RKz93o+dr}8N6z{j^h{6~P3AAYVwx|GK7@rg_OkybAY)xT7`o|1lAgnbn4vIe-};yFt*NrRq#g&A>ZH}Hkd)7}ZZ0s0Ld{Re=1hJtj|K)CpD|H|Jf4w zmrLN^1Wxtw*8h7Y^nVQ8aGF^3{g1#K{mTSDr(xkQ2&a}QBg{%=`ZaKhzjs-=2>nI) zakbo}RS>1iCGOfH-tcpoi_uYHC zcK2>CmdJzSfG`U-dm_q1r2BSZ?%cI^Th}gg?~Wax?&&xCySDA>A+Pedc`Tcgm6nIi z!(l#c{@c!&%W0ZN-I7x~=LEb*iY7QZY#X zR-hPh{#8IRW|}zO&trkk{V#Z!zxcli6nj8#;r|d6V8B zxyT#~&ZDU4NCM6rbM&bQ;R2_1DKKjwHw4XSY6y1&#U@gNY0gIn1~S$G=Hx$fP+ExK z0(YX{4WbzzZteI@cM?75ro_}c^CMk%`Xm_I%VB$7moPQl%E%Y)iwfTa>bAd2mCtmQ z$DV)h81D7h^E!vA!HSA{?dfs&e_$_&>(A>UrtQj(moeV@MsH?~Hj~uQBEJ zd+W~?m_&wR%J#gjV@mT#N?g9T{f|RN_S;AaiT4MY@_r)OQ_Q^fPXeQuuzyTCoTR9C zMdR)NCp`9svST`>+%fUE7k}olpH>P?S-+J1X^%axPnnY3o!B4K??UKqKhMvYTAl{8 z9s7LFW6$edrgf~SsK=f7fwJfR7lu+)^rwnt!u`kmE67m&+5Qc~kudFd*uuBB{GUPM zw&!&=(+CM&$y@&0kkQ&v-F6D=asK~NUVY}7z6aZSmp!lBM_U0Rv7W=t^NfE40gYWQ zpV#;N|G;RklM-Ejl-Q2@@$0}yh3$DieppS=X&vfLY|oU|ZEkxJR@&_j<#N~u+c94Y zW5T$6BkV{Tl)WOXE{sCX$uz3+y?SiF)}v2#rNs1dW$&Q#-&;$R&vvYNZ3+9&DEpJ1 z0q3>fSi;`F(J7(dW8h)M_7e7Y&<`ULt-IXG!-~Di-W$K_&5qSk?il5S?cJ2GJ$E_B zZ*;h6HSn$i+kp@FKmUHwdm5f1q~YjxNkpYb$mKdxS~D$de_)5BagWEq!;1d~Jj-sv literal 20040 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 MTjNtM0~ag)6YP!^jsO4v