質問: ```
回答: ``` for (k = 0; k < N - 1; k++) { for (i = k + 1; i < N; i++) { d = a[i][k] / a[k][k]; for (j = k + 1; j <= N; j++) a[i][j] -= a[k][j] * d; //a[i][j] = a[i][j]-a[k][j] * d printf("a=%lf\nである", a);//付け加えた部分~~ // ^ (1) printf("%d=a[%d][%d] /a[%d][%d]\n ", a,i,k,k,k); // ^^ ^ (2) printf("[k]=%d\n", k); printf("a[%d][%d]=a[%d][%d]-a[%d][%d]*%lf\n", i, j, i, j, k, j, d);//~~ここまで付け加えました。 } } ``` こちらですが、上でコメントした 2 個所に問題があります。 (1) a は二次元配列なので printf() では表示できない。 前の回答者さんが指摘されている通りです。 ここ、本当は `a` を全部表示したいのではなく `a[i][j]` を表示したいのではありませんか。 (2) a は二次元配列なので printf() では表示できない。 ここ、本当は `a` ではなく `d` を表示したいのではありませんか。ちなみに `d` は double なのですが、 `%d` でよいですか。 クラス内の宣言で `d` がダミーとコメントされているのが気になりますが、 `d` は重要な役割を果たしているはず...。 まずはエラーや警告を読んでみるところから 前の回答者さんもおっしゃっていますが、警告は読まれましたか。たとえばこれ。 ``` 書式文字列 '%lf' には、型 'double' の引数が必要ですが、可変個引数 1 は型 'double (*)[5]' です ``` とても親切な警告文だと思います。これを見ると `%lf` に対して二次元配列を渡していることが一目で分かります。たとえ `double (*)[5]` が初めなんのことやら分からなかったとしても、 **指摘されている行数を見る** と `%lf` で表示されるべき場所に `a` を渡していることが分かりますよね。では `a` はなんだったかと考えると、二次元配列です。 そこで自分が本当は何をやりたかったのかもう一度考えてください。二次元配列の中身を全て表示したかったのなら、 for ループを書くことになるでしょう。特定の一つの要素を表示したくて添字を付け忘れているのなら、添字を追加してください。 エラーや警告は初心者のうちは「どうせ読んでも分からない」と考えがちなのかもしれません。確かに、 (特に C++ は) コンパイラが複雑怪奇なエラーを出すこともあります。でも、どれだけ分からないエラーが出ても、必ずそこには **エラーや警告が起きた行数が書かれています** から、一度は自分の書いたコードのその行を見直してください。エラーが **言っていることが分からなくても、間違いを直す方法は分かる** 、ということは多々あります。 どうかエラーや警告を読むことを諦めないでくださいね。 **どんなに難解でも、少なくとも指摘された行は見直す** 、です。 ちなみに、それでもどうしても直し方が分からない場合は質問して大丈夫ですよ。そういうときのための teratail ですからね。自分がエラーや警告を読んで考えたことも質問に盛り込めば、回答者さんも「ちゃんと考えてから聞いているんだな」という印象になって、気持ち良く回答してくださると思いますよ。 (補足) エラーや警告は、前のエラーにひきずられてどばーーーーーっと出ることがあります。大量のエラーが出ても一歩も引かないでくださいね。まずは一番最初のエラーを見てみましょう。たいてい最初のエラーは本物なので、そのエラーを直して再度コンパイルするとがばっとエラーが消えたりします。 あまり大規模なものだと毎回再コンパイルするわけにはいかないかもしれませんが、練習程度の小さい規模のものなら、一番最初のエラーをつぶしたらとりあえず再コンパイルしてみるとよいでしょう。 直すとエラーが増えるパターンというのもありますが、同じところに同じエラーが出ていないなら、それは確実に一歩進んでいます。諦めないで、また一番最初のエラーから読んでいきましょう。 応援していますので、少しずつやってみてくださいね。