I want to start the Gerrymandering problem with memory limitation to 27000, but not 16*16000, so bellow program is for that. However, problems for compilation met. I would say, well, really cannot tell what's wrong in line 22 and 61!
Anyone who can help? Thanks in advance!
---- compilation error:
$ gcc Gerrymandering.c -o Gerrymandering.out
Gerrymandering.c:22: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘setDistrict’
Gerrymandering.c: In function ‘readDistricts’:
Gerrymandering.c:61: error: expected expression before ‘short’
---- source code:
Code:
#include <stdio.h>
#define SORTMEMLIMIT 27000 /* (16*1000) */
#define MAXDISTRICT 27000
#define SORTTYPE short
#define SORTMEMSIZE (SORTMEMLIMIT/sizeofS(SORTTYPE))
//#define DISTRICTS ("disricts.txt")
char districtsFile[] = "districts.txt";
int main()
{
readdistricts(districtsFile);
return 0;
}
/*
FILE: setDistrict
input:
district, scope: 1-MAXDISTRICT
*/
bool setDistrict(SORTTYPE districtsBitmap[], int district, int bitmapLimit)
{
bool success = false;
if(district >= bitmapLimit)
{
printf("ERROR: invalid distict number: %d for limit: %d!\n", district, bitmapLimit);//try __FILE__ __LINE__ later
}
else
{
int bitPosition = (district-1)%sizeof(SORTTYPE);
int arrayPosition = (district-1)/sizeof(SORTTYPE);
SORTTYPE move = 1;
SORTTYPE setBit = move<<bitPosition;
if(*(districtsBitmap+arrayPosition)&setBit)
{
printf("ERROR: district: %d was set already!", district);
}
else
{
*(districtsBitmap+arrayPosition) |= setBit;
success = true;
}
}
return success;
}
int readDistricts(const char* districtsFile)
{
FILE *fpDistricts;
if(!(fpDistricts = fopen(districtsFile, "r+")))
{
return 1;
}
int district;
int counter = 0;
int failedDistrictCounter = 0;
SORTTYPE districtsBitmap[SORTMEMSIZE];
while( ((++counter)< SORTMEMLIMIT)&&(1==fscanf(fpDistricts, "%d", &district)) )
{
if(!setDistrict(districtsBitmap, district,SORTMEMLIMIT))
{
failedDistrictCounter++;
}
}
fclose(fpDistricts);
printf("INFO: districts sorting finished. Districts number of failed operation: %d, out of %d\n", failedDistrictCounter, counter);
return 0;
}