Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-11785
www
2003-12-09 13:40
2004.01.05
TQuery design time и run time


4-12218
Zhirnov Maxim
2003-11-05 11:32
2004.01.05
Поиск по реестру, желательно средствами WinAPI


9-11760
NailMan
2003-06-16 18:03
2004.01.05
Звуковой движок игры


1-11888
deltoro
2003-12-10 02:44
2004.01.05
Нужна помощь в написании программы, часть учебного проекта


7-12188
Геннадий
2003-10-19 12:00
2004.01.05
WM_DropFiles





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский