我在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;
}
答案 0 :(得分:5)
您的代码显示未定义的行为。
int i, numero_objectos=0;
float altura_objecto[numero_objectos], distancia_objecto[numero_objectos], transmissor, receptor;
在此,您将altura_objecto
和distancia_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 ++时)请分享,因为我完全不知道原因。感谢您的帮助。