我编写了一个 C 脚本,可以为另一个应用程序生成文本文件。 float “b”得到一个非常高的值,我不知道为什么。我有一个几乎相同的文件,但没有发生这种情况。我是 C 新手,所以任何帮助将不胜感激 - 我明白这可能是一个非常简单的错误。代码如下。
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#define LARGESTR 1000
#define INITIALTIME 40
void clear_string(char *s,int l)
{
int i;
for(i=0; i<l; i++)
s[i]='\0';
}
int main(void)
{
char buffer[LARGESTR];
int ramp_flow = 5, car_count_seg1 = 45, car_count_seg2 = 45, car_count_seg3 = 45, fw_upstream_queue = 20, onramp_queue = 60, a;
float outflow_count, percentout = 0.7, b;
//Total Input to system
for(a=(INITIALTIME + 10); a<(INITIALTIME + 250); a+=10) {
if((a>=10) && (a<600)) {
b=b+1.39+0.556;
}
if((a>=600) && (a<1200)) {
b=b+(((a*9.167)-5000)/360)+(((a*1.67)-800)/360);
}
if((a>=1200) && (a<2700)) {
b=b+16.67+3.33;
}
if((a>=2700) && (a<3300)) {
b=b+(((a*(-10))+33000)/360)+(((a*(-2))+6600)/360);
}
if((a>=3300) && (a<4800)) {
}
}
printf("%f\n", b);
b = b + car_count_seg1 + car_count_seg2 + car_count_seg3 + fw_upstream_queue + onramp_queue;
printf("%f\n", b);
outflow_count = b*percentout;
printf("%f\n", outflow_count);
FILE *fp;
fp=fopen("1rampproblem.pddl","w+");
clear_string(buffer,LARGESTR);
sprintf(buffer,"\n(define (problem trafficjuncprob)\n(:domain traffic-junction)\n(:objects)\n(:init");
fprintf(fp,"%s",buffer);
fprintf(fp,"\n");
clear_string(buffer,LARGESTR);
sprintf(buffer,"(= (outflow-count) 0)");
fprintf(fp,"%s",buffer);
fprintf(fp,"\n");
clear_string(buffer,LARGESTR);
sprintf(buffer,"(= (critical-density) 45)");
fprintf(fp,"%s",buffer);
fprintf(fp,"\n");
clear_string(buffer,LARGESTR);
sprintf(buffer,"(= (maximum-density) 270)");
fprintf(fp,"%s",buffer);
fprintf(fp,"\n");
clear_string(buffer,LARGESTR);
sprintf(buffer,"(= (maximum-flow) 20)");
fprintf(fp,"%s",buffer);
fprintf(fp,"\n");
clear_string(buffer,LARGESTR);
sprintf(buffer,"(= (time) %d)",INITIALTIME);
fprintf(fp,"%s",buffer);
fprintf(fp,"\n");
clear_string(buffer,LARGESTR);
sprintf(buffer,"(= (zero) 0)");
fprintf(fp,"%s",buffer);
fprintf(fp,"\n");
clear_string(buffer,LARGESTR);
sprintf(buffer,"(= (toggle) 1)");
fprintf(fp,"%s",buffer);
fprintf(fp,"\n");
clear_string(buffer,LARGESTR);
sprintf(buffer,"(= (count) 0)");
fprintf(fp,"%s",buffer);
fprintf(fp,"\n");
clear_string(buffer,LARGESTR);
sprintf(buffer,"(= (ramp-flow) %d)",ramp_flow);
fprintf(fp,"%s",buffer);
fprintf(fp,"\n");
clear_string(buffer,LARGESTR);
sprintf(buffer,"(= (ramp-flow-realised) 0)");
fprintf(fp,"%s",buffer);
fprintf(fp,"\n");
clear_string(buffer,LARGESTR);
sprintf(buffer,"(= (car-count-seg1) %d)",car_count_seg1);
fprintf(fp,"%s",buffer);
fprintf(fp,"\n");
clear_string(buffer,LARGESTR);
sprintf(buffer,"(= (car-count-seg2) %d)",car_count_seg2);
fprintf(fp,"%s",buffer);
fprintf(fp,"\n");
clear_string(buffer,LARGESTR);
sprintf(buffer,"(= (car-count-seg3) %d)",car_count_seg3);
fprintf(fp,"%s",buffer);
fprintf(fp,"\n");
clear_string(buffer,LARGESTR);
sprintf(buffer,"(= (maxflow-0-1) 0)");
fprintf(fp,"%s",buffer);
fprintf(fp,"\n");
clear_string(buffer,LARGESTR);
sprintf(buffer,"(= (maxflow-1-2) 0)");
fprintf(fp,"%s",buffer);
fprintf(fp,"\n");
clear_string(buffer,LARGESTR);
sprintf(buffer,"(= (maxflow-2-3) 0)");
fprintf(fp,"%s",buffer);
fprintf(fp,"\n");
clear_string(buffer,LARGESTR);
sprintf(buffer,"(= (maxflow-3-4) 0)");
fprintf(fp,"%s",buffer);
fprintf(fp,"\n");
clear_string(buffer,LARGESTR);
sprintf(buffer,"(= (flow-0-1) 0)");
fprintf(fp,"%s",buffer);
fprintf(fp,"\n");
clear_string(buffer,LARGESTR);
sprintf(buffer,"(= (flow-1-2) 0)");
fprintf(fp,"%s",buffer);
fprintf(fp,"\n");
clear_string(buffer,LARGESTR);
sprintf(buffer,"(= (flow-2-3) 0)");
fprintf(fp,"%s",buffer);
fprintf(fp,"\n");
clear_string(buffer,LARGESTR);
sprintf(buffer,"(= (flow-3-4) 0)");
fprintf(fp,"%s",buffer);
fprintf(fp,"\n");
clear_string(buffer,LARGESTR);
sprintf(buffer,"(= (fw-upstream-queue) %d)",fw_upstream_queue);
fprintf(fp,"%s",buffer);
fprintf(fp,"\n");
clear_string(buffer,LARGESTR);
sprintf(buffer,"(= (onramp-queue) %d)",onramp_queue);
fprintf(fp,"%s",buffer);
fprintf(fp,"\n)\n\n");
clear_string(buffer,LARGESTR);
sprintf(buffer,"(:goal (> (outflow-count) %f)\n)\n", outflow_count);
fprintf(fp,"%s",buffer);
fprintf(fp,"\n");
clear_string(buffer,LARGESTR);
sprintf(buffer,"(:metric minimize (total-time))\n)");
fprintf(fp,"%s",buffer);
fprintf(fp,"\n");
fclose(fp);
return 0;
}
最佳答案
其声明中没有 b
的初始化器:
float outflow_count, percentout = 0.7, b;
因此,第一次使用之前它的值是该单词之前使用时留在堆栈中的值。每个后续值都取决于其初始值,因此没有理由期望具有任何特定值。
我建议对其进行初始化。
剩下的部分是关于如何提问的提示。您应该做的第一件事是删除程序中不需要重现错误的所有内容。由于在第一个循环后打印 b
时出现问题,因此我删除了之后的所有内容,然后删除了因此而变得未被引用的声明:
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#define LARGESTR 1000
#define INITIALTIME 40
int main(void)
{
int a;
float b;
//Total Input to system
for(a=(INITIALTIME + 10); a<(INITIALTIME + 250); a+=10) {
if((a>=10) && (a<600)) {
b=b+1.39+0.556;
}
if((a>=600) && (a<1200)) {
b=b+(((a*9.167)-5000)/360)+(((a*1.67)-800)/360);
}
if((a>=1200) && (a<2700)) {
b=b+16.67+3.33;
}
if((a>=2700) && (a<3300)) {
b=b+(((a*(-10))+33000)/360)+(((a*(-2))+6600)/360);
}
if((a>=3300) && (a<4800)) {
}
}
printf("%f\n", b);
return 0;
}
在这个精简的程序中,问题更加明显。
您的问题报告应该包含一个精简的程序,其中仅包含相关代码、b
的预期值、您预期的原因以及您实际得到的内容。
关于c - float 取意外高的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28527043/