文件IO和字符串C中的意外值
我用C语言编写了这个程序来打印另一个程序的长case语句的一部分。但它正在打印意外值,我无法调试它。请帮忙 节目:文件IO和字符串C中的意外值,c,string,pointers,file-io,buffer,C,String,Pointers,File Io,Buffer,我用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; flo
#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)
并不意味着你可能期望它意味着什么。除法是整数,因为3500和11都是整数。强制转换只是将最终生成的整数转换为长双精度,它不会使除法成为浮点
为此,您需要例如fin=长双3500/11
另外,也就是说,和往常一样,比较浮点数是否与==完全相等是一个非常糟糕的主意。设置距离期望值的阈值要好得多。我看到一堆指针,而不是单个分配或有效分配的地址。再加上对只读字符串文字的写入,您将发现对未定义行为的调用非常深入。谢谢。你能指出一些无效的行吗。为什么adata会有一个垃圾值,为什么下次会追加ddata?如果我注释从for循环的第一个语句到ddata赋值的代码,adata很好,但我需要将其截断为5位二进制,这是我无法做到的。ddata=strcatdbit,buffer1;,adata=strcatabit,buffer2;:由于1 dbit和abit是字符串文字,因此无法连接此类。2没有足够的空间存储合并结果。@BLUEPIXY感谢您解释错误的作业。你的建议奏效了!!我已经宣布fin为长双人。在该语句中,我想检查计算为fout/N的fin值是否等于3500/11。如何将结果保留为小数点后有许多有效数字的浮点值?@user3776279我的观点是鳍的类型无关紧要,就像我上面所说的。演员也不会,因为括号遗漏了它想要影响的表达。