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

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

ただいまの
回答率

90.51%

  • Linux

    3768questions

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

  • C

    3684questions

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

  • Emacs

    123questions

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

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 236

edatin

score 1

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

#include <stdio.h>
#include <math.h>
#define N 4
#define M 1
#define nl 10

void lnqgj(double a[][N+M], int n, int m, double epsl, int *isw)
{
  int j;
  int i;
  int k;
  int ip;

  double p;
  double w;
  double a_kk;
  double a_ik;

  for(k = 0 ; k < n ; k++){
    p = 0.0;

    for(i = k;i < n; i++){
      if(p < fabs(a[i][k])){
        p = fabs(a[i][k]);
        ip = i;
      }
    }

    if(p <= epsl){
      *isw = 1;
      printf("\n\t isw = %d\n", *isw);
      return ;
    }

    for(j = k;j < (n + m) ; j++){
      w = a[k][j];
      a[k][j] = a[ip][j];
      a[ip][j] = w;
    }

    a_kk = a[k][k];
    for(j = k;j < (n + m); j++){
      a[k][j] /= a_kk;
    }  

    for (i = 0; i < n ; i++){
      if(i != k){
        a_ik = a[i][k];
        for(j = k; j<(n + m);j++)
          a[i][j] -= (a_ik * a[k][j]);
      }
    }
  }  

  *isw = 0;
  return ;
  }

main(){
  int a;
  int b;
  int s = N;
  int t = M;
  int *isw;
  double min = 1.0e-5;
  double z[s][s+t];
  FILE  *fpin;
  FILE  *fpout;

  if((fpin = fopen("kadai17.dat", "r"))==0){
     fprintf(stderr, "\n\tSorry! I can't open kadai17.dat\n");
     return 0;
  } 
    if((fpout = fopen("kadai17ans.dat", "w"))==0){
     fprintf(stderr, "\n\tSorry! I can't open kadai17ans.dat\n");
     return 0;
  } 

  for( a = 0; a < 4 ;a++){
    printf("\n%d\n",a);
    for( b = 0; b < 5 ;b++){
      fscanf(fpin,"%lf",&(z[a][b]));
      printf("%lf\t",z[a][b]);
      }
    }

  lnqgj(z,s,t,min,isw);

  fprintf(fpout,"isw = %d\n",*isw);
  for( a = 0; a < 4;a++){
    printf("\n\t%lf\n",z[a][4]);
    fprintf(fpout, "\tX%d =%lf\n",a+1 , z[a][4]);
    }

  fclose (fpin);
  fclose (fpout);
  return 0;
}

 試したこと

読み込んでいるファイルの中身はこちらです
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
セグメンテーション違反です

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Orlofsky

    2018/06/22 17:21

    コードは https://teratail.com/help#about-markdown の[コードを入力]を使ってください。

    キャンセル

  • LouiS0616

    2018/06/22 17:22

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

    キャンセル

  • tkturbo

    2018/06/22 17:24

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

    キャンセル

  • tkturbo

    2018/06/22 17:29

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

    キャンセル

回答 3

checkベストアンサー

+1

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

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


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

int main()
{
    int a;
    (途中省略)
    FILE  *fpout;
    int foo;       // 変数を追加し

    isw = &foo;    // そこをポイントするよう isw を初期化しておき
    (途中省略)
    lnqgj(z,s,t,min,isw);  // iswをlnqgj()関数に渡す
    (以下省略)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/23 13:19

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

    キャンセル

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 17:36

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

    キャンセル

  • 2018/06/22 17:36 編集

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

    キャンセル

  • 2018/06/22 17:38

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

    キャンセル

  • 2018/06/22 17:52

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

    キャンセル

  • 2018/06/22 21:25

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

    キャンセル

  • 2018/06/22 22:26

    回答を追記

    キャンセル

0

こんにちは。

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/22 21:25

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

    キャンセル

  • 2018/06/22 21:58

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

    キャンセル

  • 2018/06/25 13:11

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

    キャンセル

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

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Linux

    3768questions

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

  • C

    3684questions

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

  • Emacs

    123questions

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