2012-03-13 12 views
0

更新:誰かがこれを読んでいて、同様の問題がある場合は、doubleをintに変換した場所が問題だったようです。例54が54.000として保存されていると思ったところでは、実際には53.99999として保存されました...そしてintに変更すると53になりました。 この問題の回避策は0.5を追加することですファイルの配列にファイルを書くことができません(C++)

int output_buffer=O[m][n]; 

たコードは、私が "O" と呼ばれるダブルスの二次元アレイを有する

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

なります。

double O[3][3]; 

この2つの機能をこの順番で使用します。

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

場合

そして

プログラムが実行される
FILE *opFile; 
opFile=fopen ("decrypted.txt","wb"); 
... 

は、最初の関数(displaymatrixOが)の画面にマトリックスOを出力

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); 
    } 
} 

このファッション:

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

これは正しいものです。これはOが想定しているものです。

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

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

(すなわちOがdisplaymatrixOを使用して表示されているか)、これは、以下のようにそれが見えるもの:Oをコピーしているようだ

49 50 51 51 53 53 3 3 3 

49 50 51 
51 53 53 
3 3 3 

すなわちO上に[1] [1] O [1]と[0] O上に[0] [2] [ 2] [1]。私はコードを何度も見てきたので、どこが間違っているのか分からないようです。できれば...助けて

+0

初期化を試すことができます int output_buffer = O [m] [n]; int output_buffer = 0を先に使用しますか?あなたのコードで、メモリが再利用されている場所であると私が見る唯一の場所です。 –

+1

ようこそStackOverflowへ!あなたが投稿したコードには何も問題はありません([this program](http://ideone.com/6IwdF)が示しているように)。問題は**あなたが**投稿していないコードにある必要があります。あなたが見ているエラーを示す最短** complete **プログラムを投稿してください。 (このデバッグ手法の詳細については、http://sscce.org/を参照してください)。 –

+0

そして、将来の参照のために:Robは「テストケース」と呼ばれるものを説明しました。 – Griwes

答えて

0

あなたがダブルようにデータを格納し、切り捨てされているようにあなたは、このキャスト行うときに見えます:

int output_buffer=O[m][n]; 

を元の配列の宣言int型を作成し、参照問題が解消された場合

EDIT:ここに、この件に関するさらに詳しい情報があります。www.parashift.com

+0

実際、そういうことがたくさんの作品を作りました。私は整数が最大256で格納できることを認識するまでintを使用していました。情報を使って計算すると、256を超える出力ができ、そのように配列が倍になる必要があります。 しかし、私は最終的な出力が<256であることを知っているから(行列値あたり8ビットのデータを単純に暗号化して解読する必要があります)、どこでも切り捨てられないことがわかります。 – midnightBlue

+0

"double"データが完全に整数(数学的な意味で)で構成されていて、それらを "int"型に変換した場合、データが何らかの影響を受けると言っていますか? – midnightBlue

+0

これは、問題の根がどこにあるかと思われます。私は54が54.000として保存されていると思ったところで、実際には53.999として保存されました...そして、intに変更すると、53になりました。ありがとう – midnightBlue

関連する問題