Помощь - Поиск - Пользователи - Календарь
Полная версия: Вызов процедуры через case
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
KIngSpades
Здраствуйте, форумчани!
Я недавно занимаюсь Паскалем и у меня появилась одна проблема.
Есть две процедуры. При создании программы проверялась работа при одной процедуре. ПРограмма работала. После создания второй процедуры я ввел конструкцию case такого типа:
Код
Program ...
var x:char; a,b,c,d,f:real;
Procedure1(a,b:real; var c:real);
begin
...
end;
Procedure2(c,d:real; var f:real);
begin
...
end;
begin
readln(x);
case x of
'Y':procedure1(a,b,c);
'Z':procedure2(c,d,f);
end;
readln
end.


При отсутсвии case и использования одной процедуры программа работает отлично.
При использовании программы, приведенной выше программа считывает Х и после етого должна запускаться процедура 1 (или 2). Но после ввода каких либо данных окно программы закрываеться.
Помогите пожалуйста решить ету проблему.
Надеюсь на понимание.

P.S Процедура 2 аналогична Процедуре 1, но только с другими данными.
IUnknown
Во-первых, так быть не должно. То есть, программа должна нормально работать. Почему она вылетает - это тебе предстоит выяснить. Пройди по программе пошагово (через F7), отладчиком, и выясни, где именно она валится, на какой строке (подробнее об отладке можно почитать здесь)... Я надеюсь, все возможные проверки в Options -> Compiler -> Runtime Errors включены? Это тоже может помочь обнаружить проблему...

А во-вторых, не совсем понятно. Если процедуры одинаковые, и только данные разные, то зачем их две? Передавай в том же Case в одну и ту же процедуру разные данные. Для этого подпрограммы и существуют. Какой смысл делать несколько версий, отличающихся только названиями параметров?
KIngSpades
Спасибо за ответ.
Попробую сделать как ты сказал.
Если надо я мог бы выложить код программы, чтоб понять суть приминения двух процедур.

Добавлено через 8 мин.
К сожалению, отладака не сработала так как программа хоть и не работает правильно но все же запускаеться, и Turbo Pacal не видит никаких ошибок.
Код
program pokerdraw;
uses crt;
var F,T,E,G:integer; st,sk,r:real; v:char;
procedure Flush(st,sk:real; var r:real);
begin
readln(st);
readln(sk);
st:= st / 100;
r:= sk/st;
writeln('текст­');
writeln('37 %');
writeln('текст');
if (r <= 37) then  writeln('Да');
if (r > 37) then writeln('Нет');
end;
Procedure OESD(st,sk:real; var r:real);
begin
readln(st);
readln(sk);
st:= st / 100;
r:= sk/st;
writeln('Текст');
writeln(' 33 %');
writeln('Текст ');
if (r <= 33) then  writeln('Да');
if (r > 33) then writeln('Нет');
end;
begin
clrscr;
readln(v);
case v of
'F':flush(st,sk,r);
'E':OESD(st,sk,r);
end;
readln
end.

Надеюсь ето поможет.
Я новичок поетому не судите строго если наидете банальние ошибки.
IUnknown
Все работает совершенно нормально. Запускается программа:
F
10
20
текст­
37 %
текст­
нет

, или
E
150
200
Текст
33 %
Текст
Нет

(FPC 2.4.4, если что, но причин не работать под Турбо Паскалем не видно. Будет точно то же самое).

Уж не знаю, что ты там вводишь, чтоб оно не работало. Буквы точно в верхнем регистре? Нулевых значений нет?

Цитата
К сожалению, отладака не сработала
А ты проходил пошагово? Что значит не сработала? Строка за строкой жмешь F7, и говоришь, на какой именно строке программа ведет себя не так, как ожидалось. Ты что, хотел, чтоб тебе сразу появилось сообщение, что у тебя в такой-то строке ошибка? Этого не будет...

Пойми, я не телепат, я не знаю, что именно ты вводишь, как именно реагирует твоя программа.
KIngSpades
Спасибо большое за помощь. Ошибка оказалась самая банальная.
При запуске программы я использовал "е" а не "Е", думал что ето не важно)
IUnkown, большое спасибо за помощь!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.