- ベストアンサー
Segmentation faultとは?Ubuntu10.04で発生したSegmentation faultの解決方法について教えてください
- 生物系の大学院生がUbuntu10.04にc言語で書かれたソフト(adaptsite-d)をインストールしようとした際に、Segmentation faultというエラーが表示される問題が発生しました。
- 問題の解決策として、READMEの内容に従いMakefileを作成し、ターミナルでmakeコマンドを実行しましたが、依然としてSegmentation faultのエラーが表示されます。
- エラーメッセージの内容を読みながら修正を試みましたが、初期化すべき関数の場所や方法がわからず困っています。解決策を教えていただけないでしょうか。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>adaptsite-d.2.cの文中のbrlen1とbrlen2、adaptsite-d.2.cの文中のaabという関数?を初期化すればいいというメッセージだと思う ちょっと違ってます。 main関数で、brlen1とbrlen2という変数を初期化せずに使っている。 funccod関数で、aabという変数を初期化せずに使っている。 というのが、警告メッセージの正しい内容です。 というわけで、警告メッセージに行数が書いてあるとおり、 adaptsite-d.1.c というファイルの先頭から30行目前後まで と、 adaptsite-d.2.c というファイルの先頭から32行目前後まで を、貼り付けてください。 そうすれば、何かがわかるかもしれません。 あるいは、何もわからないかもしれません。あまり期待しないでください。
その他の回答 (1)
- kmee
- ベストアンサー率55% (1857/3366)
おそらくですが、そのプログラムは計算部分にだけ注力しているものではないでしょうか。 研究用とかサンプルとかのプログラムの場合、「入力はすべて正しい」という前提で、エラー処理を行なっていない、ということがよくあります。 例えば、実行は「コマンド 入力ファイル 出力ファイル」という形式しか受け付けない場合。 一般には引数を確認して、不正な場合は処理をしないで終了します。(例: cp とだけ入力してみてください) ところが、「正しい」ことを前提にしているソフトでは、存在しない引数から存在しないファイル名を受け取りって読み書きしようとして、思わぬ結果になります。 Segmentation Faultもその一つです。 他にも、異常なパラメータ( 0<x<1が求められるところに0が指定してある)とか、ファイル形式の違い(数値が書いてあるべきところにアルファベット)とかも、チェックしていないケースがあります。 もう一度使いかたをよく読んで正しく使用してみてください。 > adaptsite-d.2.cの文中のbrlen1とbrlen2、adaptsite-d.2.cの文中のaabという関数?を初期化すればいい 関数ではなく変数です。 Cでは初期化しない場合、変数の中身がどうなっているかわかりません。a=brlen1 + brlen2 等とした場合に、brlen1,brlen2が初期化されていなかったらaの値がどうなるかまったくわからない、ということで、そのような警告が用意されています。 ただ、その警告はプログラムを完全に理解してのものではありません。例えば、 if ( f>0) { a=brlen1 + brlen2 ; } else { brlen1=0;brlen2=0; } 等とあった場合、最初からf>0だったら、確かにbrlen1は初期化される前に使われています。 しかし、プログラムの構成上、fは絶対に0から始まっていて、thenの部分がelseより先に実行されることは絶対にない、という場合でも、この警告はでます。 [fは絶対に0から始まっていて]ということがわからないからです。 警告を無くすだけだけなら、適当な値を代入すれば出なくなります。 しかし、プログラム全体としてそれが正しいかは、プログラムの動作を把握する必要があります。 とりあえず、今の段階では無視しておくのがよいと思います。
お礼
返信ありがとうございました。 Segmentation faultというメッセージが出たことに関して理解ができました。 READMEを一度読み返してソフトが動くまで試行錯誤してみようと思います。
補足
返信ありがとうございます。 お手数をおかけして申し訳ありません。 ●adaptsite-d.1.c の30行目までが以下で、 #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> #include <math.h> #include "adaptsite-d.h" void main(int argc, char *argv[]) { char cod1[4], cod2[4]; char seqcod[MAXENT+MAXNODE][302][4]; int aaa, aab, aac, aad, aae, aaf, aao; int baa, bad, bae, baf, bai, baj, bak, bal, bam; int seqnum, tseqnum, seed, spec, ancest, unit, codlen[5]; double bac, bah; double aam, f, func[5], sqdv, codfre[5][3][63], mut[4], m[6][6], p[5][63][63]; double eds[5], edn[5], bunshs[5], bunbos[5], bunshn[5], bunbon[5], totalshs, totalbos, totalsyn, ratio; /* totalchg, totalnuc */ double codres[5], thresh[63], ttest; struct codons{char cod[4]; char aa; double syn; double non;}; struct codons codon[63]; char frag1, buffer[MAXBUF]; char otu[MAXNAME]; char blen[MAXDIG]; int aa; /****** A variable for buffer[sequence] ******/ int ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al; int otunum, newnum, otunum1, otunum2; int otus1, otus2; double brlen1, brlen2; double branlen1, branlen2; /******@@@@@@ From the top to here is OK @@@@@@******/ ●adaptsite-d.2.c の32行目までが以下です。 #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> #include <math.h> #include "adaptsite-d.h" void funccod(char *codon3, char *codon4, double *count) { double TTT[3], TTC[3], TTA[3], TTG[3]; double CTT[3], CTC[3], CTA[3], CTG[3]; double ATT[3], ATC[3], ATA[3], ATG[3]; double GTT[3], GTC[3], GTA[3], GTG[3]; double TCT[3], TCC[3], TCA[3], TCG[3]; double CCT[3], CCC[3], CCA[3], CCG[3]; double ACT[3], ACC[3], ACA[3], ACG[3]; double GCT[3], GCC[3], GCA[3], GCG[3]; double TAT[3], TAC[3]; double CAT[3], CAC[3], CAA[3], CAG[3]; double AAT[3], AAC[3], AAA[3], AAG[3]; double GAT[3], GAC[3], GAA[3], GAG[3]; double TGT[3], TGC[3], TGG[3]; double CGT[3], CGC[3], CGA[3], CGG[3]; double AGT[3], AGC[3], AGA[3], AGG[3]; double GGT[3], GGC[3], GGA[3], GGG[3]; int aaa, aab; どうぞよろしくお願いします。