2.10 Мой компилятор ругается, когда я передаю двумерный массив функции,
ожидающей указатель на указатель.
О: Правило, по которому массивы превращаются в указатели не может
применяться рекурсивно. Массив массивов (т.е. двумерный массив в С)
превращается в указатель на массив, а не в указатель на указатель.
Указатели на массивы могут вводить в заблуждение и применять их нужно
с осторожностью. (Путаница еще более усугубляется тем, что существуют
некорректные компиляторы, включая некоторые версии pcc и полученные
на основе pcc программы lint, которые неверно вопринимают присваивание
многоуровневым указателям многомерных массивов.) Если вы передаете
двумерный массив функции:
int array[NROWS][NCOLUMNS];
f(array);
описание функции должно соответствовать
f(int a[][NCOLUMNS]) {...}
или
f(int (*ap)[NCOLUMNS]) {...} /* ap - указатель на массив */
В случае, когда используется первое описание, компилятор неявно
осуществляет обычное преобразование "массива массивов" в "указатель
на массив"; во втором случае указатель на массив задается явно.
Так как вызываемая функция не выделяет место для массива, нет
необходимости знать его размер, так что количество "строк" NROWS
может быть опущено. "Форма" массива по-прежнему важна, так что
размер "столбца" NCOLUMNS должен быть включен (а для массивов
размерности 3 и больше, все промежуточные размеры).
Если формальный параметр функции описан как указатель на указатель,
то передача функции в качестве параметра двумерного массива будет,
видимо, некорректной.
Смотри: K&R I Разд.5.10 c. 110; K&R II Разд.5.9 c. 113.
2.11: Как писать функции, принимающие в качестве параметра двумерные
массивы, "ширина" которых во время компиляции неизвестна?
О: Это непросто. Один из путей - передать указатель на элемент [0][0]
вместе с размерами и затем симулировать индексацию "вручную":
f2(aryp, nrows, ncolumns)
int *aryp;
int nrows, ncolumns;
{ ... array[j] это aryp[i * ncolumns + j] ... }
Этой функции массив из вопроса 2.10 может быть передан так:
f2(&array[0][0], NROWS, NCOLUMNS);
Нужно, однако, заметить, что программа, выполняющая индексирование
многомерного массива "вручную" не полностью соответствует стандарту
ANSI C; поведение (&array[0][0])[x] не определено при x> NCOLUMNS.
gcc разрешает объявлять локальные массивы, которые имеют размеры,
задаваемые аргументами функции, но это - нестандартное расширение.
См. также вопрос 2.15.
Передача параметров
Есть ф-я void Rotation(int ar[2][2]).
При передаче массива ar2 в ф-ию возникает ошибка.
Как правильно передать?
Я передаю так:
Rotation(ar2);
Цитата:
Originally posted by Stalcer
Есть, глобально объявленный массив ar2[2][2].
Есть ф-я void Rotation(int ar[2][2]).
При передаче массива ar2 в ф-ию возникает ошибка.
Как правильно передать?
Я передаю так:
Rotation(ar2);
Есть, глобально объявленный массив ar2[2][2].
Есть ф-я void Rotation(int ar[2][2]).
При передаче массива ar2 в ф-ию возникает ошибка.
Как правильно передать?
Я передаю так:
Rotation(ar2);
Ошибку написать тебе в голову не пришло?
Цитата:
Originally posted by kot_
Ошибку написать тебе в голову не пришло?
Ошибку написать тебе в голову не пришло?
Прошу прощения. Вылетает на этапе выполнения:
Debug Error
The value of ESP was not properly saved across a function call.
Код:
void Rotation(int (*ar)[2], int direct)
//передаю глобально объявленный массив:
Rotation(ar1, 1);
//передаю глобально объявленный массив:
Rotation(ar1, 1);
и так:
Код:
void Rotation(int ar[][2], int direct)
//передаю глобально объявленный массив:
Rotation(ar1, 1);
//передаю глобально объявленный массив:
Rotation(ar1, 1);
Результат один:
Код:
Debug Error
The value of ESP was not properly saved across a function call.
The value of ESP was not properly saved across a function call.
Цитата:
Originally posted by Stalcer
Пробовал две конструкции:
и так:
Результат один:
Пробовал две конструкции:
Код:
void Rotation(int (*ar)[2], int direct)
//передаю глобально объявленный массив:
Rotation(ar1, 1);
//передаю глобально объявленный массив:
Rotation(ar1, 1);
и так:
Код:
void Rotation(int ar[][2], int direct)
//передаю глобально объявленный массив:
Rotation(ar1, 1);
//передаю глобально объявленный массив:
Rotation(ar1, 1);
Результат один:
Код:
Debug Error
The value of ESP was not properly saved across a function call.
The value of ESP was not properly saved across a function call.
А ты уверен, что дело точно в объявлении функции?
Цитата:
Originally posted by mail0
А ты уверен, что дело точно в объявлении функции?
А ты уверен, что дело точно в объявлении функции?
уверен
Цитата:
Originally posted by mail0
А ты уверен, что дело точно в объявлении функции?
А ты уверен, что дело точно в объявлении функции?
Я что то пропустил или не увидел:
Rotation(&ar2[2][2],1) - такой вариант?
Цитата:
Originally posted by kot_
Я что то пропустил или не увидел:
Rotation(&ar2[2][2],1) - такой вариант?
Я что то пропустил или не увидел:
Rotation(&ar2[2][2],1) - такой вариант?
Вылетает на этапе компиляции.
Вообщем вложил исходник с ошибкой (отметил комментом). Заранее благодарен за исправление.
Для запуска программы нужно нажать любую клавишу, вылетает при нажатии enter (13).
int temp[2];
а записываеш в temp[2] =
:) вот и все эррорры
PS. int temp[2] означает что temp[0].. temp[1]
Цитата:
Originally posted by Matush
Ты описал:
int temp[2];
а записываеш в temp[2] =
:) вот и все эррорры
PS. int temp[2] означает что temp[0].. temp[1]
Ты описал:
int temp[2];
а записываеш в temp[2] =
:) вот и все эррорры
PS. int temp[2] означает что temp[0].. temp[1]
Блин, на такой фигне отловиться :D
Главное,пишет что ошибка связана с параметрами.
Спасибо всем!,кто принимал участие, тема закрыта :D