とっておきの手土産を教えて

私、生物系の大学院生ですが研究に進化の概念を取り込みたいと思い、Ubuntu10.04にc言語で書かれたであろうソフト(adaptsite-dといい、ある大学で無料配布されているものです。)をインストールしている最中です。インストールが成功したと思い、いざソフトを起動させてみるとSegmentation faultというエラーが出ます。
パソコンは全くの素人であるため問題を解決できないでいます。
どなたかお力をお貸しいただけないでしょうか。

手順は以下のようなものです。

ダウンロード後にREADMEを読んでみたところ以下のMakefileを用いてインストールするようでしたので、

Makefile
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CC = cc

all : adaptsite-d

OBJECTS = adaptsite-d.1.o adaptsite-d.2.o

adaptsite-d : $(OBJECTS)
$(CC) -o adaptsite-d adaptsite-d.1.o adaptsite-d.2.o

adaptsite-d.1.o : adaptsite-d.h adaptsite-d.1.c
$(CC) adaptsite-d.1.c -lm -c

adaptsite-d.2.o : adaptsite-d.h adaptsite-d.2.c
$(CC) adaptsite-d.2.c -lm -c
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ターミナルで

$make

としました。インストールが完了したと思い、このソフトをterminalから起動させると

Segmentation fault
Segmentation fault

とSegmentation faultという文が2回表示されます。

そこで、このSegmentation faultという文をgoogleで検索してみると、あるサイト(http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.ph …に行き着きました。内容は理解できませんでしたが、上のSegmentation faultの原因を特定する方法が書いてあることは理解できたため、

Makefikeを以下のように書き換え(-Wall -O2 を追加)、
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CC = cc

all : adaptsite-d

OBJECTS = adaptsite-d.1.o adaptsite-d.2.o

adaptsite-d : $(OBJECTS)
$(CC) -Wall -O2 -o adaptsite-d adaptsite-d.1.o adaptsite-d.2.o

adaptsite-d.1.o : adaptsite-d.h adaptsite-d.1.c
$(CC) -Wall -O2 adaptsite-d.1.c -lm -c

adaptsite-d.2.o : adaptsite-d.h adaptsite-d.2.c
$(CC) -Wall -O2 adaptsite-d.2.c -lm -c
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
terminalで

$make

とすると、

adaptsite-d.1.c: In function ‘main’:
adaptsite-d.1.c:30: warning: ‘brlen1’ may be used uninitialized in this function
adaptsite-d.1.c:30: warning: ‘brlen2’ may be used uninitialized in this function
cc -Wall -O2 adaptsite-d.2.c -lm -c
adaptsite-d.2.c: In function ‘funccod’:
adaptsite-d.2.c:32: warning: ‘aab’ may be used uninitialized in this function
cc -Wall -O2 -o adaptsite-d adaptsite-d.1.o adaptsite-d.2.o

といったエラーメッセージが表示されました。

おそらく、adaptsite-d.2.cの文中のbrlen1とbrlen2、adaptsite-d.2.cの文中のaabという関数?を初期化すればいいというメッセージだと思うのですが、どこに何を書き足せばいいのか全く検討がつきません。
どなたか解決策を教えていただけませんか。よろしくお願いします。

A 回答 (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行目前後まで
を、貼り付けてください。

そうすれば、何かがわかるかもしれません。
あるいは、何もわからないかもしれません。あまり期待しないでください。

この回答への補足

返信ありがとうございます。
お手数をおかけして申し訳ありません。
●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;

どうぞよろしくお願いします。

補足日時:2011/05/24 19:15
    • good
    • 0

おそらくですが、そのプログラムは計算部分にだけ注力しているものではないでしょうか。


研究用とかサンプルとかのプログラムの場合、「入力はすべて正しい」という前提で、エラー処理を行なっていない、ということがよくあります。

例えば、実行は「コマンド 入力ファイル 出力ファイル」という形式しか受け付けない場合。
一般には引数を確認して、不正な場合は処理をしないで終了します。(例: 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から始まっていて]ということがわからないからです。

警告を無くすだけだけなら、適当な値を代入すれば出なくなります。
しかし、プログラム全体としてそれが正しいかは、プログラムの動作を把握する必要があります。

とりあえず、今の段階では無視しておくのがよいと思います。
    • good
    • 0
この回答へのお礼

返信ありがとうございました。
Segmentation faultというメッセージが出たことに関して理解ができました。
READMEを一度読み返してソフトが動くまで試行錯誤してみようと思います。

お礼日時:2011/05/24 19:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報