|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Переполнение стэка
Встретился с проблемкой одной... Нужно определить минимальное значение элементов дико огромного массива (порядка 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
|
||||
|
||||
Могу посоветовать использовать вместо массива какую-либо коллекцию. Тот же вектор к примеру.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#3
|
||||
|
||||
Код:
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
|
||||
|
||||
У меня работает с массивом корректно.
В начале был Бит, потом Байт и только потом появилось Слово... |
#5
|
|||
|
|||
NIch, не знаю почему, но твое работает а мое такое же не работает...
Pilot_Red, пасибочки - как раз про это щас в книжке прочел. попробую |
#6
|
|||
|
|||
Просто поставьте ключевое слово 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; P.S. При работе с указателями можно легко понаделать ошибок, которые потом будет сложно найти. Так что лучше без надобности их не использовать. Последний раз редактировалось Lucky192, 10.10.2011 в 14:08. |