Форум: "Основная";
Текущий архив: 2004.01.05;
Скачать: [xml.tar.bz2];
ВнизЗанесение числа 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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.009 c