Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.18;
Скачать: CL | DM;

Вниз

Большой массив как параметр процедуры.   Найти похожие ветки 

 
Сергей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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.051 c
8-1111300604
dimon__
2005-03-20 09:36
2005.07.18
Как получить изображение с web -камеры!


1-1120138056
Андрей Жук
2005-06-30 17:27
2005.07.18
Соединение ячеек в Excel


3-1118306473
sapsi
2005-06-09 12:41
2005.07.18
Фильтры в БД Аксесс


8-1111498488
Graff
2005-03-22 16:34
2005.07.18
Запись в MP3 файл тэга


14-1119340150
BiN
2005-06-21 11:49
2005.07.18
Ну заработал, наконец-то