Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Господи, да что ж делается-то?! [D5, Win95/98]


Страницы:   1 2 3

Baz ©   (2001-12-26 10:21:00) 

Здравствуйте, мэтры!
ПОЧЕМУ после выполнения строки
for M:=-1000 to 1000 do
переменная М становится равна 2001, а, если изменить на
for M:=-100 to 1000 do
то 1101. М описана как integer. Я чего-то не знаю, или пора из компа бесов изгонять?!
Заранее спасибо за любые подсказки
Baz.


Alx2   (2001-12-27 08:50:00) [21]

Сорри, очепятка :))
Вместо: "Ее адрес (Y[i])на i-м шаге ebp-$2c"
Следует читать: "Ее адрес (Y[i])на i-м шаге [ebp-$2c]."
Соответственно, уменьшение адреса на 8 происходит только лишь в конце цикла for I:=N-1 downto MAX_I do...


Alx2   (2001-12-27 08:45:00) [22]

Сразу замечу: sqr(x) быстрее, чем IntPower(x,2).
Далее Y[i] - инвариант внутри цикла repeat...until. Вследствии чего, компилятор помнит значение Y[i] вчерез регистр ebp. Ее адрес (Y[i])на i-м шаге ebp-$2c. Регистр ebp инвариант в цикле repeat...until. Таким образом, имеет место регистровая оптимизация посему Y is inaccessible...

Чтобы наслаждаться Y-м в окне Watch:
Ctrl+Shift+F11/Compiler/Optimization - вырубить.
ПЕРЕКОМПИЛИРОВАТЬ проект (Project->Build)

После отладки включить оптимизацию.
Снова перекомпилировать.


Baz   (2001-12-27 06:43:00) [23]

Пока суд да дело, я уже код сто раз перепахал, но привожу весь нынешний текст подпрограммы. Вкратце суть задачи (вдруг, интересно :))
Х - массив узлов ф-и (Х=15, 20, 25.....)
Y - зн-я ф-и в узлах (не совсем, но можно считать, что так)
А,В,С - коэф-ты парабол, которыми и интерполирую ф-ю между узлами
N - число узлов, DELTA - шаг (т.е. здесь DELTA=5)
TARGET_AGE - целевая точка (напр., TARGET_AGE=23, Y(23)-?)
============================================
//ВЫЧИСЛЕНИЕ СПЛАЙН-ФУНКЦИИ И ПЛОЩАДЕЙ ФИГУР
procedure TMAIN_FRM.SPLAIN(X:T_ARRAY;var Y,A,B,C:T_ARRAY;
TARGET_AGE:real;DELTA,N:integer);
//T_ARRAY - задан в др. месте так:
//type T_ARRAY=array[0..21] of real;

var ETALON,MAX_Y:double;MAX_I,I,J:integer;
A_ETALON,B_ETALON,C_ETALON:T_ARRAY;
Y_SPLAIN:array[0..105] of real;
begin
A[N]:=3*Y[N]/IntPower(DELTA,2);
B[N]:=-6*Y[N]*X[N]/IntPower(DELTA,2);
C[N]:=3*Y[N]*IntPower(X[N],2)/IntPower(DELTA,2);
MAX_I:=2;
for I:=N-1 downto MAX_I do
begin//Расчет всех A, B, C
B[I]:=-10000;
ETALON:=999999999999;
repeat
B[I]:=B[I]+1;//Выч-ем параметры для функции Y_SPLAIN
A[I]:=Y[I]-C[I+1]+B[I]/2*DELTA-B[I+1]*X[I]-A[I+1]*IntPower(X[I],2);//Для простоты восприятия А выч-ся в два этапа
A[I]:=A[I]*3/
(IntPower(X[I-1],2)-2*IntPower(X[I],2)+X[I-1]*X[I]);
C[I]:=A[I+1]*IntPower(X[I],2)-A[I]*IntPower(X[I],2)+
B[I+1]*X[I]-B[I]*X[I]+C[I+1];
MAX_Y:=0;
for J:=0 to DELTA-1 do//Зн-я ф-и на I-м уч-ке
begin
Y_SPLAIN[I*DELTA-J]:=A[I]*IntPower((X[I]-J),2)+B[I]*(X[I]-J)+C[I];
if Y_SPLAIN[I*DELTA-J]<0
then MAX_Y:=MAX_Y+ETALON;
//Мне нужна минимальная сумма зн-ий ф-и Y_SPLAIN
MAX_Y:=MAX_Y+Y_SPLAIN[I*DELTA-J];
end;//of for J
if MAX_Y<ETALON then //Текущая ф-я лучше эталонной
begin
ETALON:=MAX_Y;//Запомним лучшие параметры
A_ETALON:=A;
B_ETALON:=B;
C_ETALON:=C;
end;//of смена эталона
until B[I]>=1000;
A:=A_ETALON;//Восстанавливаем лучшие параметры из эталонных
B:=B_ETALON;
C:=C_ETALON;//}
//!!!!!!!!!!
{ for J:=0 to DELTA-1 do//Зн-я ф-и на I-м уч-ке
Y_SPLAIN[I*DELTA+J]:=A[I+1]*IntPower((X[0]+I*DELTA+J),2)+B[I+1]*(X[0]+I*DELTA+J)+C[I+1];
Y_SPLAIN[N*DELTA]:=A[N]*IntPower(X[N],2)+B[N]*X[N]+C[N];//}
//!!!!!!!!!!!!!
end;//of for I
I:=1;
while X[I]<TARGET_AGE do I:=I+1; //В каком отрезке искомый возраст?
//Вычис-е площадей фигур под сплайн-функцией
//И вывод результатов
RSLT_LBL_1.Caption:="S= "+
FloatToStr(A[I]/3*(IntPower(X[I],3)-IntPower(X[I-1],3))+
B[I]/2*(IntPower(X[I],2)-IntPower(X[I-1],2))+
C[I]*(X[I]-X[I-1]));
RSLT_LBL_2.Caption:="S1 = "+
FloatToStr(A[I]/3*(IntPower(TARGET_AGE,3)-IntPower(X[I-1],3))+
B[I]/2*(IntPower(TARGET_AGE,2)-IntPower(X[I-1],2))+
C[I]*(TARGET_AGE-X[I-1]));
RSLT_LBL_3.Caption:="S2 = "+
FloatToStr(A[I]/3*(IntPower(X[I],3)-IntPower(TARGET_AGE,3))+
B[I]/2*(IntPower(X[I],2)-IntPower(TARGET_AGE,2))+
C[I]*(X[I]-TARGET_AGE));//}
end;//of begin
====================================
При входе в цикл по I в окне Watch Y исчезает до конца программы и появляется эта гнусная надпись про optimization. Но, обнаружено, что Y прекрасно видно, если раскомментировать выделенный !-ми участок. ДО входа в цикл Y видно. Что происходит?





Anatoly Podgoretsky   (2001-12-26 22:02:00) [24]

Ну есть, в сумме составить 201 иттерацию.


SlavaG   (2001-12-26 20:22:00) [25]

Может я не по теме, но от -100 до +100 есть еще и 0-ноль


Anatoly Podgoretsky   (2001-12-26 19:24:00) [26]

Не может этого быть, должен втыкаться, вот показывать не обязан


Alx2   (2001-12-26 17:13:00) [27]

Так вопрос, как я понял, в том, что массивв Watch не втыкается...


Anatoly Podgoretsky   (2001-12-26 17:08:00) [28]

Да все нормально, он его просто разместил в регистре


Alx2   (2001-12-26 16:07:00) [29]

Оптимизатор выкинул из кода Y, так как Y далее не используется. Но из привиденного примера это не следует :). Видимо, причина где-то еще внутри цикла. Весь код можно посмотреть?


Baz   (2001-12-26 15:20:00) [30]

Код длинный. Ну вот прямо сейчас гляжу на надпись: Variable Y inaccessible due to optimizatioin. Y у меня массив, по ходу цикла я вычисляю некоторые параметры с исп-ем эл-тов этого массива. Ну, типа
for I:=N-1 downto MAX_I do
begin
.........
A[I]:=Y[I]-C[I+1]+B[I]/2*DELTA-B[I+1]*X[I]-A[I+1]*IntPower(X[I],2);
.........
Все остальные массивы вижу, (в пошаговом прогоне) а Y - нет. За шаг до входа в цикл все виделось. Что еще? I, N, MAX_I - integer, N=9, MAX_I=2.
Это какие-то штучки оптимизатора или что-то еще?


Anatoly Podgoretsky   (2001-12-26 12:34:00) [31]

Андрей Сенченко © (26.12.01 12:18)
А чего тут непонятного, код приводить не хочет, значит оно ему нужно


Alx2   (2001-12-26 12:32:00) [32]

Ctrl+Shift+F11/Compiler/Optimization

А зачем отключать? Разве что для стыковки ассемблера. Да и то очень редко... и только местами :))


Baz   (2001-12-26 12:18:00) [33]

Спасибо всем, особенно to Виктор Щербаков! Действительно, у меня М внутри цикла использовалась, а потом я это закомментировал. Поставил внутрь строку if M=0 then; и все нормализовалось. А как отключать этот оптимизатор? Или лучше его не трогать?


Андрей Сенченко   (2001-12-26 12:18:00) [34]

> Anatoly Podgoretsky ©
Резонно. Да ни к чему все это. Понятно, что можно найти компилятор, при ктором на выходе из цикла переменная уйдет вообще в минус бесконечность.
Но это все баловство по той простой причине, что вопрос:
Baz © (26.12.01 10:43)
>> Все происходит ВНУТРИ цикла, СРАЗУ после begin.

А вот это вот - совсем непонятно


Anatoly Podgoretsky   (2001-12-26 12:09:00) [35]

Ну и что из того, что ты проверил на трех машинах, ты проверь на разных компиляторах, например Д1 и Д5.
Предполагать можно, но Борланд говорит не нужно!


Андрей Сенченко   (2001-12-26 12:01:00) [36]

> Anatoly Podgoretsky ©
На трех машинах проверил. Из любопытства. Везде именно так. Но не в этом дело. Исходя из основной пробемы вопроса можно предположить, что у негона выходе из цикла в этой переменной содержится значение количества проходов цикла.
Но мнеповторяю достичь такого результата не удалось. ( То самое "неопределенное№, которое:
[Warning] Unit1.pas(35): FOR-Loop variable "i" may be undefined after loop




Виктор Щербаков   (2001-12-26 11:50:00) [37]

to Baz
Это следствие работы оптимизатора.
Если переменная цикла не используется внутри цикла, то компилятор/оптимизатор может поменять направление отсчета, начальное и конечное значения. Лишь бы количество выполнений зацикленного опреатора осталось прежним. Так что отключи оптимизацию и наслаждайся.

А о использовании переменных цикла сразу после его выполнения компилятор выдает предупреждение.


Anatoly Podgoretsky   (2001-12-26 11:48:00) [38]

Baz © (26.12.01 10:43)
Не может быть, обманываешь.


Anatoly Podgoretsky   (2001-12-26 11:47:00) [39]

Андрей Сенченко © (26.12.01 11:42)
Ну и что из того, что она у тебяВерхняя граница + 1


Андрей Сенченко   (2001-12-26 11:43:00) [40]

Ну то есть у меня не M а i


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо