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

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

新規登録して質問してみよう
ただいま回答率
85.47%
ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

Q&A

解決済

1回答

3577閲覧

c言語 ポインタ ベクトルと行列

kun_monimoni

総合スコア26

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

0グッド

0クリップ

投稿2020/08/26 08:00

秋学期の授業のために、夏休み中に自主勉強としてやっているものです。

キーボードから次元 N を入力した後,N × N 行列 A と N 次元ベクトル x のデータを要素 ごとにキーボードから入力し,Ax を計算するプログラムを完成させよ.

上記のような問題で、下記のようにソースコードを書いたのですが、エラーが発生してしまいます。
わかる方いらっしゃいましたらご指摘していただけるとありがたいです。ポインタは秋学期の授業で勉強する内容ということもあり、これ以上はエラーの原因がわかりませんでした、、、。どうぞよろしくお願いいたします。

#include <stdio.h> #include <stdlib.h> void PrintVector(double *y, int n){/*ベクトルを表示する関数*/ int i; for(i=0;i<n;i++){ printf("%6.1f\n",*(y+i)); } printf("\n"); } void PrintMatrix(double *x, int n){/*行列を表示する関数*/ int i,j; double *ai; ai= x; for( i = 0 ; i < n ; i++){ for( j = 0 ; j < n ; j++){ printf("%6.1f", *(ai+j)); } ai+=n; printf("\n"); } printf("\n"); } int main(void) { int i, j, N; double *ai; /* 各行の先頭へのポインタを表すポインタを用意する*/ printf("N= "); scanf("%d",&N); double *A, *x, *y; /*計算結果を代入するための行列を用意 */ /*行列・ベクトルのメモリ確保*/ x= (double *) malloc(N*sizeof(double)); if(x==NULL){ printf("Can’t allocate memory. Y=n"); exit(1); } /*行列・ベクトルの入力*/ ai = A; for(i = 0 ; i < N ; i++ ){ for( j = 0 ; j < N ; j++ ){ printf("A[%d][%d] = ", i , j ); scanf("%lf", ai+j ); } ai+=N; } printf("\n"); for(i = 0 ; i < N ; i++ ){ printf("x[%d] = ", i ); scanf("%lf", x+i); } printf("\n"); printf("A = \n"); PrintMatrix(A,N); printf("x = \n"); PrintVector(x,N); /* y = Ax の計算 */ ai = A; for (i = 0; i < N; i++) { *(y+i) = 0; /* 初期化 */ for (j = 0; j < N; j++) { *(y+i) += *(ai+j) * *(x+j); } ai+=N; } printf("y = \n"); /* ベクトル y(=Ax) の表示 */ PrintVector(y,N); /*メモリの解放*/ free(x); return 0; }

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

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

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

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

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

maisumakun

2020/08/26 08:01

どのようなエラーが発生したのですか? (できる限り、エラーメッセージを「そのまま」ご提示ください)
kun_monimoni

2020/08/26 08:34

Thread 1: EXC_BAD_ACCESS (code=1, address=0x0) という表示が出て止まってしまいます。 よろしくお願いします。
guest

回答1

0

ベストアンサー

c

1 /*行列・ベクトルの入力*/ 2 ai = A; 3 for(i = 0 ; i < N ; i++ ){ 4 for( j = 0 ; j < N ; j++ ){ 5 printf("A[%d][%d] = ", i , j ); 6 scanf("%lf", ai+j ); 7 } 8 ai+=N; 9 } 10 printf("\n");

この処理に入る前にxの領域は確保していますが、Aの領域を確保していないからですね。

投稿2020/08/26 08:07

KoichiSugiyama

総合スコア3041

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

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

kun_monimoni

2020/08/26 08:36

回答していただきありがとうございます。助かります。 xの領域を確保するのと同様にしてA、yの領域も確保すればよろしいのでしょうか? よろしくお願いいたします。
coco_bauer

2020/08/26 09:01

malloc関数を使ってメモリの領域を確保するのは同じです。 xはN 次元ベクトルなのでN個のdoubleが入るのに足る領域を確保すれば良いですが、AはN × N 行列 なので、N*N個のdoubleが入るのに足る領域の確保が必要です。
kun_monimoni

2020/08/26 09:08

例えば、Aの場合ですと以下のようにすれば合っていますでしょうか? また、yに対しても同様にして領域の確保は必要ですよね....? A= (double *) malloc((N*N)*sizeof(double)); if(x==NULL){ printf("Can’t allocate memory. Y=n"); exit(1); }
KoichiSugiyama

2020/08/27 06:17

そうです(エラー処理がコピペミスでxをチェックしていますが)。配列をポインタとして受けるaiと違って必要な領域(double型のN*N個)の実体がないと、不正アクセスとしてエラーになります。Yも同様に実体が必要です。
kun_monimoni

2020/08/28 13:58

ご丁寧にありがとうございます。 無事実行に成功しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問