Jump to content

Erro: passagem por referência


joao_o grande

Recommended Posts

Quando tento correr este programa ele dá o seguinte erro:

Apenas variáveis podem ser passadas por refer^ncia para um subprograma.

Afinal qual é o problema?? Nunca me apareceu um erro destes.

O meu objetivo é fazer uma procedure que faça um quadrado ou retangulo mt completo para usar noutros programas(é por isso que não o fiz no programa principal..

Program quadrado_retangulo;
Procedure forma_quadrado_retangulo (var x1,x2,y1,y2,cor_limites:byte;Preencher:boolean;Cor_Preenchimento:byte);
var comprimento,largura,i,j,x1_P,x2_P,y1_P,y2_P:byte;

Begin
 window(1,1,80,25);
 for i:= x1 to x2 do
 begin
   If (cor_limites<0) or (cor_limites>15) then cor_limites:=10; //Se nao estiver nas cores aceites peslo pascal então fica verde claro
   textcolor(cor_limites);
Gotoxy(i,y1);
   Write(#205);
   Gotoxy(i,y2);
   Write(#205);
 end;

 for i:= y1 to y2 do
 begin
   textcolor(cor_limites);
   Gotoxy(i,y1);
   Write(#186);
   Gotoxy(i,y2);
   Write(#186);
 end;

 If Preencher then
  begin
   x1_P:=x1+1;
   y1_P:=y1+1;
   x2_P:=x2-1;
   y2_P:=y2-1;
   for i:=x1_P to x2_P do
 begin
 for j:=y1_P to y2_P do
  begin
    If (cor_preenchimento<0) or (cor_preenchimento>8) then cor_preenchimento:=0;
Textbackground(cor_preenchimento); 
         Gotoxy(i,j);
Writeln(#219);
       end;
end; 
End;    
End;

Begin
 forma_quadrado_retangulo(2,78,2,23,15,True,4);
End.
Edited by joao_o grande
Link to comment
Share on other sites

Duas coisas:

1) O nome do procedimento não pode ser igual ao nome do programa - nem sei como é que o compilador avançou para além daí uma vez que é um erro de classe "fatal".

2) Esse código só por si não é a origgem do erro que disseste. É num sítio em que chamaste esse procedimento, creio.

Um apontamento à parte:

Estas condições são redundantes:

If quadrado=True then
If Preencher=True then

Tendo em conta que a operação de igualdade retorna um booleano, podemos (e devemos) usar directamente o valor booleano. Basta então isto:

If quadrado then
If Preencher then
Edited by thoga31

Knowledge is free!

Link to comment
Share on other sites

2) Esse código só por si não é a origgem do erro que disseste. É num sítio em que chamaste esse procedimento, creio.

Este procedimento encontra-se num programa à parte e o programa principal fica assim:

Begin
 forma_quadrado_retangulo(2,78,2,23,15,True,4);
End.[/Code]

Ps. vê o codigo outra vez. Alterei umas coisas.
Tendo em conta que a operação de igualdade retorna um booleano, podemos (e devemos) usar directamente o valor booleano. Basta então isto:
[code=pascal]
If quadrado then
If Preencher then

Nao sabia que bastava fazer assim, mas já retirei essa parte do quadrado, torna-se muito complicado. vou deixar só o preencher.

Outra coisa: na variavel char_laterais e char_topos, eu quero escrever o símbolo #219 da tabela ASCII mas o compilador escreve #219 em vez do simbolo da tabela. Já experimentei mudar a variável para char, mas não consigo.O que é que devo mudar??

Edited by joao_o grande
Link to comment
Share on other sites

O teu problema é que estás a passar valores efectivos para parâmetros desse procedimento.

Mas na declaração, estás a pedir não parametros mas referências.

Basta tirares o VAR da declaração e fica resolvido:

Em vez de:

Procedure forma_quadrado_retangulo (var x1,x2,y1,y2,cor_limites:byte;Preencher:boolean;Cor_Preenchimento:byte);

Mete:

Procedure forma_quadrado_retangulo (x1,x2,y1,y2,cor_limites:byte;Preencher:boolean;Cor_Preenchimento:byte);

Quando está lá o VAR na declaração de um procedimento ou função, tens de lhe dar variáveis, e não valores, quando chamas esse procedimento ou função.

Terias de chamar assim (para não dar erro):

var
  x1, x2, y1, y2, cor_limites: Byte;
Begin
 x1          := 2;
 x2          := 78;
 y1          := 2;
 y2          := 23;
 cor_limites := 15;
 forma_quadrado_retangulo(x1, x2, y1, y2, cor_limites, True, 4); // O True e o 4 podem ficar pois não tens o VAR na declaração do procedimento para esses parâmetros
End.

Podias fazer isto, mas não faz sentido. Só vais usar os valores no procedimento, não vais precisar alterá-los e devolver essa alteração, pelo que é o ideal tirares de lá o VAR.

"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.

Link to comment
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.