El siguiente es un código de ejemplo, sé cómo pasar una matriz a function_2 directamente. ahora mi pregunta es cómo debo pasar una matriz a function_2 que está dentro de la función_1, y cuáles son los parámetros deberían estar en la función_1 como marqué a continuación. Agradezco cualquier ayuda.

void function_2(int ***array)
{
    //do something with array
}

void function_1(/* what should be */)
{
    function_2(/* what should be */);
}

int main()
{
    int ***array;
    function_2(array);

    function_1(array);
}
0
MYtry 29 dic. 2016 a las 19:54

3 respuestas

La mejor respuesta

Puede pasarlo directamente utilizando el mismo tipo de puntero multinivel, donde el puntero simplemente se pasa por valor. Sin embargo, también debe pasar el tamaño de las dimensiones de la matriz, ya que una matriz primitiva no almacena esa información internamente. De lo contrario, dentro de la función no tendría forma de saber qué tan grande es la matriz. std::size_t es el mejor tipo para indicar el tamaño de una estructura de datos.

void function_2(int ***array, std::size_t pages, std::size_t cols, std::size_t rows)
{
    //do something with array
}

void function_1(int ***array, std::size_t pages, std::size_t cols, std::size_t rows)
{
    function_2(array, pages, cols, rows);
}

Sin embargo, no deberías hacer esto. A menos que absolutamente tenga que usar una matriz primitiva, no lo haga . Utilice std::vector en su lugar. Almacena el tamaño internamente, por lo que no tiene que pasar varios parámetros. vector también ofrece una amplia variedad de otras mejoras y controles de seguridad. Es la alternativa estándar a las matrices primitivas en C ++.

Así es como puede usar un vector tridimensional de entradas:

void function_2
(std::vector< std::vector< std::vector<int> > > &myVector)  // pass by reference
{
    /* do stuff */
}

void function_1
(std::vector< std::vector< std::vector<int> > > &myVector)  // pass by reference
{
    function_2(myVector);
}

int main()
{
    std::size_t pages = /* num */;
    std::size_t cols = /* num */;
    std::size_t rows = /* num */;

    std::vector< std::vector< std::vector<int> > > myVector
            (pages, std::vector< std::vector<int> >(cols, std::vector<int>(rows, 0)));

    function_2(myVector);

    function_1(myVector);
}
3
Travis 29 dic. 2016 a las 17:55

Debe tener cuidado al enviar un puntero como parámetro en su función. ¿Por qué no usas vector en su lugar?

std::vector<std::vector<std::vector<int>>> function_2(std::vector<std::vector<std::vector<int>>> array)
{
    //do something with array
    return array;
}

std::vector<std::vector<std::vector<int>>>  function_1(std::vector<std::vector<std::vector<int>>> array)
{
    function_2(array);
    return array;
}

int main()
{
    std::vector<std::vector<std::vector<int>>> array;
    function_2(array);
    function_1(array);
}
0
Max Rafiandy 29 dic. 2016 a las 17:23

El tipo int*** debe mantenerse consistente, por lo que el parámetro para la función uno debe ser int ***array, y debe llamar a la función dos de esta manera: function_2(array).

Código completo:

void function_2(int ***array)
{
    //do something with array
}

void function_1(int ***array)
{
    function_2(array);
}

int main()
{
    int ***array;
    function_2(array);

    function_1(array);
}
0
Ian S. 29 dic. 2016 a las 17:03