0

更新:誰かがこれを読んで同様の問題を抱えている場合、問題は double を int に変換した場所にあったようです。たとえば、54 は 54.000... として格納されていると思っていたところ、実際には 53.99999... として格納されていました。int に変更すると、53 になりました。だったコード

int output_buffer=O[m][n];

になる

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

「O」と呼ばれる double の 2 次元配列があります。どこ

double O[3][3];

この 2 つの関数をこの正確な順序で続けて使用します。

...
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 の本来の姿です。

2 番目の関数は、行列の個々の値を型キャストして、各値が 8 ビット/1 バイトのスペースを占めるファイルに書き込むことになっています。16 進エディタを使用してファイルを見ると、ファイルは次のようになります (16 進数で):

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

8 ビットの符号付き整数形式 (つまり、displaymatrixO を使用して O を表示する方法) では、次のようになります。

49 50 51 51 53 53 3 3 3 

すなわち

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 に答える