Search code examples
carraysstructfunction-calls

C Struct Declaration


I have a little problem with C Syntax. I want to build a struct array. But it returns

expected declaration specifiers or ‘...’ before ‘cities’

Here is my code

    #include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

struct City {
  int plateNumber;
  char name[32];
  double area;
  int population;
  int populationDensity;
  int cityCenterPopulation;
  char region[32];
  double latitude;
  double longitude;
};

struct City cities[81];
#define Struct_Size sizeof(struct City)

void printCityData(cities[], int i);
void readFile();

void readFile(){
  int fd = open("data.dat", O_RDONLY);
  if(fd<0) {
    printf("Error while opening file!");
    return;
  }
  int i;
  for (i = 0; i < 81; i++) {
    while(read(fd,&cities[i], Struct_Size)>0) {
      printCityData(cities[i],i);
    }
  }

}

void printCityData(cities[], int i) {
  printf("CITIES\n");
  printf("plateNumber: %d\n", cities[i].plateNumber);
  printf("name: %s\n", cities[i].name);
  printf("area: %lf\n", cities[i].area);
  printf("population: %d\n", cities[i].population);
  printf("populationDensity: %d\n", cities[i].populationDensity);
  printf("cityCenterPopulation: %d\n", cities[i].cityCenterPopulation);
  printf("region: %s\n", cities[i].region);
  printf("latitude: %lf\n", cities[i].latitude);
  printf("longitude: %lf\n", cities[i].longitude);
}

int main(int argc, char const *argv[]) {
  readFile();
  return 0;
}

How can I solve this problem?


Solution

  • I believe, the problem is due to the missing data type before cities[] in

     void printCityData(cities[], int i)
    

    which should be

     void printCityData(struct City cities[], int i)
    

    Remember, cities is a variable, not a datatype. FWIW, in case of forward declaration, you can actually omit the variable name but not the variable type.

    That said, actually, cities being a global variable here, you don't need to pass that around as parameter. You can reduce the function signature as

    void printCityData(int i) {
    

    and call it like

     printCityData(i);