帕斯卡致命错误“;”预期但其他成立

时间:2014-01-08 20:48:48

标签: windows pascal freepascal

uses crt;
var
     i: integer;
  stav: integer;
  prsten: boolean;

begin 
  clrscr();
  stav:=0;
  prsten:=false;
repeat
   case stav of
     0: begin  //Zacatek hry//
        writeln('Toto je hra, jsi Princ a jsi v lese.');
        writeln('Na krizovatce muzes jit doleva = 1, nebo doprava = 2');
        readln(stav);
       end;

     1: begin
         writeln('Potkas draka, ktery vezni krasnou princeznu. ');
         writeln('3 = Prepadnout draka, 4 = Promluvit s nim');
         readln(stav);
        end;

     2: begin
         writeln('Potkas pocestneho. ');
         writeln('5 = Pokracujes dal lesem, 6 = Promluvit s pocestnym');
         readln(stav);
        end;

     3: begin
         writeln('Drak je silnejsi nez Ty a tak te rozprasil na popel.');
         writeln('Zacni znovu stisknutim klavesy 0.');
         readln(stav);
        end;

     4: begin
         writeln('Drak Te vyzve na souboj, ale Ty na nej nejsi jeste pripraven.');
         writeln('Musis pokracovat dal lesem. Stiskni 5.');
         readln(stav);
        end;

     5: begin
         writeln('Po dlouhe a namahave ceste jsi dorazil do mistni knajpy.');
         writeln('Najis a napijes se a pokracujes dal. Kousek od knajpy   potkas         pocestneho');
         writeln('Promluvis s nim. Stiskni 6.');
         readln(stav);
        end;
     6: begin
         writeln('Povis mu, ze se pokousis zachranit princeznu pred drakem.');
         writeln('On se ti rozhodne pomoci a daruje Ti kouzelny prsten.');
         writeln('Nasadit prsten na ruku a pokracovat k drakovi 7 / Strcit prsten do    kapsy 8 a pokracovat k drakovi.');
         readln(stav);
        end;
     7: begin
         writeln('Prijdes k drakovi a das se s nim do boje.');
         writeln('Draka zabijes a muzes pokracovat k princezne.');
         writeln('Pokracovat k princezne, stiskni 9.');
         prsten:=true;
         readln(stav);
        end;
     8: begin
         writeln('Prijdes k drakovi a das se s nim do boje.');
         writeln('Draka zabijes a muzes pokracovat k princezne.');
         writeln('Pokracovat k princezne, stiskni 9.');
         readln(stav);
         prsten:=false;
        end;
     9: begin
         if prsten then

           writeln('Princeznu jsi uchvatil a muzes si ji odvest do hradu.');

         else

           wrtieln('Princezna je rada, ze jsi ji zachranil, ale opovrhuje Tebou.');

         readln(stav);
        end;
   end;
until stav<0;

writeln('KONEC');
readln;
end.

导致fatal error ";" expected but else founded消息的原因是什么?

2 个答案:

答案 0 :(得分:4)

与C不同,在Pascal中,分号; 分隔语句,它不会终止它们,then子句需要单个语句。 then WriteLn(...); else是两个陈述;你想要then WriteLn(...) else

答案 1 :(得分:2)

让我们借此机会了解如何阅读和使用错误信息。

编译器会准确地告诉您错误是什么(在;之前它是else,因为错误消息中提到了这两个错误)。它还为您提供报告错误的确切行号;这是数字(通常在错误信息之前的括号中,如(来自Delphi):

  

[DCC错误] Project2.dpr(14):E2153';'在'ELSE'之前不允许

所以错误发生在第14行(在我的代码中 - 你的号码会有所不同)。让我们看一下前后的那一行:

if prsten then
  writeln('Princeznu jsi uchvatil a muzes si ji odvest do hradu.');
else
  wrtieln('Princezna je rada, ze jsi ji zachranil, ale opovrhuje Tebou.');

请查看错误消息:

  

';'在'ELSE'之前不允许

这清楚地告诉您;之前的行else是问题(非常清楚,因为它说不允许),所以删除它。

顺便说一下,现在你会得到另一个错误:

  

[DCC错误] Project2.dpr(15):E2003未声明的标识符:'wrtieln'

我认为你应该能够把它弄清楚;再次,编译器为您提供确切的行号。

如果您发布了整个代码,那么您将获得另一个代码:

  

[DCC错误] Project2.dpr(18):E2029预期声明但发现文件结束

这是因为你遗漏了标记Pascal中程序文件结尾的end.。如果您还没有发布完整的代码,那么您可能无法获得它。

当您从编译器收到错误消息时,学会实际读取这一词很重要。在大多数语言中,消息的措辞明确,并且所有都有可用于尝试找出(或至少缩小)代码中问题的信息。