Главная страница
    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.011 c
1-11994
Zergling
2003-12-16 09:19
2004.01.05
Занесение числа Double в динамический массив


14-12148
Igorek
2003-12-14 11:15
2004.01.05
Есть идея! Оптимизатор скорости работы программы!


1-11946
Кен
2003-12-18 01:49
2004.01.05
Глюк Delphi 7 с TStringGrid ом У вас также? Как с этим бороться ?


1-11964
Артем
2003-12-20 17:49
2004.01.05
Замена стандартной иконки папки


8-12002
pasha_676
2003-09-02 12:07
2004.01.05
FireWire видеомагнитофоны





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский