|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Передача массива в процедуру с помощью указателя
var
DATA : array of Float; //динамический массив, размер которого задаю в тексте программы. DATAlength: integer; i,num: integer; //далее идёт процедура, которая находит максимальный элемент в массиве, и возвращает номер этого элемента в массиве. В эту процедуру нужно передать массив(точнее указатель на массив, чтобы не загружать память) procedure maxelement(mass : array of Float; mNFFT : integer; var element : integer); begin element:=0; for i:=1 to mNFFT-1 do begin if abs(mass[i])>abs(mass[element]) then element:=i; end; end; //далее идёт кусок из текста, в котором обращаюсь к процедуре setlength(DATA, DATAlength); ... maxelement(DATA, DATAlength, num); Правильно ли я понимаю, что если оставить всё как описано выше, то в процедуру передаётся массив целиком, а не указатель на него? Если всё таки это передача указателя, то почему когда передаю массивы размерности примерно 100000 - 150000 элементов всё в порядке. А как передаю массив примерно на 360000 элементов, выскакивает ошибка в ходе выполнения программы, о каком-то переполнении. Подскажите пожалуйста как решить эту проблему. |
#2
|
||||
|
||||
Stack overflow - переполнение стэка
Код:
pArrAddr := @any_array[Low(any_array)] // указатель на первый элемент в массиве Pointer(any_array) := pArrAddr; // из указателя обратно в массив (не копирует массив! просто переменную указывает на существующий массив) pArrAddr это и есть тот самый указатель на массив TAleD = class(TUser) public function HelpMe(ASubject, ARequest: String): String; function GiveMeExample(ASubject: String): TStringList; procedure WriteReview(APost: Integer; ADescription: TStringList); end; Последний раз редактировалось AleD, 13.03.2010 в 17:10. |
#3
|
|||
|
|||
Очень извиняюсь, но не очень понятно.
Можно как-нибудь написать относительно того текста и тех переменных которые у меня уже имются? Очень прошу! Самое интересное просто как это передать в процедуру. Последний раз редактировалось Smerch66, 13.03.2010 в 17:14. |
#4
|
||||
|
||||
Код:
var DATA : array of Float; //динамический массив, размер которого задаю в тексте программы. DATAlength: integer; i,num: integer; //далее идёт процедура, которая находит максимальный элемент в массиве, и возвращает номер этого элемента в массиве. В эту процедуру нужно передать массив(точнее указатель на массив, чтобы не загружать память) procedure maxelement(pMass : Pointer; mNFFT : integer; var element : integer); var mass: array of Float; begin Pointer(mass) := pMass; element:=0; for i:=1 to mNFFT-1 do begin if abs(mass[i])>abs(mass[element]) then element:=i; end; end; //далее идёт кусок из текста, в котором обращаюсь к процедуре setlength(DATA, DATAlength); ... maxelement(@DATA[Low(DATA)], DATAlength, num); как то так TAleD = class(TUser) public function HelpMe(ASubject, ARequest: String): String; function GiveMeExample(ASubject: String): TStringList; procedure WriteReview(APost: Integer; ADescription: TStringList); end; |
#5
|
|||
|
|||
Спасибо большое получилось!
То есть теперь в этой процедуре не нужно делать очистку массива? Finalize(mass); И ещё один важный вопрос: что это было за переполнение стека и с чем оно связано? |
#6
|
||||
|
||||
Цитата:
перед вызовом функции в стек (просто буфер определённого размера, регулируется в настройках делфи) записываются передаваемые параметры, если стек переполняется то и происходит соответствующее исключение TAleD = class(TUser) public function HelpMe(ASubject, ARequest: String): String; function GiveMeExample(ASubject: String): TStringList; procedure WriteReview(APost: Integer; ADescription: TStringList); end; |
#7
|
|||
|
|||
Проблема возникла! Вобщем как только процедура завершает свою работу, автоматически очищаются оба массива mass и DATA. Понял теперь что это один и тот же массив, то всё же, он очищается сам, без всяких команд по завершению этой процедуры
|
#8
|
||||
|
||||
Цитата:
Код:
Pointer(mass) := nil; TAleD = class(TUser) public function HelpMe(ASubject, ARequest: String): String; function GiveMeExample(ASubject: String): TStringList; procedure WriteReview(APost: Integer; ADescription: TStringList); end; |
#9
|
|||
|
|||
Теперь уже окончательно всё получилось! Спасибо вам огромнейшее!
Осталось только 2 вопроса: 1) что благодаря этой последней команде происходит, и что происходило без неё? 2) как я могу поднять вам репутацию? а то ещё не совсем освоился с возможностями форума. Спасибо!!! |
#10
|
||||
|
||||
Цитата:
2) Значок весов справа от сообщения коим помог TAleD = class(TUser) public function HelpMe(ASubject, ARequest: String): String; function GiveMeExample(ASubject: String): TStringList; procedure WriteReview(APost: Integer; ADescription: TStringList); end; |
#11
|
|||
|
|||
Нажимаю на весы, а там сообщение:
"Вы должны добавить отзыв кому-то еще, прежде чем сможете снова добавить ее AleD." Ну думаю, может я уже дааавно оставлял свою благодарность. В результате оставил отзыв другому человку, и потом снова попробовал на ваши весы нажать и то же самое( |
#12
|
||||
|
||||
Цитата:
TAleD = class(TUser) public function HelpMe(ASubject, ARequest: String): String; function GiveMeExample(ASubject: String): TStringList; procedure WriteReview(APost: Integer; ADescription: TStringList); end; |
#13
|
|||
|
|||
Можно и проще было это сделать)
Код:
... type TFloatArray = array of Float; ... function GetMaxEement(const FloatArray:TFloatArray):Integer; var i:Integer; begin Result:=0; if Length(FloatArray) > 1 then for i:=Low(FloatArray)+1 to High(FloatArray) do if abs(FloatArray[i]) > abs(FloatArray[Result]) then Result:=i; end; ... |
#14
|
|||
|
|||
А в этом случае, как я понимаю, в функцию будет передаваться весь массив, а не указатель на него?
|
#15
|
||||
|
||||
Цитата:
TAleD = class(TUser) public function HelpMe(ASubject, ARequest: String): String; function GiveMeExample(ASubject: String): TStringList; procedure WriteReview(APost: Integer; ADescription: TStringList); end; |