Ir ao conteúdo
  • Cadastre-se

VisualG Por que um valor aleatório está retornando para minha variável "T3"?


Ir à solução Resolvido por Simon Viegas,

Posts recomendados

Eu sei que o comando está errado, falta adicionar o "var" antes do parâmetro, e colocar o "retorne c" no final da função, mas eu fiquei com uma dúvida enquanto estava programando... porque quando o código está neste estado um valor nada a ver é atribuído a "T3"?

 

algoritmo "semnome"
var
   t1,t2,t3,c:inteiro

funcao fibonacci( a,b,c:inteiro):inteiro
var
inicio
   C <- A+B
   A <- B
   B <- C
fimfuncao

inicio
   escreva(t1)
   t2 <- 1
   escreva(t2)
   para c <- 1 ate 10 faca
      T3 <- fibonacci(t1,t2,t3)
      escreva(t3)
   fimpara
fimalgoritmo

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP
  • Solução
17 horas atrás, Nilker disse:

porque quando o código está neste estado um valor nada a ver é atribuído a "T3"?


Provavelmente teria algo a ver com o gerenciamento de memória no VisualG.

 

Nos testes aqui, no primeiro loop, quando c está igual a 1, o programa estaria retornando o valor que está atribuído a t2...

 

Para o restante do loop estaria retornando o que seria o "último valor da sequência". Meio que está apontando para o "suposto enderenço de memória do retorno da função"...  o que seria a "variável fibonacci".

 

Tipo, lá quando você colocou:

T3 <- fibonacci(t1,t2,t3)


Perceba que a própria função funciona como uma variável.. você podendo "copiar o valor dela", que no caso seria o "tal retorno da função"...

 

Beleza. Vamos demonstrar.. 

 

Se for a primeira vez que executou o código, provavelmente vai aparecer assim:

 

image.png

 

Esse primeiro 0 é o valor de t1. O 1 é o valor que está em t2. Vou mudar para 7, veja:

 

image.png

 

 

Agora vou inserir o retorne e o var:

 

image.png

 

image.png

 

Observe o valor final deu, eventualmente, 89. Esse foi o "último retorno". O que estaria lá no endereço que seria do retorno da função.

 

 Daí, ao executar novamente o seu "código incompleto". (Basta remover o retorne, ou seja: parar de atualizar o valor do retorno.)

 

image.png

 

Oh! Lá! Esse primeiro 0 é o valor de t1, o 1 é do t2 e o restante seria o tal "valor que está lá na memória"... um "lixo da execução anterior". O VisualG estaria sempre retornando o último valor que está lá onde seria o retorno da função.

 

 

Resumindo: o motivo não seria tão importante. D

   se (op = "sair") entao
     fimAlgoritmo
   fimSe

e qualquer modo esse código não era nem para rodar, já que a função está sem retorno.

 

Veja: existe uma diferença entre "erro de lógica", como por exemplo não colocar o var e a conta dar errada. E o "erro de sintaxe", como no exemplo de de não colocar o retorne. Para esse último, o "compilador" nem deveria deixar rodar... apenas acontece que o VisualG não compila o código, ele sequer é capaz de verificar que tem esse problema (de não ter o retorne)... são coisas da "IDE".

 

 

 

 

Adendo 1:

17 horas atrás, Nilker disse:

Eu sei que o comando está errado, falta adicionar o "var" antes do parâmetro [..]

 

Como citado, a necessidade ou não do var estaria ligado apenas a lógica. Isso não tem influência direta no erro do que está acontecendo.

 

 

 

Adendo 2: 

17 horas atrás, Matheus Rodrigues disse:

Está com inicial maiúscula, tem que colocar como está na variável.

 

't3', e não 'T3'.

 

@Matheus Rodrigues, essa constatação faz até sentido no mundo da programação, mas não teria relação com o problema, pois o VisualG não é Case Sensitive.

 

 

 

RESUMINDO:

A falta do retorne na função está causando um bug no VisualG. Entendo que isso NÃO seria uma "forma de implementar" códigos. O retorne é um requisito. Conceitualmente o programa não poderia ficar assim, mesmo que esse recurso (ficar sem o retorne) funcionasse para alguma lógica... Seria um glitch. (Ou algo do tipo.)

 

Só para deixar claro: imagine que por alguma sorte absurda o código com erro tivesse pegando o valor de C para o retorno. O resultado do cálculo poderia dar certo, mas..... mesmo assim estaria ERRADO. Pois necessariamente teria que vir do explicitamente pelo retorne.

 

 

 

 

PS:

Outro exemplo de glitch:

 

   se (op = "sair") entao
     fimAlgoritmo
   fimSe

 

Se utilizar algo do tipo no programa iria funcionar, mas essa sintaxe não existe! Não poderia "utilizar o fimAlgoritmo" para forçar o encerramento. O código "roda" porque o VisualG é "bugado"/"tem limitações"... :D

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...