Существует некоторый двумерный массив типа long double:
long double myarray[2][10];
Как правильно передать его в качестве параметра в функцию:
void myfunc(long double** myarray);
?
Правилен ли следующий код:
void myfunc(long double** myarray)
{
int i, j;
long double val;
for (i=0; i<2; i++)
{
val = myarray[i][j];
// обработка переменной val;
}
}
//...long double myarray[2][10];
long double* p &myarray[0][0];
myfunc(&p);
?
1613 г. = 2024 г.
Re: Передача двумерного массива в качестве параметра функции
Ужас какой.
Сюда передаётся указатель на p. Внутри функции при попытке взять myarray[1] она попытается разыменовать адрес, соседний с p. Скрашится сразу.
Функция внутри ничего не знает о размерности массива, а без неё двойной индекс не взять.
Хотя бы так сделай:
long double* p[2] = (&myarray[0][0],&myarray[1][0]);
myfunc(p);
Здравствуйте, RussianFellow, Вы писали:
RF>Существует некоторый двумерный массив типа long double: RF>
RF>long double myarray[2][10];
RF>
RF>Как правильно передать его в качестве параметра в функцию: RF>
RF>void myfunc(long double** myarray);
RF>
Сейчас на дворе 2017 год. 2-х мерные массивы в C-стиле из 70-х годов сейчас использовать тяжело и небезопасно.
Наверное именно в этом случае лучше так (при отладке быстро выловите все ошибки индексации по крайней мере):
На тесты отвечаешь?
RF>Существует некоторый двумерный массив типа long double:
RF> RF>long double myarray[2][10]; RF>
RF>Как правильно передать его в качестве параметра в функцию:
RF> RF>void myfunc(long double** myarray); RF>
RF>?
Выглядит безобразно, но можно, если ничего не боишься, то нужно хотя бы указать размерность массивов. Если размерность всегда постоянная и эта постоянность гарантирована, то проще передавать матрицу как одномерный массив, а обращение к элементам вести через как-нибудь get(i,j)
RF>Правилен ли следующий код:
RF> RF>void myfunc(long double** myarray) RF>{ RF> int i, j; RF> long double val; RF> for (i=0; i<2; i++) RF> { RF> val = myarray[i][j]; RF> // обработка переменной val; RF> } RF>} RF>
Нет, упадет сразу, но это и к лучшему.
Чему равен j? Возвращаясь назад, из чего следует, что количество строк больше или равно 2?
RF>
RF>long double myarray[2][10]; RF>long double* p &myarray[0][0]; RF>
хотя бы так, чтобы не ругался компилятор
long double* p = (long double*)&myarray[0][0];
можно и так:
long double** p = (long double**)myarray;
RF> RF>myfunc(&p); RF>
RF>?
Re[2]: Передача двумерного массива в качестве параметра функции
Здравствуйте, RussianFellow, Вы писали:
RF>Существует некоторый двумерный массив типа long double: RF>Как правильно передать его в качестве параметра в функцию:
RF>Как правильно передать его в качестве параметра в функцию: RF>
RF>void myfunc(long double** myarray);
RF>
В C/C++ любые массивы передаются в функцию как указатели на начальный элемент. Элементом двумерного массива является одномерный массив. А значит, в фунцию может передаваться как указатель на одномерный массив соответствующей размерности:
void myfunc(long double (*arr)[10]);
Это объявление полностью эквивалентно следующему
void myfunc(long double arr[][10]);
Распространенным заблужением является использование реальной величины второй размерности в квадратных скобках ([2] в данном случае). На самом деле, вместо двойки здесь можно указать любое потолочное значение, так как компилятор все равно его проигнорирует. Повторюсь, оба объявления, показанные выше, эквивалентны.
В С++ существует возможность передать двумерный массив по ссылке, с сохранением обеих размерностей, как советовал Анатолий Широков:
void myfunc(long double (&arr)[2][10]);
--
Не можешь достичь желаемого — пожелай достигнутого.