0

更新:如果有人正在阅读这篇文章并遇到类似的问题,那么问题似乎出在我将 double 转换为 int 的地方。例如,我认为 54 存储为 54.000...,它实际上存储为 53.99999...,当更改为 int 时,它变为 53。我发现解决此问题的方法是简单地添加 0.5,因此代码是

int output_buffer=O[m][n];

变成

int output_buffer=O[m][n]+0.5;

我有一个名为“O”的二维双精度数组。在哪里

double O[3][3];

我以这个确切的顺序依次使用这两个函数;

...
displaymatrixO();
writedecrypted();
...

在哪里

int displaymatrixO() 
{   cout << "O is:" << "\n";
    for (int n=0;n<3;n++)
    for (int m=0;m<3;m++)
    {
      cout << O[m][n];
      if (m == 2) cout << "\n";
      else cout << " ";
    }

}

int writedecrypted()
{   for (int n=0;n<3;n++)
    for (int m=0;m<3;m++)
    {
        int output_buffer=O[m][n];
        fputc (output_buffer,opFile);
    }
}

在哪里

FILE *opFile;
opFile=fopen ("decrypted.txt","wb");
...

当程序运行时,第一个函数(displaymatrixO)以这种方式将矩阵 O 输出到屏幕:

O is:
49 50 51
52 53 54
3 3 3

这是正确的,这就是 O 应该是的。

然后,第二个函数应该对矩阵的各个值进行类型转换并将其写入一个文件,其中每个值占用 8 位/ 1 字节的空间。当我使用十六进制编辑器查看文件时,文件是这样的(十六进制):

0x31 0x32 0x33 0x33 0x35 0x35 0x03 0x03 0x03

在 8 位有符号整数格式中(即如何使用 displaymatrixO 显示 O),如下所示:

49 50 51 51 53 53 3 3 3 

IE

49 50 51
51 53 53
3 3 3 

它似乎将 O[2][0] 复制到 O[0][1] 和 O[1][1] 到 O[2][1]。我一遍又一遍地查看代码,我似乎无法弄清楚我哪里出错了!可以的话帮忙...

4

1 回答 1

0

看起来您将数据存储为double,并在执行此转换时四舍五入:

int output_buffer=O[m][n];

将您的原始数组声明设为int并查看问题是否消失。

编辑:这是有关该主题的更多信息。www.parashift.com

于 2012-03-13T21:13:11.333 回答