Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.05;
Скачать: CL | DM;

Вниз

Занесение числа Double в динамический массив   Найти похожие ветки 

 
Zergling ©   (2003-12-16 09:19) [0]

Доброго ВСЕМ дня! Возникла жудко странная проблема. При занесении числа Double в динамический массив.
И не надо ехидно хихикать :)

procedure AddMinMax(Value: Double);
begin
if PeakCount > High(MinMaxRec) then SetLength(MinMaxRec, High(MinMaxRec) + 50);
MinMaxRec[PeakCount] := Value;
end;

Во время оладки в процедуру передается значение 81.175
Примечаю, что:
1. массив MinMaxRec уже создан и его длина создана на 50 элементов.
2. PeakCount = 0 т.е. первый элемент массива
Нутак вот, продолжаю излагать суть проблемы. После передачи значения в процедуру в строке
>> MinMaxRec[PeakCount] := Value;
происходит следующее:
в первый элемент массива передается значение 81, а во второй элемент массива передается значение 175.
ЧТО ЭТО ТАКОЕ ??? Ж:-O Второй день отлаживаю, только сечас эту хрень заметил. SOS люди добрые.

Более детальный фрагмент кода.

Type
TValParam = Packed Record
Value,
Dates: Double;
end;
TMinMax = array of Double;
TValParamDB = Array of TValParam;
PValParamDB = ^TValParamDB;

var
DataDB: PValParamDB;
MinMaxRec: TMinMax;

...

// Поиск максимальних и минимальных точек
procedure SearshMinMax(LengthTime: Double);
var
I,
MaxIndex, MinIndex,
OldMaxIndex, OldMinIndex: Integer;
PeakMin, PeakMax: Boolean;
PeakCount: Integer;
EndData: Double;

procedure AddMinMax(Value: Double);
begin
if PeakCount > High(MinMaxRec) then SetLength(MinMaxRec, High(MinMaxRec) + 50);
MinMaxRec[PeakCount] := Value;
end;

begin
if (DataDB^ = NIL) or (High(DataDB^) <= 0) then EXIT;
EndData := DataDB^[0].Dates + LengthTime;
MaxIndex := 0; MinIndex := 0;
OldMaxIndex := 0; OldMinIndex := 0;
PeakCount := -1;
SetLength(MinMaxRec, 50);
for I := 0 to High(DataDB^) do
begin
if DataDB^[I].Value > DataDB^[MaxIndex].Value then MaxIndex := I;
if DataDB^[I].Value < DataDB^[MinIndex].Value then MinIndex := I;
if (DataDB^[I].Dates > EndData) or (I >= High(DataDB^) - 1) then
begin
EndData := DataDB^[I].Dates + LengthTime;
// Поиск минимума
if DataDB^[MinIndex].Value < DataDB^[OldMinIndex].Value then OldMinIndex := MinIndex else
if not PeakMin then
begin
PeakMin := True; PeakMax := False;
Inc(PeakCount);
AddMinMax(DataDB^[MinIndex].Value);
OldMaxIndex := MinIndex; MaxIndex := I;
end;
// Поиск максимума
if DataDB^[MaxIndex].Value > DataDB^[OldMaxIndex].Value then OldMaxIndex := MaxIndex else
if not PeakMax then
begin
if DataDB^[MaxIndex].Value <> DataDB^[OldMinIndex].Value then
begin
PeakMax := True; PeakMin := False;
Inc(PeakCount);
AddMinMax(DataDB^[MaxIndex].Value);
OldMinIndex := MaxIndex; MinIndex := I;
end;
end;
end; // if (DataDB^[I].Dates > EndData)
end; // for ...
SetLength(MinMaxRec, PeakCount + 1);
end;

...


 
KSergey ©   (2003-12-16 09:45) [1]

> Zergling © (16.12.03 09:19)
> в первый элемент массива передается значение 81, а во второй
> элемент массива передается значение 175.

Вранье.
Вот мой код:

implementation

Type
TMinMax = array of Double;
var
MinMaxRec: TMinMax;
PeakCount: Integer;

procedure AddMinMax(Value: Double);
begin
if PeakCount > High(MinMaxRec) then SetLength(MinMaxRec, High(MinMaxRec) + 50);
MinMaxRec[PeakCount] := Value;
end;

procedure TForm1.Button8Click(Sender: TObject);
begin
AddMinMax(81.175);
end;

initialization
PeakCount := 0;


После нажатия на кнопку в первом элементе )с нулевым индексом) - как и полагается 81.175

Может смотрим как-то не так? Это бывает ;)

PS
А тщательно изучать код -мне было лень. Вот.


 
Zergling ©   (2003-12-16 09:51) [2]

Увы, у меня невранье :(
Смотрел по хинту и через Debug Inspector.
Че за глюк такой странный? Может ктото сталкивался?


 
Семен Сорокин ©   (2003-12-16 10:04) [3]

2Zergling
SetLength(MinMaxRec, High(MinMaxRec) + 50);
длину массива увеличиваешь на 50 элементов, а заносишь один, обнулить остальные - не надо?


 
SergP ©   (2003-12-16 11:39) [4]


> длину массива увеличиваешь на 50 элементов, а заносишь один,
> обнулить остальные - не надо?


А зачем из обнулять...? Как я понимаю человек сразу увеличивает длину на 50 чтобы не увеличивать постоянно на 1. Типа если в следующий раз понадобится еще один элемент, то не придется снова массив увеличивать, так как он заранее был увеличен на 50.
Да и вообще разве могут одни элементы массива влиять на другие?


 
Семен Сорокин ©   (2003-12-16 12:04) [5]

SergP © (16.12.03 11:39) [4]
но человек жалуется именно на:
> в первый элемент массива передается значение 81, а во второй
> элемент массива передается значение 175.


 
Zergling ©   (2003-12-16 13:49) [6]

Про длину массива:
SergP © (16.12.03 11:39) [4]
именно это и задуманно.

Проявились новые подробности. Создал новый проект, все тоже самое - все работает нормально. Но в предыдущем варианте у меня в проекте используется RaveRepor. Неможет же он так Delphi "крышу" сносить. Хотя с его глюками все возможно %(. Заполнение данными DataDB: PValParamDB; происходит в DLL, хотя как я оговаривал чуть выше, вновь созданном проекте все ОК. Так что, глюк весьма странен, что так Delphi сносит мозги непонятно. Предется более тшательно отлаживать проект. Были подозрения и навири, проверил - все чисто. Вотакие блин пирожки :)


 
KSergey ©   (2003-12-16 14:13) [7]

И как всегда дельфи виновата...


 
Zergling ©   (2003-12-18 06:52) [8]

KSergey © (16.12.03 14:13) [7]

Может тогда объяснишь сей странный феномен, разумные объяснения этому у тебя есть?

>> происходит следующее:
>> в первый элемент массива передается значение 81, а во второй
>> элемент массива передается значение 175.

Когда я это заметил, я плакаль. Дельфю уже пересталял - не помогло. Сечас пробую некоторые участки кода в проекте реализовать немного подругому, хочется надеется, что выличится.


 
alex_***   (2003-12-18 09:21) [9]

а debug window CPU посмотреть в процессе отладки? а то так deplhi можно по 5 раз на дню переставлять )


 
Anatoly Podgoretsky ©   (2003-12-18 09:22) [10]

Наоборот надо переставлять Дельфи пр и каждой ошибке компиляции.


 
KSergey ©   (2003-12-18 09:26) [11]

Вот только есть у меня подозрение, что нет у него ошибки компиляции... Хотя, конечно, как знать... ;)


 
Anatoly Podgoretsky ©   (2003-12-18 09:31) [12]

KSergey © (18.12.03 09:26) [11]
И при рантайм тоже


 
Zergling ©   (2003-12-18 09:46) [13]

Издевайтесь, издевайтесь ... %-(

KSergey © (18.12.03 09:26) [11]
Угу. Вот сижу и от нечего делать такие вопросы задаю. Будто мне заняться больше нечем.


 
KSergey ©   (2003-12-18 09:46) [14]

Ну я это все к одному приписываю: т.е. неестественное поведение откомпилтрованной программы - есть ошибка компилятора (не путать с ошибками, выдаваемыми компилятором ползователю!).
Это если я верно понял серьезность вашего поста ;)

PS
но во всем этом опять же есть у меня сомнения... ;)


 
Anatoly Podgoretsky ©   (2003-12-18 09:49) [15]

Тебе выше все по кусочкам разжевали, надо только воспользоваться советами, не все конечно хороши, но в общем достаточно.


 
alex_***   (2003-12-18 09:54) [16]

стандартный подход в таких случаях, если не помог Build:
Сделать маленький рабочий примерчик и наращивать его до тех пор, пока не станет идентичен исходному коду. Потом заменить :)


 
Zergling ©   (2003-12-18 10:53) [17]

Anatoly Podgoretsky © (18.12.03 09:49) [15]

>> Тебе выше все по кусочкам разжевали

И гдеже хоть один сие мудрый совет? Переставлять Delphi? Спасибо за такой мудрый совет %(. Тоолько вижу подколки в адрес моего поста. Сейчас заного переписываю проет, но без RaveReport, чтобы удостовериться, в нем причина или нет.


 
Zergling ©   (2003-12-19 06:10) [18]

Тщятельная отладка показала, что глюки явно у меня :). Вспылил, был неправ, каюсь.
KSergey © (16.12.03 09:45) [1]
>> Может смотрим как-то не так? Это бывает ;)

Что у меня имело место быть. Подсчитывал количество элементов в массиве во время отладки и каждый раз походу дела обсчитывался, всвсязи с чем и убедил себя в глюке. И как всегда по закону подлости, ошибка была перед самым носом, и в тоже время, как всегда незаметная.
Блин, пора в отпуск :)



Страницы: 1 вся ветка

Текущий архив: 2004.01.05;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.026 c
3-11810
alienka
2003-12-08 18:08
2004.01.05
adoQuery проблема с update данных


1-11959
aser
2003-12-19 16:28
2004.01.05
Пустая форма в 368128 bytes ?


6-12028
senya
2003-11-05 15:00
2004.01.05
запуск html файла


14-12152
}|{yk
2003-12-12 15:42
2004.01.05
Кто получит Золотой мяч?


4-12207
diMAN
2003-11-04 08:30
2004.01.05
Создать невидимую консоль