Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #59 da revista programar. Faz já o download aqui!

Darkling

[Resolvido] Gcc/g++ não mostram os resultados correctos quando compilados pela 2 ou 3 vez

Mensagens Recomendadas

Darkling    0
Darkling

Boas, eu estava a fazer um programa para a faculdade que faz alguns calculos. Nesse programa quando eu o compilo e o corro pela primeira vez, os valores de saida dão aquilo que é suposto dar mediante os valores de entrada, mas quando compilo e corro pela 2x ou 3x (sem alterar o codigo) ele não me dá os valores correctos de saida (sendo os valores de entrada exatamente os mesmos de quando o programa deu os valores de saida corretos). Eu trabalho no Linux e compilo com o gcc/g++. A minha duvida é, será que é culpa do meu código ou do gcc/g++?

#include <stdio.h>
#define MAX 20
float bullinton(float *altobj, float *distobj, float transmissor, float receptor, int n){


int i=0,j,l,w, k=0, count_tgt=0, count_tgr=0, max_tgt=0, max_tgr=0, max=0;
float tgt[n], tgr[n], somatorio_dist=0, alt=0, maxtgt=0, maxtgr=0, soma_transmissor, soma_recetor; //tangentes do transmissor e receptor

//Linha de vista para o transmissor
for(i=0;i<n;i++){
soma_transmissor+=distobj[i];
tgt[i]=(altobj[i]-transmissor)/(soma_transmissor);
}

//Linha de vista para o receptor
for(i=n-1,k=n;i>=0;i--){
soma_recetor+=distobj[i+1];
tgr[i]=(altobj[i]-receptor)/(soma_recetor);
}

//Mostra os valores da tangente e do receptor em cada posição
for(i=0,k=n;i<=n && k!=0;i++,k--){
printf("A tangente do transmissor na %d posição e: %.2f\nA tangente do receptor na %d e: %.2f\n",i,tgt[i],k,tgr[i]);
}

//valor maximo de tgt
for(i=1;i<n;i++){
if(tgt[i]>tgt[max_tgt]){
max_tgt=i;
}
}

//valor maximo de tgr
for(i=1;i<n;i++){
if(tgr[i]>tgr[max_tgr]){
max_tgr=i;
}
}

//Mostra o valor maximo de tgt e tgr
printf("O valor maximo de tgt e: %.2f\nO valor maximo de tgr e: %.2f\n",tgt[max_tgt],tgr[max_tgr]);

if(transmissor==receptor){
for(i=0;i<n+1;i++){
somatorio_dist+=distobj[i];
}
}

float tgtt=1/tgt[max_tgt];
float tgrr=1/tgr[max_tgr];

alt=somatorio_dist/(tgtt + tgrr);

printf("Tgtt=%.2f\nTgrr=%.2f\n",tgtt,tgrr);
printf("Somatorio %.2f\nA altura e: %.2f\n", somatorio_dist,alt);
}
int main(){


int i, numero_objectos=0;
float transmissor, receptor, altura_objecto[MAX], distancia_objecto[MAX];


puts("Introduza o numero de objectos: ");
scanf("%d",&numero_objectos);

for(i=0;i<numero_objectos;i++){
printf("Introduza a altura para o %d objecto:\n",i+1);
scanf("%f",&altura_objecto[i]);
}

for(i=0;i<numero_objectos+1;i++){
printf("Introduza a distancia para o %d objecto:\n",i+1);
scanf("%f",&distancia_objecto[i]);
}

puts("Introduza a altura do transmissor: ");
scanf("%f",&transmissor);

puts("Introduza a altura do receptor: ");
scanf("%f",&receptor);

bullinton(altura_objecto, distancia_objecto, transmissor, receptor, numero_objectos);

return 0;
} 

Editado por thoga31
GeSHi

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
HappyHippyHippo

sendo os valores de entrada exatamente os mesmos de quando o programa deu os valores de saida corretos

tenho sérias dúvidas disso (se realmente não houve alteração do código)

já agora porque raio compilas uma segunda vez visto não haver alteração ao código ?


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Darkling    0
Darkling

tenho sérias dúvidas disso (se realmente não houve alteração do código)

já agora porque raio compilas uma segunda vez visto não haver alteração ao código ?

Parece impossivel mas é verdade xD. A primeira vez que compilei estava tudo certo...a segunda vez foi para adicionar uma variavel e um ciclo e foi ai que notei que os valores mudaram e ficaram incorrectos. Apaguei as alterações que fiz (variavel e ciclo) e comecei a testar compilar mais do que uma vez para ver se reproduzia o mesmo erro e foi ai que percebi que tinha este problema xD.

Pronto, já encontrei o problema...embora que não percebi o porque de ser esta a solução. Neste ciclo aqui:

for(i=0;i<n;i++){
soma_transmissor+=distobj[i];
tgt[i]=(altobj[i]-transmissor)/(soma_transmissor);
}

Se eu não usar o 'i' e substituir por outra variavel qualquer o erro desaparece e ja posso compilar e correr as vezes que quiser que os valores são sempre os mesmos..agora eu não percebi o porque disto ser assim com o gcc no Linux e não no DevC++ no Windows. Se alguem souber e quiser partilhar ficava agradecido.

Editado por apocsantos
geshi

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Darkling    0
Darkling

tens um a mais ...

quais são realmente os dados de entrada ?

??? 3 para o numero de objetos, 50,80,110 para a altura dos 3 objectos, 20,30,50,70 para a distancia dos objectos (aqui tens sempre mais uma distancia do que o numero de objetos) e 10,10 para o transmissor e receptor.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
HappyHippyHippo

ok ... estuve a ver o código e já sei onde está o bug

isso não tem nada haver com o número de vezes que compilas ou mesmo a escolha de uma variável aleatória.

vou-te dizer exactamente onde está o erro sem dizer qual é para ver se chegas lá:

float /*  */ soma_transmissor, soma_recetor;

for(i=0;i<n;i++){
 soma_transmissor+=distobj[i];
 /*  */
}

for(i=n-1,k=n;i>=0;i--){
 soma_recetor+=distobj[i+1];
 /*  */
}


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Darkling    0
Darkling

Não inicializei as variaveis a zero (inicializei-as e o erro/bug desapareceu)...ja agora porque no gcc isto acontece e no DevC++ não? Ele inicializa as variaveis por default ou algo do genero? xD

Editado por Darkling

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jorgecarleitao    0
jorgecarleitao

Não inicializei as variaveis a zero (inicializei-as e o erro/bug desapareceu)...ja agora porque no gcc isto acontece e no DevC++ não? Ele inicializa as variaveis por default ou algo do genero? xD

Porque quando não inicializas as variáveis tens um "undefined behaviour" que significa que qualquer coisa pode acontecer. Em particular um compilador pode inicia-las correctamente, e o outro não, ou o teu computador pode explodir.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Darkling    0
Darkling

Porque quando não inicializas as variáveis tens um "undefined behaviour" que significa que qualquer coisa pode acontecer. Em particular um compilador pode inicia-las correctamente, e o outro não, ou o teu computador pode explodir.

LOL... ou pior, ligar-se a Amazon e encomendar 99999999999 copias do Roque Santeiro.

Lol...obrigado pela explicação...foi muito...hmm.....esclarecedora xD.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.