Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 8 
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Привет всем.
При написании проги к диплому столкнулся со следующей проблемой:

procedure PodborTempGazov(Qprih : Real);
var
i, j : Integer;
HSO2, HN2, HO2, Qsumm, GSO2, GN2, GO2, HSO2m, HO2m, HN2m : Real;
Delta1, Delta2, Delta3, QSumMin, Temp : Real;
label 1;
begin
GSO2 := StrToFloat(MainForm.PosleSPStringGrid.Cells[1,1]);
GO2 := StrToFloat(MainForm.PosleSPStringGrid.Cells[1,2]);
GN2 := StrToFloat(MainForm.PosleSPStringGrid.Cells[1,3]);
j := 10;
for i:=1 to 120 do
begin
PoiskHSO2 (j,HSO2);
PoiskHN2 (j, HN2);
PoiskHO2 (j,HO2);
Qsumm := HSO2*GSO2+HO2*GO2+HN2*GN2;
if Qsumm>Qprih then
Goto 1 else
begin
HSO2m := HSO2;
HO2m := HO2;
HN2m := HN2;
end;
j:=j+10;
end;
1:
QSumMin := HSO2m*GSO2+HO2m*GO2+HN2m*GN2;
Delna1 := (QSumm-QSumMin)/10;
Delta2 := Qprih-QSumMin;
Delta3 := Delta2/Delta1;
Temp := J+Delta3;
end;

1: при компиляции не моявляются точки (слева от команд) после метки 1- не компилируется?
2: при пошаговой прогонке программы, после выполнения команды GoTo 1 перепрыгиваешь сразу на End, минуя команды между 1: и End;
3: при пошаговой прокрутке программы если смотреть значения после оператора присваивания - они верны, при просмотре значений пременных QSumMin = 1200, Delta1 = 1190... Temp = 1160, если вставить между 1: и End; любую другую переменную, то её значение будет уменьшаться на 10 начиная с 1160. Я думаю, понятно, что значения после вычислений совершенно не верные.
Глобальных меток в проге нет, глобальных переменных - тоже, всё описано локально. Процедур много. Пробовал переименовывать переменные, процедуру - не помогло...
Разбивал одну процедуру на несколько, вот что получилось:

procedure proc2 (QSumm, Qprih, SummaMin : real);
var
asgdfghh : real;
begin
asgdfghh := QSumm-SummaMin;
end;

procedure proc1 (TeplDioks, TeplKisl, TeplAzota, GSO2, GO2, GN2, QSumm, Qprih : Real);
var
SummaMin : real;
begin
SummaMin := TeplDioks*GSO2+TeplKisl*GO2+TeplAzota*GN2;
MainForm.DopPodogrevEdit.Text := FloatToStr(SummaMin);
proc2(QSumm, Qprih, SummaMin);
end;

procedure proc (QSumm, GSO2, GO2, GN2, Qprih : Real; j : Integer);
var
TeplDioks, TeplKisl, TeplAzota : Real;
begin
PoiskHSO2 (j-10, TeplDioks);
PoiskHO2 (j-10, TeplKisl);
PoiskHN2 (j-10, TeplAzota);
proc1 (TeplDioks, TeplKisl, TeplAzota, GSO2, GO2, GN2, Qsumm, Qprih);
end;

procedure PodborTempGazov(Qprih : Real);
var
i, j : Integer;
HSO2, HN2, HO2, Qsumm, GSO2, GN2, GO2 : Real;
label 1;
begin
GSO2 := StrToFloat(MainForm.PosleSPStringGrid.Cells[1,1]);
GO2 := StrToFloat(MainForm.PosleSPStringGrid.Cells[1,2]);
GN2 := StrToFloat(MainForm.PosleSPStringGrid.Cells[1,3]);
j := 980;
for i:=98 to 120 do
begin
PoiskHSO2 (j,HSO2);
PoiskHN2 (j, HN2);
PoiskHO2 (j,HO2);
Qsumm := HSO2*GSO2+HO2*GO2+HN2*GN2;
if Qsumm>Qprih then
Goto 1 else
j := j+10;
end;
1:
Proc(QSumm, GSO2, GO2, GN2, Qprih, j);
end;

всё работает правильно, до proc2 там значение asgdfghh должно быть несколько сотен, а в реале 2,33*10в-307степени. пробовал делать asgdfghh:=0, в результате значение всё равно остаётся =2,33*... глобальных константы только 3, и у них совершенно другие значения.
перепробовал всё, что знал, может Вы поможете?



Партнер
 

Member
Статус: Не в сети
Регистрация: 01.10.2005
<Ikar> писал(а):
2: при пошаговой прогонке программы, после выполнения команды GoTo 1 перепрыгиваешь сразу на End, минуя команды между 1: и End;

Ибо нужно писать Goto 1; точка с запятой в конце
И ещё набудущее: используй отступы, код будет легче читать,а также используй на форуме тэг code.

_________________
я теперь снова Junior )


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
<Ikar> писал(а):
1: при компиляции не моявляются точки (слева от команд) после метки 1- не компилируется?

Ну и обьясни ка мне, зачем ты присваиваеш переменным (ЛОКАЛЬНЫМ!) значения вконце процедуры и потом их нигде не используеш? Компилятор не дурак, он такие куски кода сразу вырезает


 

Esp, отступы использую, как использовать тег код?
перед else точка с запятой не ставится...
Ray Adams, мне нужна для дальнейших расчётов и на вывод переменная Temp. не выводил, т.к. запустил прогу в пошаговом режиме, дабы убедиться, что всё считается правильно, и столкнулся с описанним траблом. щас пропишу вывод и попробую, надеюсь всё получится. страно, знал, что компилятор выбрасывает не используемые куски кода, но как то даже не подумал об этом.
всем спасибо за советы.


 

<Ikar>
Еще замечание по коду - не используй "goto"!
В твоем случае нормально встает "break" после условия.


 

I_S_A ок, спс
я тока учюсь программиравать, поэтому ещё не знаю всех прописных истин


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
<Ikar> писал(а):
что всё считается правильно, и столкнулся с описанним траблом.

Это не трабл, компилятор режет не нужный код.


 

Большое всем спасибо, Ray Adams -- тебе отдельное спасибо, ты оказался полностью прав. теперь всё работает!!!


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 8 
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan