Jump to content

gcc/g++ não mostram os resultados correctos quando compilados pela 2 ou 3 vez


Darkling
 Share

Go to solution Solved by Darkling,

Recommended Posts

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;
} 
Edited by thoga31
GeSHi
Link to comment
Share on other sites

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
Link to comment
Share on other sites

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.

Edited by apocsantos
geshi
Link to comment
Share on other sites

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
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

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
 Share

×
×
  • 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.