Jump to content
smile_135

Erro procedimentos

Recommended Posts

smile_135

Boa tarde..

Tenho o seguinte erro quando chamo um procedimento dentro de outro procedimento.


procedure imprimeAlunos;
begin
     writeln('ALUNOS');
     writeln('1 - INCLUSAO');
     writeln('2 - ALTERACAO');
     writeln('3 - CONSULTA');
     writeln('4 - EXCLUSAO');
     writeln('0 - RETORNAR');
     writeln('OPCAO :');
     readln(opcao);

     while opcao > 5 do
     begin
        ClrScr;
            writeln('Opcao invalida. Tente novamente.');
            readln();
            ClrScr;
            imprimeAlunos;
            readln(opcao)
     end;

     case opcao of
          1: imprimeIntroducaoDeConta;
          2: imprimeAlteracaoDeAluno;
          3: imprimeConsultaDeAluno;
          4: imprimeExclusaoDeAluno;
          0: imprimeMenuPrincipal;
     end;
end;

Quando compilo o código surge o seguinte erro 42 / 19 untitl~1.pas

Error: Identifier not found (nome do procedimento que estou a chamar) bem como o Illegal expression.

A variável opcao está definida como variavel global do tipo inteiro.

Já andei a pesquisar e não encontro a solução para este erro.

Agradecia que alguém me desse umas dicas de como resolver esta questão.

Obrigado

Share this post


Link to post
Share on other sites
smile_135
program project1;
uses crt;
TYPE tipoaluno=RECORD
              NOME, MORADA:string;
              IDADE, TELEFONE, TURMA: integer;
           end;
Var aluno: tipoaluno;
    opcao: integer;
procedure imprimeMenuPrincipal;
begin
      writeln('MENU PRINCIPAL');
      writeln('1 - ALUNOS');
      writeln('2 - TURMAS');
      writeln('3 - RELATORIOS');
      writeln('0 - FINALIZAR');
      writeln('OPCAO :');
end;
procedure imprimeAlunos;
begin
     writeln('ALUNOS');
     writeln('1 - INCLUSAO');
     writeln('2 - ALTERACAO');
     writeln('3 - CONSULTA');
     writeln('4 - EXCLUSAO');
     writeln('0 - RETORNAR');
     writeln('OPCAO :');
     readln(opcao);

     while opcao > 5 do
     begin
        ClrScr;
            writeln('Opcao invalida. Tente novamente.');
            readln();
            ClrScr;
            imprimeAlunos;
            readln(opcao)
     end;

     case opcao of
          1: imprimeIntroducaoDeConta;
          2: imprimeAlteracaoDeAluno;
          3: imprimeConsultaDeAluno;
          4: imprimeExclusaoDeAluno;
          0: imprimeMenuPrincipal;
     end;
end;

procedure imprimeIntroducaoDeConta;
begin
     writeln('INTRODUCAO DE CONTA');
     writeln('NOME :');
     writeln('MORADA :');
     writeln('IDADE :');
     writeln('TELEFONE :');
     writeln('TURMA :');
     writeln('CONFIRMA INTRODUCAO ( S/N ) ? ');
     writeln('NOVA INTRODUCAO ( S/N ) ? ');
end;
procedure imprimeAlteracaoDeAluno;
begin
     writeln('ALTERACAO DE ALUNO');
     writeln('NOME :');
     writeln('MORADA :');
     writeln('IDADE :');
     writeln('TELEFONE :');
     writeln('TURMA :');
     writeln('CONFIRMA ALTERACAO ( S/N ) ? ');
     writeln('NOVA ALTERACAO ( S/N ) ? ');
end;
procedure imprimeConsultaDeAluno;
begin
     writeln('CONSULTA DE ALUNO');
     writeln('NOME :');
     writeln('MORADA :');
     writeln('IDADE :');
     writeln('TELEFONE :');
     writeln('TURMA :');
     writeln('NOVA CONSULTA ( S/N ) ? ');
end;
procedure imprimeExclusaoDeAluno;
begin
     writeln('EXCLUSAO DE ALUNO');
     writeln('NOME :');
     writeln('MORADA :');
     writeln('IDADE :');
     writeln('TELEFONE :');
     writeln('TURMA :');
     writeln('CONFIRMA EXCLUSAO ( S/N ) ? ');
     writeln('NOVA EXCLUSAO ( S/N ) ? ');
end;

BEGIN
       imprimeMenuPrincipal;
       readln(opcao);

       while opcao <> 1  do
       begin
                 ClrScr;
            writeln('Opcao invalida. Tente novamente.');
            readln();
            ClrScr;
            imprimeMenuPrincipal;
               readln(opcao);
       end;


       if opcao = 1 then
       begin
            ClrScr;
             imprimeAlunos ;
       end;
       readln();
end.
                                                           
                                                    

Share this post


Link to post
Share on other sites
dicas3d

Tens que declarar todos os métodos antes das linhas que os usam mesmo que estas estejam noutro método.

O código fica assim:

program project1;
uses crt;
TYPE tipoaluno=RECORD
              NOME, MORADA:string;
              IDADE, TELEFONE, TURMA: integer;
           end;
Var aluno: tipoaluno;
    opcao: integer;
procedure imprimeIntroducaoDeConta;
begin
     writeln('INTRODUCAO DE CONTA');
     writeln('NOME :');
     writeln('MORADA :');
     writeln('IDADE :');
     writeln('TELEFONE :');
     writeln('TURMA :');
     writeln('CONFIRMA INTRODUCAO ( S/N ) ? ');
     writeln('NOVA INTRODUCAO ( S/N ) ? ');
end;
procedure imprimeAlteracaoDeAluno;
begin
     writeln('ALTERACAO DE ALUNO');
     writeln('NOME :');
     writeln('MORADA :');
     writeln('IDADE :');
     writeln('TELEFONE :');
     writeln('TURMA :');
     writeln('CONFIRMA ALTERACAO ( S/N ) ? ');
     writeln('NOVA ALTERACAO ( S/N ) ? ');
end;
procedure imprimeConsultaDeAluno;
begin
     writeln('CONSULTA DE ALUNO');
     writeln('NOME :');
     writeln('MORADA :');
     writeln('IDADE :');
     writeln('TELEFONE :');
     writeln('TURMA :');
     writeln('NOVA CONSULTA ( S/N ) ? ');
end;
procedure imprimeExclusaoDeAluno;
begin
     writeln('EXCLUSAO DE ALUNO');
     writeln('NOME :');
     writeln('MORADA :');
     writeln('IDADE :');
     writeln('TELEFONE :');
     writeln('TURMA :');
     writeln('CONFIRMA EXCLUSAO ( S/N ) ? ');
     writeln('NOVA EXCLUSAO ( S/N ) ? ');
end;

procedure imprimeMenuPrincipal;
begin
      writeln('MENU PRINCIPAL');
      writeln('1 - ALUNOS');
      writeln('2 - TURMAS');
      writeln('3 - RELATORIOS');
      writeln('0 - FINALIZAR');
      writeln('OPCAO :');
end;
procedure imprimeAlunos;
begin
     writeln('ALUNOS');
     writeln('1 - INCLUSAO');
     writeln('2 - ALTERACAO');
     writeln('3 - CONSULTA');
     writeln('4 - EXCLUSAO');
     writeln('0 - RETORNAR');
     writeln('OPCAO :');
     readln(opcao);

     while opcao > 5 do
     begin
        ClrScr;
            writeln('Opcao invalida. Tente novamente.');
            readln();
            ClrScr;
            imprimeAlunos;
            readln(opcao)
     end;

     case opcao of
          1: imprimeIntroducaoDeConta;
          2: imprimeAlteracaoDeAluno;
          3: imprimeConsultaDeAluno;
          4: imprimeExclusaoDeAluno;
          0: imprimeMenuPrincipal;
     end;
end;

BEGIN
       imprimeMenuPrincipal;
       readln(opcao);

       while opcao <> 1  do
       begin
                 ClrScr;
            writeln('Opcao invalida. Tente novamente.');
            readln();
            ClrScr;
            imprimeMenuPrincipal;
               readln(opcao);
       end;


       if opcao = 1 then
       begin
            ClrScr;
             imprimeAlunos ;
       end;
       readln();
end.


Abraços

dicas3d

Share this post


Link to post
Share on other sites
smile_135

Desculpa mas podes-me indicar mais precisamente o que alteras-te, visto eu não estou a ver o que está diferente e gostava realmente de perceber a solução e não apenas limitar-me a ver que funciona....

e já agora obrigado pela solução e pela rapidez na resposta.

Share this post


Link to post
Share on other sites
dicas3d

Os procedimentos imprimeIntroducaoDeConta, imprimeAlteracaoDeAluno, imprimeConsultaDeAluno e imprimeExclusaoDeAluno. Teem de ser declarados antes das linhas que os usam mesmo que sejam noutro procedure.

Vê lá se estes procedimentos não estão declarados antes do procedimento imprimeAlunos (onde está algures a linha do erro). É essa a diferença, o pascal é sensivel a isso, pelo menos o FPC.


Abraços

dicas3d

Share this post


Link to post
Share on other sites
thoga31

o pascal é sensivel a isso, pelo menos o FPC.

O Pascal é sensível a isso, qualquer que seja o compilador. É a lei do Pascal.

Explicando melhor: um procedimento, função ou variável tem de ser declarado antes do ponto em que é chamado/invocado. Caso se invoque um procedimento, função ou variável que só está declarado/programado depois do ponto de chamada é um objecto não encontrado pelo identificador do compilador até ao momento, isto porque o Pascal é compilado de cima para baixo, de forma linear - quando chamas o procedure2 no procedure1, e que só está declarado depois do procedure1, então significa que o identificador ainda não encontrou o procedure2.

Procedure procedure1
begin
     write('texto');
     procedure1; // a este ponto, o identificador ainda não encontrou o PROCEDURE1
     // etc...

Procedure procedure2
// ...

Cumpz.


Knowledge is free!

Share this post


Link to post
Share on other sites
nunopicado

Tal e qual disseram o dicas3d e o thoga31...

Só mais um pormenor:

Há casos em que as chamadas de procedimentos são cruzadas, ou seja, num chamas o que está mais acima, mas nesse tens de chamar o outro que está mais abaixo.

Como eles disseram, isto não é permitido.

Para isso, o pascal (embora nem em todos os compiladores isto funcione) possui uma palavra chave que permite que a implementação de um procedimento/função seja feita depois de ser chamado.

Ex.:

procedure escreve(valor:integer);
begin
    writeln(valor*pi);
end;

function pi;
begin
   pi:=3.14;
end;

Imagina que por algun motivo tinhas de manter esta ordem...

Como está iria dar o mesmo erro que tens no teu programa.

Para resolver, fazia-se o seguinte:

function pi; forward;

procedure escreve(valor:integer);
begin
    writeln(valor*pi);
end;

function pi;
begin
   pi:=3.14;
end;

Pronto, assim já dava... Mete-se a declaração (só a primeira linha) da função que está mais abaixo antes da primeira chamada, seguida da palavra chave "forward;". Assim dizemos ao compilador que a implementação daquela função/procedimento está mais à frente, o que o obrigava a ir lá ver naquele momento... Assim já não dava erro!

No entanto isto não funciona em todos os compiladores... Salvo erro o PascalZim é um dos que não permite isto!


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
thoga31

No entanto isto não funciona em todos os compiladores... Salvo erro o PascalZim é um dos que não permite isto!

Pois, sendo que o PascalZim não é aconselhado por ninguém, para ninguém. :)

Fica a nota do nunopicado, muito útil para certas situações. :)


Knowledge is free!

Share this post


Link to post
Share on other sites
Lukas S.

:smoke:

Pois, sendo que o PascalZim não é aconselhado por ninguém, para ninguém. :)

Fica a nota do nunopicado, muito útil para certas situações. :D

Ainda nao entendi qual o vosso problema com o PascalZim ... Alguém pode explicar ?


E o Impossível foi criado por pessoas fracas pra acabar com o sonho das pessoas fortes. Não deixes que acabem com o teu. Sonha , luta , ambiciona e realiza. Se amas , se gostas tu vais conseguir. Cala todas as pessoas que um dia duvidaram de ti e prova que foste mais forte de qualquer outro.

Share this post


Link to post
Share on other sites
nunopicado

Nada de especial...

Apenas vários comandos importantes para uma programação mais a sério que não estão contemplados!

Eu não posso falar muito, pois pouco o usei, mas das raras vezes, deu quase sempre gato.


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
thoga31

:smoke:

Ainda nao entendi qual o vosso problema com o PascalZim ... Alguém pode explicar ?

Subscrevo o que o nunopicado disse.

Acrescento que também já o experimentei, e faltam muitas bibliotecas que eu utilizo nos ditos "grandes IDEs", como o FP ou o Dev-Pascal - enquanto não estiver bem desenvolvido, deixa MUITO a desejar, pelo menos para quem programa Pascal (e Delphi) como eu, que uso e abuso de muitas potencialidades desta linguagem.


Knowledge is free!

Share this post


Link to post
Share on other sites
nunopicado

Aliás, o facto de não permitir trabalhar com units (tanto quanto sei) é o mesmo que por uma etiqueta a dizer: "Não sirvo para trabalhar, é só mesmo demonstração!"

Basicamente, o que se espera de qualquer compilador é que a linguagem que este se propõe a compilar esteja implementada na sua totalidade.

No caso do PascalZim, não está...


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
pwseo

Basta referir que o Pascalzim não é uma implementação completa do Pascal para justificar a não utilização do mesmo para coisas sérias.

No site do Pascalzim:

O compilador implementa um subconjunto da linguagem Pascal e contém as estruturas de dados, funções e comandos mais utilizados por iniciantes no estudo dessa linguagem.

O Pascalzim é bom para uma leve introdução à programação estruturada (o que são variáveis, funções, ciclos, etc). Mas fica-se por aí. O próprio autor refere e reforça isto mesmo.

Compiladores decentes: Delphi, FreePascal, e possivelmente GNU Pascal (embora nunca tenha experimentado este último).

EDIT: Delphi e FreePascal suportam também Object Pascal, algo que curiosamente nunca ninguém fala. Não sei se outros compiladores suportam, no entanto.

EDIT2: O Pascalzim, tanto quanto sei, nem sequer é um verdadeiro compilador, mas sim um interpretador (incompleto). Não quero com isto tirar o mérito ao seu autor, mas gostava que as pessoas se apercebessem que ele fez o Pascalzim para as pessoas aprenderem e fazerem pequenas coisas, não para o compararem com coisas a sério.

Share this post


Link to post
Share on other sites
nunopicado

O Turbo Pascal e o Borland Pascal (seu sucessor) já suportavam Object Pascal (a partir da versão 6 se não me falha a memoria). Mas confesso que nunca usei objectos no tempo do DOS. Só com o Delphi é que comecei.


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.