Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.036 c
14-1119951449
begin...end
2005-06-28 13:37
2005.07.18
Ищется компонент для выбора папок


1-1119964706
Radgar
2005-06-28 17:18
2005.07.18
OnMouseDown в массиве Timage


14-1119390702
Zelius
2005-06-22 01:51
2005.07.18
В чем провинился кернел?


14-1119364741
NW
2005-06-21 18:39
2005.07.18
Info Setup


4-1116747561
psa247
2005-05-22 11:39
2005.07.18
FAT | NTFS ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский