Ошибка при передаче массива 2D char* в функцию

Я пытаюсь передать 2D-массив char* в функцию. Я получаю эту ошибку:

"cannot convert 'char* (*)[2]' to 'char***' for argument '1' to 'int foo(char***)'"

Код:

int foo(char*** hi)
{
    ...
}

int main()
{
    char* bar[10][10];
    return foo(bar);
}

person CookieOfFortune    schedule 12.08.2009    source источник


Ответы (4)


Ваш массив представляет собой массив из 10 char* массивов, каждый из которых хранит 10 char* указателей.

Это означает, что при передаче его в функцию, параметр которой не является ссылкой, он преобразуется в pointer to an array of 10 char*. Таким образом, правильный тип параметра функции

int foo(char* (*hi)[10])
{
    ...
}

int main()
{
    char* bar[10][10];
    return foo(bar);
}

Подробнее читайте в этой домашней душераздирающей записи на Stackoverflow.

person Johannes Schaub - litb    schedule 12.08.2009

Если размер вашего массива не изменится, вам лучше использовать ссылки на массив в вашей функции. Это безопаснее и чище. Например:

int foo(char* (&hi)[10][10] )
{
 int return_val = 0;
 //do something
 //hi[5][5] = 0;
 return return_val;
}

int main()
{
    char* bar[10][10];
    return foo(bar);
}
person Carl    schedule 12.08.2009

Не пора ли ввести понятие ссылок?

Навскидку, я бы сказал, что на вызывающей стороне потребуется дополнительный «&». Как говорится, это опасная игра.

Зачем вы это выделяете? Почему он в стеке? Почему вы вводите его в char*** в принимающей функции?

Джейкоб

person TheJacobTaylor    schedule 12.08.2009

пытаться

int foo(char* hi[10][10])
{
}

int main()
{
    char* bar[10][10];
    return foo(bar);
}

В качестве альтернативы используйте ссылку, вектор векторов или boost::multi_array.

person Andrew Prock    schedule 12.08.2009
comment
Я бы предпочел не использовать статические размеры массива для foo. - person CookieOfFortune; 13.08.2009
comment
@CookieOfFortune, обратите внимание, что первые 10 не учитываются компилятором. Параметр имеет тот же тип, что и в моем ответе. - person Johannes Schaub - litb; 13.08.2009