![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Самопроизвольно меняется массив? [D7, WinXP]
Pavor © (2006-07-12 14:14:00)Уважаемые профессионалы!
Сам бы не поверил, но происходит вот что.
Есть программка небольшая, на ТрубоПаскале еще написана...
Короче говоря, данные выводит в текстовый файл прямо по ходу расчета:
//Начало цикла
//......
//Вычисления
//......
writeln(out,'¦ ',m:3,' ¦ ',fwm:6:3,' ¦ ',(em*100):8:3,
' ¦ ',(ed[ng].fi*180/pi):7:2,' ¦ ',(ff*m):4:0,
' ¦ ',kv:6:4,' ¦ ');
//Конец цикла
Я её в Delphi переделал, не вопрос. Решил потом экспорт в Word сделать, а для этого массив создал(небольшой - 16 элементов), чтобы всю таблицу данных накопить и из него сразу и вывести в таблицу в вордовском шаблоне. Вот так:
//Это тип для элемента моего массива
type result_record=record
fwm, em, ed, f, kv: real;
end;
var y1,m,j,y0,p,ng,nc,q:integer;
al,fa,famin,famax,fam,em,DT,Bp,U,bet,alfa,am,t2,tau,fwm,
kv,kg,fw1,ff,cndt,dx,dy,w,ktp,bs:real;
ed:array [1..5] of Eds;
//Это объявление моего массива
results2export: array [1..nt] of result_record;
//....
Заполняется массив так:
writeln(out,'¦ ',m:3,' ¦ ',fwm:6:3,' ¦ ',(em*100):8:3,
' ¦ ',(ed[ng].fi*180/pi):7:2,' ¦ ',(ff*m):4:0,
' ¦ ',kv:6:4,' ¦ ');
//Заполняем таблицу с результатами для последующего
// экспорта в Word
results2export[i].fwm:=fwm;
results2export[i].em:=em*100;
results2export[i].ed:=(ed[ng].fi*180/pi);
results2export[i].f:=ff*m;
results2export[i].kv:=kv;
//Конец цикла
В Word массив передается корректно, но дело все в том, что к моменту завершения цикла данные в нем не соответствую действительности. То есть - в файле, записанном с помощьюWriteLnи в массиве таблицы разные.
До 7-го элемента все как надо, а потом начинаются чудеса.
Самое интересное, что даже при полностью закомментированных строках эффект сохраняется.
Вот отрывок из моего отладочного лога:
//До 7-й итерации массив полностью заполнен нулями
// (а чего в общем-то ждать?) Но вот дольше:
i: 7
Добавлены данные: [7]: 0.000 0.000 0.00 0 0.0000
Изменение массива в целом:
01: 0.000 0.000 0.00 1 0.0000
02: -0.000 0.000 1.32 0 0.0000
03: 0.000 0.000 0.00 0 0.0000
04: 0.000 0.000 0.00 0 0.0000
05: 0.000 0.000 0.00 0 0.0000
06: 0.000 0.000 0.00 0 0.0000
07: 0.000 0.000 0.00 0 0.0000
08: 0.000 0.000 0.00 0 0.0000
09: 0.000 0.000 0.00 0 0.0000
10: 0.000 0.000 0.00 0 0.0000
11: 0.000 0.000 0.00 0 0.0000
12: 0.000 0.000 0.00 0 0.0000
13: 0.000 0.000 0.00 0 0.0000
14: 0.000 0.000 0.00 0 0.0000
15: 0.000 0.000 0.00 0 0.0000
16: 0.000 0.000 0.00 0 0.0000
--------------------------------------
i: 8
Добавлены данные: [8]: 0.000 0.000 0.00 0 0.0000
Изменение массива в целом:
01: 0.000 0.000 0.00 1 0.0000
02: -0.000 0.000 1.32 0 -0.0011
03: 0.000 1.490 0.00 0 0.0000
04: 0.000 0.000 0.00 0 0.0000
05: 0.000 0.000 0.00 0 0.0000
06: 0.000 0.000 0.00 0 0.0000
07: 0.000 0.000 0.00 0 0.0000
08: 0.000 0.000 0.00 0 0.0000
09: 0.000 0.000 0.00 0 0.0000
10: 0.000 0.000 0.00 0 0.0000
11: 0.000 0.000 0.00 0 0.0000
12: 0.000 0.000 0.00 0 0.0000
13: 0.000 0.000 0.00 0 0.0000
14: 0.000 0.000 0.00 0 0.0000
15: 0.000 0.000 0.00 0 0.0000
16: 0.000 0.000 0.00 0 0.0000
-------------------------------------
Последняя итерация:
i: 16
Добавлены данные: [16]: 0.000 0.000 0.00 0 0.0000
Изменение массива в целом:
01: 0.000 0.000 0.00 1 0.0000
02: -0.000 0.000 1.32 0 -0.0011
03: 0.000 1.490 0.00 0 0.0000
04: 1.530 0.000 -0.00 0 1.6000
05: 0.000 0.001 0.00 2 0.0000
06: -0.001 0.000 1.70 0 0.0007
07: 0.000 1.720 0.00 -0 0.0000
08: 1.790 0.000 0.00 0 1.9700
09: 0.000 0.001 0.00 2 0.0000
10: 0.000 0.000 0.00 0 0.0000
11: 0.000 0.000 0.00 0 0.0000
12: 0.000 0.000 0.00 0 0.0000
13: 0.000 0.000 0.00 0 0.0000
14: 0.000 0.000 0.00 0 0.0000
15: 0.000 0.000 0.00 0 0.0000
16: 0.000 0.000 0.00 0 0.0000
Спасибо, если дочиталь до этого места. Вопрос - что это может быть? Больше в тексте нигде обращений к этому массиву нет ( и откуда? но -проверял). Спасибо за внимание.
Pavor (2006-07-13 07:11:00) [1]дополнение: nt=16, определено в константах
Pavor (2006-07-13 07:10:00) [2]2 han_malign : А ведь ты прав! Точно ведь, а!
Сейчас только внимание обратил - цикл:
nt
for i:=1 to nt do begin
//Здесь вычисления
// А потом:
inc(Ng);//Вот оно!!!
//И так 16 раз по массиву из 5-и элементов:
ed[ng].e:=em;
ed[ng].m:=m;
ed[ng].fi:=0.0;
ed[ng].kvp:=kv;
writeln(out,'¦ ',m:3,' ¦ ',fwm:6:3,' ¦ ',(em*100):8:3,
' ¦ ',(ed[ng].fi*180/pi):7:2,' ¦ ',(ff*m):4:0,
' ¦ ',kv:6:4,' ¦ ');
Да-с, нелегко, все же, разбираться с чужими программами... Но будем учиться. Всем спасибо, проблема решена.
Ketmar (2006-07-12 20:12:00) [3]17-я строка.
какой цикл? граничные значения. что есть nt? Вы вычистили из примера не тот мусор. %-)
han_malign (2006-07-12 18:00:00) [4]сдается мне у тебя переполнение массива ed
Desdechado (2006-07-12 16:01:00) [5]а есть уверенность, что в массив пишется то, что надо?
а то может там стоит какое-нибудь условие?
ведь по твоему псевдокоду это не понятно
StriderMan (2006-07-12 15:25:00) [6]
> Перед началом расчета:
> for i:=1 to 16 do begin
> results2export[i].fwm:=255.0;
> results2export[i].em:=255.0;
> results2export[i].ed:=255.0;
> results2export[i].f:=255.0;
> results2export[i].kv:=255.0;
> end;
после этого момента цикл корректно заполнен?
StriderMan (2006-07-12 15:25:00) [7]
> цикл
массив
Pavor (2006-07-12 14:28:00) [8]Перед началом расчета:
for i:=1 to 16 do begin
results2export[i].fwm:=255.0;
results2export[i].em:=255.0;
results2export[i].ed:=255.0;
results2export[i].f:=255.0;
results2export[i].kv:=255.0;
end;
Последняя итерация:
i: 16
Добавлены данные: [16]:255.000 255.000 255.00 255 255.0000
Изменение массива в целом:
01: 255.000 0.000 0.00 1 255.0000
02: -0.000 0.000 1.32 255 -0.0011
03: 0.000 1.490 255.00 0 0.0000
04: 1.530 255.000 -0.00 0 1.6000
05: 255.000 0.001 0.00 2 255.0000
06: -0.001 0.000 1.70 255 0.0007
07: 0.000 1.720 255.00 -0 0.0000
08: 1.790 255.000 0.00 0 1.9700
09: 255.000 0.001 0.00 2 255.0000
10: 255.000 255.000 255.00 255 255.0000
11: 255.000 255.000 255.00 255 255.0000
12: 255.000 255.000 255.00 255 255.0000
13: 255.000 255.000 255.00 255 255.0000
14: 255.000 255.000 255.00 255 255.0000
15: 255.000 255.000 255.00 255 255.0000
16: 255.000 255.000 255.00 255 255.0000
То есть, насколько я вижу - "вторжение" тех же самых чисел.
StriderMan (2006-07-12 14:22:00) [9]попробуй забить массив некими константными значениями, что получится?