• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:fprintfでの文字化け)

C言語でのfprintfでの文字化けの原因とは?

このQ&Aのポイント
  • C言語で作成したプログラムの最後の部分でファイルに出力すると、数字が文字化けして表示される問題が発生します。
  • この問題の原因を教えていただければ嬉しいです。また、プログラムに関する他の問題や疑問点も教えてください。
  • 私はプログラミングに詳しくないため、解決策が見つからないかもしれません。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

よくみたら。 > int**X = calloc(sizeof(int),sizeof(int)*1000); > int**Y = calloc(sizeof(int),sizeof(int)*1000); > X[i] = (int*)calloc(sizeof(int),sizeof(int)*1000); > Y[i] = (int*)calloc(sizeof(int),sizeof(int)*1000); callocのマニュアルは読んでますか? calloc( 確保したい要素数, 1要素あたりのサイズ ) ; です。 これだと、 1要素sizeof(int)*1000 x sizeof(int)個 だけの領域を確保します。 > int**X = calloc(sizeof(int),sizeof(int)*1000); の方では int * を 1000個 > X[i] = (int*)calloc(sizeof(int),sizeof(int)*1000); の方では int を1000個 確保したいんですよね? マニュアルに従えば int**X = calloc(1000,sizeof(int *)); X[i] = calloc(1000,sizeof(int)); で必要数だけ確保できます。 多く確保することができたのなら、メモリーリーク等の致命的なエラーになるケースは少ないです。 ですが、メモリ自体が少なければ、そもそもの確保に失敗する場合があります。 適切に確保するのと、エラーチェックすることを心掛けましょう。 for(i=0; i<=999; ++i){ /* 各列分の領域を割り当てる */ X[i] = calloc(1000,sizeof(int)); if ( X[i] == NULL ) { exit( EXIT_FAILURE ); } } ただ、これと文字化けとは直接関係無いと思います。 %dで変換して出力しているので、引数がどんな値でも0123456789-以外の文字は出力していないはずです > 配列X,Yの要素数を大きく取りたいので配列のためにメモリを確保しようとしてます 外の配列X,Yと、mainの中のX,Yは別です。 int** Xとすることで、main関数の中だけで有効なローカル変数として宣言されています。 また、callocで確保される領域とも関係ないです。 よって、このプログラムではまったく意味を為していません。 >外の定義は初め抜いていたのですがエラーになるのでやむなく付け足しました エラーになるのは > int a,i,j,k,t; > double p,p1,b; > int s0,s1,delta; ここまで削っているからではないですか? これらの変数がここでしか宣言されていないからではないでしょうか

ab4ufps
質問者

お礼

>外の配列X,Yと、mainの中のX,Yは別 なるほど その当たり良く分っていませんでした callocの所はネットで調べたものを放り込んでいます^^; 分かって使わないといけませんね・・・ 文字化けについては皆さんのところだと問題ないようでひとまず安心です 一旦締め切りますがまた質問があった時は皆様解答よろしくお願いします 訂正;メモリは4GBです

その他の回答 (3)

回答No.3

これが何をやっているプログラムなのか、私にはわかりませんが、 『とにかく大きなメモリを確保する』という方法は、気付かぬバグを内包する元です。 mainの外で、X,Yにそれぞれ約1M*intのサイズ(私の環境では2MByte)程の領域を確保しています(int X[999][1000])が、mainの中で、int1000個分のサイズのメモリをintサイズ分(私の環境では4MByte)確保(int **X=calloc~)しています。さらに、『int1000個分のメモリをintサイズ分』を1000個確保(/*各配列の領域を*/の部分)しそのポインタをXに並べています。(私の環境では、4M) それでいて、XとYは、直接intの配列として使われています。X,Yは、2×1000の配列として使っているようですが、一部疑問があります。メモリをふんだんに確保しているので、エラーにはなっていませんが、  s0=s0+pow(-1,X[t][k]+X[t][k+1]);//(11),(00)なら値1  s1=s1+pow(-1,Y[t][k]+Y[t][k+1]);//(10),(01)なら値-1 の「k+1」の部分は、意図したとおりですか?X[t][1000]をアクセスしてしまいますが、大丈夫ですか? また、  X[t+1][j] = X[t][j]; の部分も、「X[2][j]」をアクセスしてしまいますが、大丈夫ですか? 文字化けに関しては、ウチでも一応表示していますので、(「0」か「1」の羅列ですよね?)環境を提示するといいと思います。 たぶん、先に書いたメモリ確保、X,Yの定義などの問題では?

ab4ufps
質問者

お礼

モンテカルロ法で1次元イジングモデルを熱浴法を用いて解こうとしてこんなのが出来ました(手元には疑似コードが載った資料があるくらいです) 定義が二重になっていてメモリを食っているのは理解できました。またfor文内のアクセスについては間違ってますね。ご指摘ありがとうございます。 monte.datには0と1の羅列が出ればひとまず成功です 自分の環境としては Win7,RAM=4M, コンパイラ:Borland C++ Compiler 5.5 プログラム作成に"C言語を始めよう!"というソフトを用いています

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

少なくとも、手許で実験するかぎりでは文字化けはしませんが。 本当に monte.txt の中が文字化けしているのですか? > printf("交換したよ! %d → %d\n",X[t][a],X[t+1][a]); > printf("交換しないよ!\n"); 画面に表示されるこっちじゃないですか?

ab4ufps
質問者

お礼

あら、本当ですか 自分のところでは何度やってもmonte.dat内が ‰‱‰‰‱‱‰‰‰‱‰‱‰‱‱‱‰(略 となります 画面の方はちゃんと動作してます

  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.1

>int**X = calloc(sizeof(int),sizeof(int)*1000); >int**Y = calloc(sizeof(int),sizeof(int)*1000); >for(i=0; i<=999; ++i){ /* 各列分の領域を割り当てる */ >X[i] = (int*)calloc(sizeof(int),sizeof(int)*1000); >} >for(i=0; i<=999; ++i){ /* 各列分の領域を割り当てる */ >Y[i] = (int*)calloc(sizeof(int),sizeof(int)*1000); >} 上記の行は、何のためにあるのでしょうか? 関数の外で定義してある >int X[999][1000],Y[999][1000]; との整合性はどうなっていますか?

ab4ufps
質問者

お礼

書くところを間違った・・・ すみません 解答ありがとうございます

ab4ufps
質問者

補足

配列X,Yの要素数を大きく取りたいので配列のためにメモリを確保しようとしてます 外の定義は初め抜いていたのですがエラーになるのでやむなく付け足しました

関連するQ&A