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

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

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

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

Emacs

GNU Emacsと拡張性の高い、高性能なテキストエディタです。豊富なライブラリの導入により、統合開発環境やWebブラウザとしても機能させる事が可能です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

3回答

4540閲覧

セグメンテーションエラーが消えません

edatin

総合スコア9

C

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

Emacs

GNU Emacsと拡張性の高い、高性能なテキストエディタです。豊富なライブラリの導入により、統合開発環境やWebブラウザとしても機能させる事が可能です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2018/06/22 08:19

編集2018/06/22 12:21

C言語でファイルから行列の値を読み込むときにセグメンテーションエラーが発生しました。

C言語

1#include <stdio.h> 2#include <math.h> 3#define N 4 4#define M 1 5#define nl 10 6 7void lnqgj(double a[][N+M], int n, int m, double epsl, int *isw) 8{ 9 int j; 10 int i; 11 int k; 12 int ip; 13 14 double p; 15 double w; 16 double a_kk; 17 double a_ik; 18 19 for(k = 0 ; k < n ; k++){ 20 p = 0.0; 21 22 for(i = k;i < n; i++){ 23 if(p < fabs(a[i][k])){ 24 p = fabs(a[i][k]); 25 ip = i; 26 } 27 } 28 29 if(p <= epsl){ 30 *isw = 1; 31 printf("\n\t isw = %d\n", *isw); 32 return ; 33 } 34 35 for(j = k;j < (n + m) ; j++){ 36 w = a[k][j]; 37 a[k][j] = a[ip][j]; 38 a[ip][j] = w; 39 } 40 41 a_kk = a[k][k]; 42 for(j = k;j < (n + m); j++){ 43 a[k][j] /= a_kk; 44 } 45 46 for (i = 0; i < n ; i++){ 47 if(i != k){ 48 a_ik = a[i][k]; 49 for(j = k; j<(n + m);j++) 50 a[i][j] -= (a_ik * a[k][j]); 51 } 52 } 53 } 54 55 *isw = 0; 56 return ; 57 } 58 59main(){ 60 int a; 61 int b; 62 int s = N; 63 int t = M; 64 int *isw; 65 double min = 1.0e-5; 66 double z[s][s+t]; 67 FILE *fpin; 68 FILE *fpout; 69 70 if((fpin = fopen("kadai17.dat", "r"))==0){ 71 fprintf(stderr, "\n\tSorry! I can't open kadai17.dat\n"); 72 return 0; 73 } 74 if((fpout = fopen("kadai17ans.dat", "w"))==0){ 75 fprintf(stderr, "\n\tSorry! I can't open kadai17ans.dat\n"); 76 return 0; 77 } 78 79 for( a = 0; a < 4 ;a++){ 80 printf("\n%d\n",a); 81 for( b = 0; b < 5 ;b++){ 82 fscanf(fpin,"%lf",&(z[a][b])); 83 printf("%lf\t",z[a][b]); 84 } 85 } 86 87 lnqgj(z,s,t,min,isw); 88 89 fprintf(fpout,"isw = %d\n",*isw); 90 for( a = 0; a < 4;a++){ 91 printf("\n\t%lf\n",z[a][4]); 92 fprintf(fpout, "\tX%d =%lf\n",a+1 , z[a][4]); 93 } 94 95 fclose (fpin); 96 fclose (fpout); 97 return 0; 98} 99 100

試したこと

読み込んでいるファイルの中身はこちらです
3 2 7 1 8
1 5 1 -1 5
4 1 3 -2 7
1 6 4 3 13

printfで読み込まれたデータを表示するのですが、a<4とすると4行目の値が表示されず上のprintfで表示している行数のみが表示されます

0
3.000000 2.000000 7.000000 1.000000 8.000000
1
1.000000 5.000000 1.000000 -1.000000 5.000000
2
4.000000 1.000000 3.000000 -2.000000 7.000000
3
セグメンテーション違反です

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

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

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

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

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

LouiS0616

2018/06/22 08:22

配列zはどのように宣言していますか?
tkturbo

2018/06/22 08:24

配列zが3行しかないのでは?
tkturbo

2018/06/22 08:29

z[3][0]に値がセットされていないのでは。
guest

回答3

0

ベストアンサー

未初期化ポインタ isw による違法メモリアクセスです。
私の手元では次の箇所で落ちました。

C

1void lnqgj(double a[][N+M], int n, int m, double epsl, int *isw) 2{ 3 (省略) 4 *isw = 0; // ここでSegmentation fault 5 return; 6}

main()関数が、ポインタ変数 isw を初期化しないままlnqgj()関数に渡した、という単純なバグですから、例えば次のようにすれば動きます。

C

1int main() 2{ 3 int a; 4 (途中省略) 5 FILE *fpout; 6 int foo; // 変数を追加し 7 8 isw = &foo; // そこをポイントするよう isw を初期化しておき 9 (途中省略) 10 lnqgj(z,s,t,min,isw); // iswをlnqgj()関数に渡す 11 (以下省略)

投稿2018/06/22 14:18

rubato6809

総合スコア1380

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

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

edatin

2018/06/23 04:19

ありがとうございました。解決しました。一番具体的でわかりやすかったのでベストアンサーにしました。
guest

0

こんにちは。

ご提示のプログラム部分ではセグメンテーション違反は起きないようです。
それより後のどこかで起きているかも知れません。

printf()の出力はキャッシュされるため、まだキャッシュに溜まっていて画面にでていない可能性があります。printf()は正常に実行され、その後で落ちた場合にいかにも表示された部分までしか実行されていないかのように見え、判断を誤るというミスは割と多いです。

投稿2018/06/22 08:55

Chironian

総合スコア23272

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

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

edatin

2018/06/22 12:25

ご回答ありがとうございます。全体のプログラムを追加したのですが、どこで落ちる可能性があるか教えていただくことはできますでしょうか?
Chironian

2018/06/22 12:58

iswポインタを初期化していないので、あらぬところを指しています。 そこをアクセスしているところで落ちている可能性が高いです。
edatin

2018/06/25 04:11

回答ありがとうございます。返事が遅くなって申し訳ないです。無事解決しました。
guest

0

fscanf(fpin,"%lf",&z[a][b]); printf("%lf\t",z[a][b]);

双方、%lf ではなくて、%f です


とりあえず、

void lnqgj(double a[N][N+M], int n, int m, double epsl, int *isw)

と修正すれば実行できるようになるんじゃないかな

投稿2018/06/22 08:32

編集2018/06/22 13:22
y_waiwai

総合スコア87747

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

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

edatin

2018/06/22 08:36

回答ありがとうございます。実行して見たところ、値がすべて0になり同じ箇所でセグメンテーションエラーが発生してしまいました。
LouiS0616

2018/06/22 08:37 編集

出力はともかく、入力はlfで問題ないように思いますが... printfにlfを指定するのもC99以降では認められているはずです。
y_waiwai

2018/06/22 08:38

fscanf(fpin,"%f",&(z[a][b])); としましょう
y_waiwai

2018/06/22 08:52

この関数全体を提示してもらわないと解決できないですね。。
edatin

2018/06/22 12:25

いま、全体を修正したのですが、どうでしょうか。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問