2014-11-27 4 views
-4

Я столкнулся с проблемой с возвратом типа. Я использовал ниже статью для реализации вектора, и я хотел добавить еще одно поле в структуру.C язык возврата типа

http://www.happybearsoftware.com/implementing-a-dynamic-array.html

Я добавил его, как показано ниже:

typedef struct { 
    int size;  // slots used so far 
    int capacity; // total available slots 
    int *data;  // array of integers we're storing 
    char* dvalue ; 
} Vector; 

Вот definiation в заголовочном файле

char* vector_get(Vector *vector, int index); 

Вот код в vector.c

char* vector_get(Vector *vector, int index) { 
    printf("Passed 1"); 
    if (index >= vector->size || index < 0) { 
    printf("Index %d out of bounds for vector of size %d\n", index, vector->size); 
    exit(1); 
    } 
// it shows red underline but there is no compilation error but only run time. 
    return vector->dvalue[index]; 
} 

Я использую Visual Studio 2012.

Пожалуйста, помогите мне, где я ошибаюсь, почему я не могу получить данные, и это сбой.

Пожалуйста, помогите мне.

Благодаря

Вот дополнительная информация, как я установил значение. Я должен хранить значения int и string, а затем извлекать их тоже.

char* vector_get(Vector *vector, int index); 

void vector_set(Vector *vector, int index, int value,char* dvalue); 

void vector_set(Vector *vector, int index, int value, char* dvalue) { 
    // zero fill the vector up to the desired index 
    while (index >= vector->size) { 
    vector_append(vector, 0); 
    } 

    // set the value at the desired index 
    vector->data[index] = value; 
    vector->dvalue[index] = dvalue; 
} 

char* vector_get(Vector *vector, int index) { 
    printf("Passed 1"); 
    if (index >= vector->size || index < 0) { 
    printf("Index %d out of bounds for vector of size %d\n", index, vector->size); 
    exit(1); 
    } 

    return vector->dvalue[index]; // it shows red underline but there is no compilation error but only run time. 
} 
+3

'вектор-> dvalue' является' 'символ *, так что' вектор-> dvalue [индекс] 'является 'char', но ваша функция должна повторить n a 'char *', поэтому сообщение об ошибке. –

+0

Мне нужно сохранить и вернуть строку, поэтому какой тип данных я должен использовать? Пожалуйста, порекомендуйте? – Bertrand

+1

На самом деле информации недостаточно, чтобы сказать вам, что делать точно. Один из вариантов - «return vector-> dvalue;», но другим может быть изменение 'char * dvalue;' на 'char ** dvalue;'. Не зная, что должен представлять 'dvalue', и как он создается и модифицируется, невозможно сказать, что правильно. Название функции меня озадачило; вы сохраняете вектор 'int', но ваш' vector_get() 'возвращает' char * '- честно говоря, я не знаю, что это такое, что представляет собой' dvalue'. –

ответ

1

Во-первых, вам необходимо изменить тип dvalue к char **:

typedef struct { 
    int size;  // slots used so far 
    int capacity; // total available slots 
    int *data;  // array of integers we're storing 
    char** dvalue; // <--- Notice the change here 
} Vector; 

Затем вам нужно выделить место для dvalue таким же образом, вы выделить пространство для data. Вы не показать это в любом из вашего кода, но по-видимому, у вас есть что-то вроде этого:

vector->data = malloc(vector->capacity * sizeof(int)); 

Таким образом, вы будете также нуждаться в этом:

vector->dvalue = malloc(vector->capacity * sizeof(char *)); 

Наконец, когда вы установите dvalue, вам может понадобиться, чтобы сделать копию строки, в зависимости от того, что вы передаете, чтобы vector_set():

// Possibly wrong if dvalue is not persistent. 
// vector->dvalue[index] = dvalue; 

// Make allocated copy instead. If you don't have strdup(), write it yourself. 
vector->dvalue[index] = strdup(dvalue); 
+0

Это похоже на то, что я ожидал бы, за исключением того, что я уверен, что множителем в распределениях является 'vector-> capacity', а не' vector-> size' (но вы говорите «что-то вроде этого» и образец кода является самосогласованным). Код деструктора, а также размер и размер кода тоже потребует некоторой осторожности, но не является частью этого вопроса. –

+0

Большое спасибо. Это сработало – Bertrand

Смежные вопросы