gpt4 book ai didi

c - C 中的文件 IO 和字符串意外值

转载 作者:行者123 更新时间:2023-11-30 20:39:53 25 4
gpt4 key购买 nike

我用 C 编写了这个程序来打印另一个程序的长 case 语句的一部分。但它正在打印意外的值,我无法调试它。请帮忙。

程序:

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
void main()
{
FILE *fp;
int i=0, N=32, att=0, attbuf=0;
float fout=6000.0;
unsigned long ftw;
long double fin;
char *ddata;
char *dbit="32'b";
char *pdata;
char *adata;
char *abit="5'b";
char *buffer1;
char *buffer2;
fp = fopen("test1.txt", "w");
if (fp == NULL)
{
puts("Cannot open target file");
exit(0);
}
for(i=0;i<=1;i++)
{
fin = fout / N;
if((fin== (long double)(3500/11)) || (fin==(3500/10)) || (fin==(long double)(3500/9)) || (fin==(double)(3500/8)) || (fin==(3500/7)))
{
N = 36;
fin = fout / N;
}
ftw = (long)((pow(2,32)*(fin/3500))+0.5);
itoa(ftw, buffer1, 2);
ddata = strcat(dbit, buffer1);

if(N == 32)
{
pdata = "8'b10000000";
}
else if (N == 36)
{
pdata = "8'b10000010";
}
puts(pdata);

if((fout >= 6000) && (fout <= 10000))
{
att = 0;
}
attbuf = ~att;
itoa(attbuf, buffer2, 2);
adata = strcat(abit, buffer2);

fputs("\t\t\t\t\t", fp);
fprintf(fp, "%d\t:\tbegin\n",i);
fprintf(fp, "\t\t\t\t\t\t\t\to_data [31:0] <= %s;\n", ddata);
fprintf(fp, "\t\t\t\t\t\t\t\to_pdata [7:0] <= %s;\n", pdata);
fprintf(fp, "\t\t\t\t\t\t\t\to_adata [4:0] <= %s;\n", adata);
}
fclose(fp);

}

我得到的输出是这样的:

0   :   begin
o_data [31:0] <= 32'b11011011011011101111111111111111;
o_pdata [7:0] <= 8'b10000000;
o_adata [4:0] <= 1011011011011101111111111111111;
1 : begin
o_data [31:0] <= 32'b1101101101101110111111111111111111011011011011101111111111111111;
o_pdata [7:0] <= 8'b10000000;
o_adata [4:0] <= 101101101101110111111111111111111011011011011101111111111111111;

我想要的输出如下:

0   :   begin
o_data [31:0] <= 32'b11011011011011101111111111111111;
o_pdata [7:0] <= 8'b10000000;
o_adata [4:0] <= 5'b11111;
1 : begin
o_data [31:0] <= 32'b11011011011011101111111111111111;
o_pdata [7:0] <= 8'b10000000;
o_adata [4:0] <= 5'b11111;

为什么会发生这种情况?

最佳答案

代码如下:

fin == (long double)(3500/11)

并不意味着你可能期望它的意思。除法以整数形式发生,因为 350011 都是整数。转换只是将最终结果整数转换为long double,它不会使除法成为浮点型。

为此,您需要例如fin =(长 double )3500/11

此外,与往常一样,将 float 与 == 进行比较以确保其完全相等是一个非常糟糕的主意。设定与所需值的距离阈值要好得多

关于c - C 中的文件 IO 和字符串意外值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25502191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com