Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.067 c
3-1117572128
alex-drob
2005-06-01 00:42
2005.07.18
Связь двух таблиц


3-1117799689
GekaNaz
2005-06-03 15:54
2005.07.18
MySQL


1-1120214242
Тучудище
2005-07-01 14:37
2005.07.18
Перекодирование из GSM(7 битной кодировки) в ASCII например


14-1118907006
Calm
2005-06-16 11:30
2005.07.18
Авторские права. Могу ли я продать купленную мною книгу?


14-1118869482
Soft
2005-06-16 01:04
2005.07.18
Я сегодня окончательно убедился во влиянии звезд на судьбу.




   Наверх