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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.10.2011, 20:22
U.B.M. U.B.M. вне форума
Новичок
 
Регистрация: 06.10.2011
Сообщения: 94
Версия Delphi: Delphi 7
Репутация: 13
По умолчанию Переполнение стэка

Встретился с проблемкой одной... Нужно определить минимальное значение элементов дико огромного массива (порядка 1 млн элементов ).

Простецкая функция нижеуказанного вида работает только для 100тыщ элементов, а для 1млн выдает ошибку о переполнении стэка.

Код:
function _Find_Min(_data: array of integer): integer;
var
  _i, _value : integer;
begin
  _value := _data[0];

  for _i := 1 to Length(_data)-1 do
    _value := min(_value, _data[_i]);

  _Find_Min := _value;
end;

Вижу несколько вариантов решения:
1. в динамическую память запихать этот массив (слышал краем уха про это где-то);
2. рекурсивно как-нибудь задать функцию чтоб она била массив напополам и от половинок минимум искала в самой себе (но с точки зрения кол-ва операций выигрыша практически нет), так что скорее всего не прокатит.

Граждане форумчане, если можете предложить другой приемлемый вариант буду крайне признателен.
Ответить с цитированием
  #2  
Старый 06.10.2011, 20:30
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Могу посоветовать использовать вместо массива какую-либо коллекцию. Тот же вектор к примеру.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #3  
Старый 06.10.2011, 20:40
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

Код:
 type
   pMas=^TMas;
   TMas = array of integer;
................................
var
  Form1: TForm1;
   mas:TMas;
..............................................
function FindMin(data:pMas): integer;
var
 i,value,l:integer;
begin
  value := data^[0];
   l:= Length(data^)-1;
  for i := 1 to l do
    value := min(value, data^[i]);
  FindMin :=value;

end;
................................................
procedure TForm1.Button1Click(Sender: TObject);
begin
    setlength(mas,1000000);
    FindMin(@mas);
end;


тут указатель на данные передается, а не целый массив данных
Ответить с цитированием
  #4  
Старый 06.10.2011, 20:51
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
По умолчанию

У меня работает с массивом корректно.
Вложения
Тип файла: rar Новая папка.rar (186.1 Кбайт, 14 просмотров)
__________________
В начале был Бит, потом Байт и только потом появилось Слово...
Ответить с цитированием
  #5  
Старый 06.10.2011, 21:12
U.B.M. U.B.M. вне форума
Новичок
 
Регистрация: 06.10.2011
Сообщения: 94
Версия Delphi: Delphi 7
Репутация: 13
По умолчанию

NIch, не знаю почему, но твое работает а мое такое же не работает...

Pilot_Red, пасибочки - как раз про это щас в книжке прочел. попробую
Ответить с цитированием
  #6  
Старый 10.10.2011, 13:56
Lucky192 Lucky192 вне форума
Прохожий
 
Регистрация: 04.10.2011
Сообщения: 28
Репутация: 1351
По умолчанию

Просто поставьте ключевое слово const перед параметром и ваша функция заработает с массивом любого размера:
Код:
function _Find_Min(const _data: array of integer): integer;
var
  _i, _value : integer;
begin
  _value := _data[0];

  for _i := 1 to Length(_data)-1 do
    _value := min(_value, _data[_i]);

  _Find_Min := _value;
end;
Если переменная передается без указания const или var, будет сделана ее копия (при изменении значения параметра в теле функции оригинальная переменная не изменится). В данном случае происходит создание локальной копии массива в стеке. Так как размер стека ограничен - получаете Stack overflow на больших массивах.
P.S. При работе с указателями можно легко понаделать ошибок, которые потом будет сложно найти. Так что лучше без надобности их не использовать.

Последний раз редактировалось Lucky192, 10.10.2011 в 14:08.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter