Форум: "Основная";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];
ВнизБольшой массив как параметр процедуры. Найти похожие ветки
← →
Сергей3 (2005-06-29 14:33) [0]Здравствуйте!
Работаю с массивом 256*256*256:
xyz: XYZ_Type = array[0..255, 0..255, 0..255] of word.
Так как с ним неоднократно производятся
типичные операции (типа сортировки по различным параметрам)
, то я написал несколько процедур для работы с ним, типа
Procedure Sort(xyz: XYZ_Type);
Часто при выполнении проги и при использовании
этих процедур происходит Stack OverFlow.
При этом, если прописывать код этих процедур напрямую,
т.е. не использовать обращение к процедурам,
то выполнение происходит без ошибок.
Подскажите, пожалуйста, почему так происходит и
посоветуйте, как выйти из этой ситуации (уж очень неохота каждый раз
прописывать текст процедур).
Заранее благодарен за совет.
← →
evvcom © (2005-06-29 14:40) [1]
> Procedure Sort(xyz: XYZ_Type);
В этом случае происходит копирование твоего массива в стек, и сортируешь ты локальную копию твоего глобального массива. При выходе из процедуры ты должен был обнаружить, что твой массив на самом деле не отсортировался. Чтобы устранить это, сделай:
Procedure Sort(var xyz: XYZ_Type);
← →
-=XP=- © (2005-06-29 14:41) [2]Procedure Sort(const xyz: XYZ_Type);
← →
-=XP=- © (2005-06-29 14:42) [3]Ах да, менять же надо. Тoгда var
← →
Сергей3 (2005-06-29 14:52) [4]Насколько я понимаю, если Sort(var xyz: XYZ_Type), то это уже будет другой массив, или нет?
Sort(const xyz: XYZ_Type) - не разу не пробовал - попробую.
А что это значит?
Спасибо за советы evvcom, -=XP=-!
← →
-=XP=- © (2005-06-29 15:03) [5]это уже будет другой массив, или нет?
Нет.
Most parameters are either value parameters (the default) or variable (var) parameters.
A value parameter acts like a local variable that gets initialized to the value passed in the procedure or function call. If you pass a variable as a value parameter, the procedure or function creates a copy of it; changes made to the copy have no effect on the original variable and are lost when program execution returns to the caller.
A variable parameter, on the other hand, acts like a pointer rather than a copy. Changes made to the parameter within the body of a function or procedure persist after program execution returns to the caller and the parameter name itself has gone out of scope
← →
Просто Джо © (2005-06-29 15:03) [6]
> var xyz: XYZ_Type), то это уже будет другой массив, или
> нет?
В процедуру будет передаваться ссылка на оригинальный массив. Из этого следует:
1. Оригинальный массив можно изменить внутри процедуры
2. В стек не помещается копия массива
← →
-=XP=- © (2005-06-29 15:06) [7]Sort(const xyz: XYZ_Type) - не разу не пробовал - попробую
И не пробуйте даже. Компилятор не даст Вам менять значения элементов массива внутри процедуры.
← →
Сергей3 (2005-06-29 15:12) [8]Спасибо Вам за подробные объяснения.
← →
Просто Джо © (2005-06-29 15:23) [9][6] Просто Джо ©
> В процедуру будет передаваться ссылка на оригинальный массив
Точнее сказать, если не указать var, сама процедура сделает копию передаваемого массива в стеке.
← →
-=XP=- © (2005-06-29 15:42) [10]сама процедура сделает копию
А я всегда думал, что это делает вызывающая сторона. Типа, помещает параметры в стек и вызывает процедуру.
← →
begin...end © (2005-06-29 15:55) [11]> -=XP=- © (29.06.05 15:42) [10]
В данном случае копию параметра (при отсутствии const/var) сделает вызываемая подпрограмма.
← →
evvcom © (2005-06-29 16:40) [12]
> Типа, помещает параметры в стек и вызывает процедуру
В стек-то она помещает указатель (или в регистр) и вызывает процедуру, но поскольку вызов без var или const, компилятор генерит для вызываемой процедуры в контексте самого первого begin код копирования данных по переданному указателю. И в дальнейшем идет работа с копией.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.051 c