質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

239閲覧

行列の二乗、結果が表示されない

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2018/07/02 12:20

C

1#include <stdio.h> 2#include <stdlib.h> 3void print_matrix2(int n, float **mat); 4void square_matrix2(int n, float **mat_in, float **mat_out); 5void malloc2(int n,float **m); 6 7int main(void) { 8 int i,j,n; 9 float **l,**m; 10 11 printf("Input a positive number.\n"); 12 scanf("%d",&n); 13 14 malloc2(n,m); 15 malloc2(n,l); 16 17 for(i=0;i<n;i++){ 18 for(j=0;j<n;j++){ 19 m[i][j] = i*n + j;//配列mの初期化 20 } 21 } 22 printf("M="); 23 print_matrix2(n, m); 24 square_matrix2(n,m,l); 25 printf("M^2="); 26 print_matrix2(n,l); 27 28 return 0; 29} 30 31/*正方行列を表示*/ 32void print_matrix2(int n, float **mat){ 33 int i,j; 34 for(j=0;j<n;j++){ 35 for (i=0; i<n;i++){ 36 printf("%lf",mat[i][j]); 37 }printf("\n"); 38 } 39} 40/*行列の二乗を計算*/ 41void square_matrix2(int n, float **mat_in, float **mat_out){ 42 int i,j,k; 43 float a; 44 for (i=0; i<n;i++) { 45 for (j=0; j<n; j++){ 46 a = 0; 47 for (k=0; k<n; k++) { 48 a=a+mat_in[i][j]+mat_in[j][i]; 49 } 50 mat_out[i][j]=a; 51 } 52 } 53} 54/*n*n配列用メモリの動的確保*/ 55void malloc2(int n,float **m){ 56 int i; 57 m=(float **)malloc(sizeof(float *)*n); 58 for(i=0;i<n;i++){ 59 *(m+i)=(float *)malloc(sizeof(float)*n); 60 } 61} 62

課題で行列の二乗を計算(行列はプログラム内で定義)するプログラムを書いたのですが、行列サイズnを入力した後、結果が出力されません。
また、入出力用の配列は動的にメモリを確保せよという条件つきです。(malloc2で行っているつもり)。eclipseで実行したところ
Variable 'l(m)' is uninitialized... といった警告が出ていますが、lやmにはあとから値を入れ、自信を再代入しているわけでもないので
これもよくわかりません。
行列の表示や計算の関数(print_matrix2,square_matrix2)は問題ないと思っています。
とりあえず、正しい結果が出力されるようにしたいです。どうかご教授お願いいたします。
とりあえずは、

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ポインタを配列内で書き換える場合は、そのポインタを渡さねばなりません。

C

1int main(void) { 2 ... 3 4 float **l, **m; 5 6 ... 7 malloc2(n, &m); 8 malloc2(n, &l); 9 10 ... 11} 12 13void malloc2(int n, float ***m) { 14 *m = (float **)malloc(sizeof(float *)*n); 15 16 for(int i = 0; i < n; i++) { 17 (*m)[i] = (float *)malloc(sizeof(float)*n); 18 } 19}

ここを修正することで、少なくともエラー・警告を出さずに実行できました。

投稿2018/07/02 12:29

LouiS0616

総合スコア35658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/07/02 12:45

ありがとうございました。行列の二乗の計算にも間違いがあったのに気づきそれは自分で修正し、正しい結果が出力できるようになりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問