编译3次以上时,Gcc / G ++没有给出正确的结果

时间:2015-04-30 14:16:37

标签: c gcc

我在C学院为我的大学(使用gcc的Linux)上的一个课程创建了一个程序来做一些微积分。程序正常工作第一次和第二次我编译并运行它(文件的gcc名称-o输出文件的名称),但第三次总是给出不同的值而不更改任何代码。我的问题是......问题出在gcc / g ++或我的代码中?在Dev-C ++下的Windows上,无论我运行多少次,它都能正常工作。如果它是错误/怪异的话,我会在网站上有一些麻烦,并且没有时间去关注它。

#include <stdio.h>

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 altura_objecto[numero_objectos], distancia_objecto[numero_objectos], transmissor, receptor;


    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;
}

3 个答案:

答案 0 :(得分:5)

您的代码显示未定义的行为。

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

在此,您将altura_objectodistancia_objecto声明为零长度数组。无论你以后对numero_objectos做什么,这些数组仍然无效。您可以在读取对象数量后放置这些声明,但可变长度数组是编译器扩展;它们不是标准的。

最好将这些数组声明为std::vector<float>。假设你实际上在使用C ++。你不应该把你的问题标记为C和C ++,它们在这一点上是非常不同的语言。

答案 1 :(得分:1)

您正在创建一个大小为零的数组,因为numero_objectos分配了0并且使用该数字创建了数组。数组不能像这样动态缩放。

你想要的是动态数组。为此,您首先要求像现在一样要求数组大小,然后使用该数字进行内存分配。 像这样:

float *altura_objecto, *distancia_objecto;
puts("Introduza o numero de objectos: ");
scanf("%d",&numero_objectos);
altura_objecto = malloc(numero_objectos * sizeof(*altura_objecto));
distancia_objecto = malloc(numero_objectos * sizeof(*distancia_objecto));

将创建所需大小的数组。在你完成之后你必须释放那些记忆。你可以通过调用free()并将相应的指针作为参数来实现。

答案 2 :(得分:0)

好的,我明白了。感谢@TartanLlama的最后评论,这是完全有道理的。所以“核心错误”(我想知道的事情)就在这里:

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];
   /*  */
}

我只需要提供soma_transmissor和soma_recetor。现在,如果有人知道为什么我必须这样做以确保始终出现正确的结果(当使用gcc而不是使用DevC ++时)请分享,因为我完全不知道原因。感谢您的帮助。