I’m trying to compile a program in Ubuntu 11.04 that works well in Windows but it gives the above error. I have added a comment to the line that is causing the error. Here’s the code:
route_input() {
int num_routes;//Variable to act as the loop counter for the loop getting route details
int x;
char route_id[3];
char r_source[20];
char r_destination[20];
int r_buses;
printf("Please enter the number of routes used: \n");
scanf("%d", &num_routes);
char routes_arr[num_routes][10];//An array to hold the details of each route
printf("\nNumber of routes is %d\n", num_routes);
struct route r[num_routes];//An array of structures of type route (This line causes the error)
fflush(stdin);
for (x = num_routes; x > 0; x--) {
printf("\nEnter the route number: ");
scanf("%s", r[x].route_num);
printf("Route number is %s", r[x].route_num);
printf("\nEnter the route source: ");
fflush(stdin);
scanf("%s", r[x].source);
printf("Source = %s", r[x].source);
printf("\nEnter the route destination: ");
fflush(stdin);
gets(r[x].destination);
printf("Destination = %s", r[x].destination);
printf("\nEnter the number of buses that use this route: ");
scanf("%d", &r[x].num_of_buses);
printf("Number of buses = %d", r[x].num_of_buses);
}
for (x = num_routes; x > 0; x--) {
printf("\n\n+++Routes' Details+++\nRoute number = %s, Source = %s, Destination = %s, Number of buses for this route = %d\n", r[x].route_num, r[x].source, r[x].destination, r[x].num_of_buses);
}
}
The error message is caused because you have an incomplete declaration of
struct route. i.e. somewhere you have a line that sayswith no specification of what is in the struct. This is perfectly legal and allows the compiler to know the struct exists before it knows what is in it. That allows it to define pointers to items of type
struct routefor opaque types and for forward declarations.However, the compiler cannot use an incomplete type as the elements for an array because it needs to know the size of the struct to calculate the amount of memory needed for the array and to calculate offsets from indexes.
I’d say you have forgotten to include the header that defines your route struct. Also, it’s possible that Ubuntu has an opaque type called
struct routein its library already, so you may have to rename your struct to avoid a clash.