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

}
6
  • 8
    Do not fflush(stdin), it is undefined behavior. Commented May 1, 2012 at 7:57
  • possible duplicate of stackoverflow.com/questions/2274550/… Commented May 1, 2012 at 7:57
  • 4
    What is struct route, where is it defined? Commented May 1, 2012 at 7:59
  • As @deebee pointed out, if your struct route is a recursive data structure with non-pointer self-referential members, you are likely to hit the incomplete type issue. Commented May 1, 2012 at 8:06
  • fflush(stdout) instead if you want to make sure the messages not ending in newlines do appear. Commented May 1, 2012 at 9:10

3 Answers 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.

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks for your help. I included the header file containing the route struct definition and it worked correctly.
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.

Comments

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.

14 Comments

If that was the problem, char routes_arr[num_routes][10] would fail also. So he's probably using a c99 compiler.
as i said multidim arrays row variable is optional and as far as i know ubuntu11.04 GCC does give that error it isnt based on C99
My point is that he's obviously using a compiler that supports a variable as dimension (or the routes_arr would fail). So his problem in defining r can't be what you say.
But 2D arrays dont need a row compulsarily that's why it isnt failing there...moreover route can be just any structure he has defined earlier it doesnt really need a header file
ive tested it check it urself
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.