Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.03.2010, 16:56
Smerch66 Smerch66 вне форума
Прохожий
 
Регистрация: 31.10.2009
Сообщения: 43
Репутация: 10
По умолчанию Передача массива в процедуру с помощью указателя

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  
Старый 13.03.2010, 17:07
Аватар для AleD
AleD AleD вне форума
Активный
 
Регистрация: 21.02.2009
Адрес: г.Краснокаменск
Сообщения: 383
Репутация: 91
По умолчанию

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  
Старый 13.03.2010, 17:12
Smerch66 Smerch66 вне форума
Прохожий
 
Регистрация: 31.10.2009
Сообщения: 43
Репутация: 10
По умолчанию

Очень извиняюсь, но не очень понятно.
Можно как-нибудь написать относительно того текста и тех переменных которые у меня уже имются? Очень прошу!
Самое интересное просто как это передать в процедуру.

Последний раз редактировалось Smerch66, 13.03.2010 в 17:14.
Ответить с цитированием
  #4  
Старый 13.03.2010, 17:14
Аватар для AleD
AleD AleD вне форума
Активный
 
Регистрация: 21.02.2009
Адрес: г.Краснокаменск
Сообщения: 383
Репутация: 91
По умолчанию

Код:
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  
Старый 13.03.2010, 17:42
Smerch66 Smerch66 вне форума
Прохожий
 
Регистрация: 31.10.2009
Сообщения: 43
Репутация: 10
По умолчанию

Спасибо большое получилось!

То есть теперь в этой процедуре не нужно делать очистку массива?
Finalize(mass);

И ещё один важный вопрос: что это было за переполнение стека и с чем оно связано?
Ответить с цитированием
  #6  
Старый 13.03.2010, 17:48
Аватар для AleD
AleD AleD вне форума
Активный
 
Регистрация: 21.02.2009
Адрес: г.Краснокаменск
Сообщения: 383
Репутация: 91
По умолчанию

Цитата:
Сообщение от Smerch66
Спасибо большое получилось!

То есть теперь в этой процедуре не нужно делать очистку массива?
Finalize(mass);

И ещё один важный вопрос: что это было за переполнение стека и с чем оно связано?
если вы очистите массив в этой процедуре то он будет пуст и за пределами функции, кароче говоря DATA и mass это одно и тоже, одна информация, одну память используют

перед вызовом функции в стек (просто буфер определённого размера, регулируется в настройках делфи) записываются передаваемые параметры, если стек переполняется то и происходит соответствующее исключение
__________________
TAleD = class(TUser)
public
function HelpMe(ASubject, ARequest: String): String;
function GiveMeExample(ASubject: String): TStringList;
procedure WriteReview(APost: Integer; ADescription: TStringList);
end;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:18.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025