2015-12-14 5 views
2

У меня возникли проблемы с указателями и динамическими массивами. У меня есть функция, которую я вызываю, что делает связку, как удаление элемента из динамического массива, что приводит меня к перераспределению памяти на один из этих динамических массивов. Проблема в том, что я вызываю функции внутри функций, и я не могу вернуть все мои значения в Main. Так как я не могу вернуть 2 значения, как я могу это сделать?Возвращение двух указателей на динамические массивы

structure1* register(structure1 *registerArray,structure2 *waitingList, int counter){ 
    //Bunch of code in here 
    registerArray = realloc(inspecao, (counter)+1); 
    waitingList = eliminate(waitingList, 5, counter); //Doesn't matter what it does really 

    return registerArray; 
} 


structure1* eliminate(structure1 *arrayToEliminateFrom, int positionToEliminate, int *counter){ 

    //The code for this doesn't matter 
    //All I do is eliminate an ellement and reallocate it 
    arrayToEliminateFrom = realloc(arrayToEliminateFrom, (*counter-1)*sizeof(structure1)) 
    return arrayToEliminateFrom; 
} 

Как вы можете видеть, я не знаю, как вернуть указатель на динамический массив waitingList на Майне. Как я могу это сделать? Я искал везде. Помощь

+0

Я не уверен, что вы просите, но любой «возвращение п значений» проблема может быть решена путем передачи указателя на п переменных быть написано. – Alex

+0

Это не решило проблему. Я не знаю, как иметь указатель на указатель. –

+0

Я собираюсь дать ответ на вашу реальную проблему, но 'register' на самом деле является старым атрибутом C _keyword_, таким как' extern' или 'static'. В наши дни не используется много, но все же незаконно как символ, поэтому просто переименуйте его (например, registerx или xregister или register_array). –

ответ

3

Хорошо, вот два способа сделать это.

Первый, основанный на ваш комментарий, что вы думаете, что ваш инструктор хотел бы:

void 
xregister(structure1 **registerArray, int *arrayCount, 
    structure1 **waitingList, int *waitCount) 
{ 

    // Bunch of code in here 

    *arrayCount += 1; 
    *registerArray = realloc(inspecao, *arrayCount * sizeof(structure1)); 

    // Doesn't matter what it does really 
    eliminate(waitingList, 5, waitCount) 
} 

void 
eliminate(structure1 **arrayToEliminateFrom, int positionToEliminate, 
int *count) 
{ 

    // The code for this doesn't matter 

    *count -= 1; 

    // All I do is eliminate an ellement and reallocate it 
    *arrayToEliminateFrom = realloc(*arrayToEliminateFrom, 
     *count * sizeof(structure1)) 
} 

Вот что предлагали Роберто и я. На самом деле, мой метод массива с переменной переменной длиной, который может быть полностью обобщен с некоторыми небольшими изменениями поля. В некотором смысле, поскольку вы уже используете структуру, я не понимаю, почему ваш инструктор возражал бы против этого, поскольку это стандартный способ сделать это. Менее громоздки и чище.

struct vector { 
    int vec_count; 
    structure1 *vec_base; 
}; 

void 
xregister(vector *registerArray,vector *waitingList) 
{ 

    // Bunch of code in here 

    registerArray->vec_count += 1; 
    registerArray->vec_base = realloc(registerArray->vec_base, 
     registerArray->vec_count * sizeof(structure1)); 

    // Doesn't matter what it does really 
    eliminate(waitingList, 5) 
} 

void 
eliminate(vector *arrayToEliminateFrom, int positionToEliminate) 
{ 

    // The code for this doesn't matter 

    arrayToEliminateFrom->vec_count -= 1; 

    // All I do is eliminate an ellement and reallocate it 
    arrayToEliminateFrom->vec_base = realloc(arrayToEliminateFrom->vec_base, 
     arrayToEliminateFrom->vec_count * sizeof(structure1)) 
} 

Вот еще более компактный способ:

struct vector { 
    int vec_count; 
    structure1 *vec_base; 
}; 

void 
vecgrow(vector *vec,int inc) 
{ 

    vec->vec_count += inc; 
    vec->vec_base = realloc(vec->vec_base,vec->vec_count * sizeof(structure1)); 
} 

void 
xregister(vector *registerArray,vector *waitingList) 
{ 

    // Bunch of code in here 

    vecgrow(registerArray,1); 

    // Doesn't matter what it does really 
    eliminate(waitingList, 5) 
} 

void 
eliminate(vector *arrayToEliminateFrom, int positionToEliminate) 
{ 

    // The code for this doesn't matter 

    vecgrow(arrayToEliminateFrom,-1); 
} 
+0

Спасибо, Крейг, ты мужчина. –

0

вы должны попытаться сделать более высокую структуру, которая содержит как указатели и передавать и возвращать эту структуру Разногласия между вашими функциями, потому что функция может возвращать только один объект/структуру, но ваша структура/объект может содержать больше объектов/структур

+0

У вас есть правильная идея [я собирался предложить то же самое]. Может быть полезно использовать это для ОП, перекодируя его. (например). С дополнительной структурой большинство funcs теперь могут возвращать void и [need] принимать только один аргумент. Это может быть не очевидно для OP –

+0

Спасибо всем за ваши ответы. Я не думаю, что мои учителя хотят, чтобы я это сделал. Разве нет, где я могу непосредственно редактировать указатель в главном? –

+0

Я думал, что, передав указатель динамического массива функции, он автоматически изменится. Но, похоже, он делает копию и не меняет оригинал. Как передать ссылку или указатель на указатель? –