Why do I keep getting "error: variable has incomplete type 'struct intVec'?

Jamie Nguyen picture Jamie Nguyen · Apr 19, 2017 · Viewed 23.3k times · Source

I'm doing an assignment for my data structures class and I have very little experience with C structures and C in general. This is the .h file that I was given to do the assignment:

#ifndef C101IntVec
#define C101IntVec

typedef struct IntVecNode* IntVec;

static const int intInitCap = 4;

int intTop(IntVec myVec);

int intData(IntVec myVec, int i);

int intSize(IntVec myVec);

int intCapacity(IntVec myVec);

IntVec intMakeEmptyVec(void);

void intVecPush(IntVec myVec, int newE);

void intVecPop(IntVec myVec);

#endif

This is the .c implementation that I've made:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "intVec.h"

typedef struct IntVecNode {
    int* data;
    int sz;         // Number of elements that contain data
    int capacity;   // How much is allocated to the array
} IntVecNode;

typedef struct IntVecNode* IntVec;

//static const int intInitCap = 4;

int intTop(IntVec myVec) {
    return *myVec->data;
}

int intData(IntVec myVec, int i) {
    return *(myVec->data + i);
}

int intSize(IntVec myVec) {
    return myVec->sz;
}

int intCapacity(IntVec myVec) {
    return myVec->capacity;
}

IntVec intMakeEmptyVec(void) {
    IntVec newVec = malloc(sizeof(struct IntVecNode));
    newVec->data = malloc(intInitCap * sizeof(int));
    newVec->sz = 0;
    newVec->capacity = intInitCap;
    return newVec;
}

void intVecPush(IntVec myVec, int newE) {
    if (myVec->sz >= myVec->capacity) {
        int newCap = myVec->capacity * 2;
        myVec->data = realloc(myVec->data, newCap * sizeof(int));
    } else {
        for (int i = 0; i < myVec->capacity; i++) {
            *(myVec->data + i) = *(myVec->data + i + 1);
        }
        myVec->data = &newE;
    }
    myVec->sz++;
}

void intVecPop(IntVec myVec) {
    for (int i = 0; i < myVec->capacity; i++) {
        *(myVec->data - i) = *(myVec->data - i + 1);
    }
    myVec->sz--;
}

This is the test file:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "intVec.c"

int main() {
    struct IntVec v;
    v.intVecPush(v,0);

    return 0;
}

Every time I run the test file, I get the error:

test.c:7:16: error: variable has incomplete type 'struct IntVec'
        struct IntVec v;
                      ^
test.c:7:9: note: forward declaration of 'struct IntVec'
        struct IntVec v;
               ^
1 error generated.

I've tried changing the #include "intVec.c" to "intVec.h" in the test file, however that produces the same error. What would I need to change in order to not get this error?

Answer

Vlad from Moscow picture Vlad from Moscow · Apr 19, 2017

There is no structure definition struct IntVec.

So the compiler is unable to define the object v

struct IntVec v;

I think you mean

IntVec v;

And this call

v.intVecPush(v,0);

is invalid and does not make sense. I think there should be something like

IntVec v = intMakeEmptyVec();
intVecPush(v,0);

instead of

struct IntVec v;
v.intVecPush(v,0);

Also it is a bad idea to include the whole module in another module. You should place the structure definition in the header and include this header in the compilation unit with main.

That is move these definitions

typedef struct IntVecNode {
    int* data;
    int sz;         // Number of elements that contain data
    int capacity;   // How much is allocated to the array
} IntVecNode;

typedef struct IntVecNode* IntVec;

in the header.