Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Передача параметров

990
30 октября 2005 года
Stalcer
137 / / 15.08.2004
Есть, глобально объявленный массив ar2[2][2].
Есть ф-я void Rotation(int ar[2][2]).
При передаче массива ar2 в ф-ию возникает ошибка.
Как правильно передать?

Я передаю так:
Rotation(ar2);
1
30 октября 2005 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by Stalcer
Есть, глобально объявленный массив ar2[2][2].
Есть ф-я void Rotation(int ar[2][2]).
При передаче массива ar2 в ф-ию возникает ошибка.
Как правильно передать?

Я передаю так:
Rotation(ar2);


Ошибку написать тебе в голову не пришло?

1.9K
30 октября 2005 года
mail0
137 / / 09.05.2005
Код:
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.
990
31 октября 2005 года
Stalcer
137 / / 15.08.2004
Цитата:
Originally posted by kot_
Ошибку написать тебе в голову не пришло?



Прошу прощения. Вылетает на этапе выполнения:

Debug Error
The value of ESP was not properly saved across a function call.

990
31 октября 2005 года
Stalcer
137 / / 15.08.2004
Пробовал две конструкции:

 
Код:
void Rotation(int (*ar)[2], int direct)

//передаю глобально объявленный массив:
Rotation(ar1, 1);

и так:
 
Код:
void Rotation(int ar[][2], int direct)

//передаю глобально объявленный массив:
Rotation(ar1, 1);


Результат один:
 
Код:
Debug Error
The value of ESP was not properly saved across a function call.
1.9K
31 октября 2005 года
mail0
137 / / 09.05.2005
Цитата:
Originally posted by Stalcer
Пробовал две конструкции:

 
Код:
void Rotation(int (*ar)[2], int direct)

//передаю глобально объявленный массив:
Rotation(ar1, 1);

и так:
 
Код:
void Rotation(int ar[][2], int direct)

//передаю глобально объявленный массив:
Rotation(ar1, 1);


Результат один:
 
Код:
Debug Error
The value of ESP was not properly saved across a function call.


А ты уверен, что дело точно в объявлении функции?

990
31 октября 2005 года
Stalcer
137 / / 15.08.2004
Цитата:
Originally posted by mail0
А ты уверен, что дело точно в объявлении функции?


уверен

1
31 октября 2005 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by mail0
А ты уверен, что дело точно в объявлении функции?


Я что то пропустил или не увидел:
Rotation(&ar2[2][2],1) - такой вариант?

990
31 октября 2005 года
Stalcer
137 / / 15.08.2004
Цитата:
Originally posted by kot_
Я что то пропустил или не увидел:
Rotation(&ar2[2][2],1) - такой вариант?


Вылетает на этапе компиляции.
Вообщем вложил исходник с ошибкой (отметил комментом). Заранее благодарен за исправление.

Для запуска программы нужно нажать любую клавишу, вылетает при нажатии enter (13).

292
31 октября 2005 года
Matush
726 / / 14.01.2004
Ты описал:
int temp[2];

а записываеш в temp[2] =
:) вот и все эррорры

PS. int temp[2] означает что temp[0].. temp[1]
990
31 октября 2005 года
Stalcer
137 / / 15.08.2004
Цитата:
Originally posted by Matush
Ты описал:
int temp[2];

а записываеш в temp[2] =
:) вот и все эррорры

PS. int temp[2] означает что temp[0].. temp[1]


Блин, на такой фигне отловиться :D
Главное,пишет что ошибка связана с параметрами.
Спасибо всем!,кто принимал участие, тема закрыта :D

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог