将两个指针返回到动态数组

时间:2022-01-15 07:19:32

I am having a bunch of problems with pointers and dynamic arrays here. I have a function that I call, that does a bunch a stuff, like removing an ellement from the dynamic array , which leads me to reallocating memory to one of those dynamic arrays. The problem is I call functions within functions, and I can't return all my values properly to the Main. Since I can't return 2 values, how can I do this?

我在这里遇到了一些关于指针和动态数组的问题。我有一个函数,我调用,它做了很多东西,比如从动态数组中删除一个元素,这导致我将内存重新分配给其中一个动态数组。问题是我在函数中调用函数,并且我无法将所有值正确地返回到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;
}

As you can see , I don't know how to return the pointer to the waitingList dynamic array to the Main. How can I do this? I have searched everywhere. Help

如您所见,我不知道如何将指向waitingList动态数组的指针返回给Main。我怎样才能做到这一点?我到处搜寻。帮帮我

2 个解决方案

#1


3  

Okay, here are two ways to do it.

好的,这有两种方法可以做到。

The first is, based upon your comment, what you think your instructor would want:

首先,根据您的评论,您认为您的教师会想要什么:

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

Here is what Roberto and I were suggesting. Actually, mine's a general variable length array approach that can be fully generalized with some slight field changes. In a way, since you're already using a struct, I can't see why your instructor would object to this as it's a standard way to do it. Less cumbersome and cleaner.

这就是罗伯托和我的建议。实际上,我的是一种通用的可变长度数组方法,可以通过一些轻微的字段变化进行完全推广。在某种程度上,由于你已经在使用结构,我无法理解为什么你的教师会反对这一点,因为这是一种标准的方法。不那么笨重和清洁。

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

Here's an even more compact way:

这是一个更紧凑的方式:

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

#2


0  

you should try to do an higher structure that contains both pointers and pass and return that structure beetween your functions, because function can return only one object/structure, but your structure/object can contain more objects/structures

你应该尝试做一个包含指针的更高结构,并传递并返回你的函数之间的结构,因为函数只能返回一个对象/结构,但你的结构/对象可以包含更多的对象/结构

#1


3  

Okay, here are two ways to do it.

好的,这有两种方法可以做到。

The first is, based upon your comment, what you think your instructor would want:

首先,根据您的评论,您认为您的教师会想要什么:

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

Here is what Roberto and I were suggesting. Actually, mine's a general variable length array approach that can be fully generalized with some slight field changes. In a way, since you're already using a struct, I can't see why your instructor would object to this as it's a standard way to do it. Less cumbersome and cleaner.

这就是罗伯托和我的建议。实际上,我的是一种通用的可变长度数组方法,可以通过一些轻微的字段变化进行完全推广。在某种程度上,由于你已经在使用结构,我无法理解为什么你的教师会反对这一点,因为这是一种标准的方法。不那么笨重和清洁。

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

Here's an even more compact way:

这是一个更紧凑的方式:

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

#2


0  

you should try to do an higher structure that contains both pointers and pass and return that structure beetween your functions, because function can return only one object/structure, but your structure/object can contain more objects/structures

你应该尝试做一个包含指针的更高结构,并传递并返回你的函数之间的结构,因为函数只能返回一个对象/结构,但你的结构/对象可以包含更多的对象/结构