3

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);
    }

}
4

3 回答 3

5

The error message is caused because you have an incomplete declaration of struct route. i.e. somewhere you have a line that says

struct route;

with 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 route for 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 route in its library already, so you may have to rename your struct to avoid a clash.

于 2012-05-01T09:40:25.483 回答
2

You need to include the header file that defines struct route.
I'm not sure which header this is, and it may differ between Linux and Windows.

In Linux, net/route.h defines struct rtentry, which may be what you need.

于 2012-05-01T08:40:09.910 回答
0

As far as I know C (at least GCC won't) doesn't allow you to have variables as array indexes, that's why it's producing that error. Try a constant instead.

It doesn't happen with multi dimensional arrays because row is not complusary in multi dim arrays but in case of single dim arrays array index must be a variable.

Some compilers do allow such behaviour that's why it isn't producing an error in windows.

于 2012-05-01T08:36:40.483 回答