joao_o grande Posted January 4, 2016 at 12:05 AM Report Share #591283 Posted January 4, 2016 at 12:05 AM (edited) 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 January 4, 2016 at 08:56 PM by joao_o grande Link to comment Share on other sites More sharing options...
thoga31 Posted January 4, 2016 at 01:59 AM Report Share #591286 Posted January 4, 2016 at 01:59 AM (edited) 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 January 4, 2016 at 02:00 AM by thoga31 Knowledge is free! Link to comment Share on other sites More sharing options...
joao_o grande Posted January 4, 2016 at 07:39 PM Author Report Share #591335 Posted January 4, 2016 at 07:39 PM (edited) 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 January 4, 2016 at 08:55 PM by joao_o grande Link to comment Share on other sites More sharing options...
nunopicado Posted January 7, 2016 at 10:38 AM Report Share #591540 Posted January 7, 2016 at 10:38 AM 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 More sharing options...
thoga31 Posted January 7, 2016 at 12:56 PM Report Share #591549 Posted January 7, 2016 at 12:56 PM Para complementar, sugiro a leitura deste documento 😉 1 Report Knowledge is free! Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now