私、生物系の大学院生ですが研究に進化の概念を取り込みたいと思い、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という関数?を初期化すればいいというメッセージだと思うのですが、どこに何を書き足せばいいのか全く検討がつきません。
どなたか解決策を教えていただけませんか。よろしくお願いします。
No.1ベストアンサー
- 回答日時:
>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;
どうぞよろしくお願いします。
No.2
- 回答日時:
おそらくですが、そのプログラムは計算部分にだけ注力しているものではないでしょうか。
研究用とかサンプルとかのプログラムの場合、「入力はすべて正しい」という前提で、エラー処理を行なっていない、ということがよくあります。
例えば、実行は「コマンド 入力ファイル 出力ファイル」という形式しか受け付けない場合。
一般には引数を確認して、不正な場合は処理をしないで終了します。(例: 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を一度読み返してソフトが動くまで試行錯誤してみようと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 英語 The SD reamer drill with stopper may also be used 3 2022/04/22 09:40
- 英語 仮主語の「to be+名詞」の和訳について 4 2022/05/07 14:49
- 英語 The crestal approach works well in single or two a 2 2022/04/19 18:59
- 英語 L-PRF can be obtained by manual or automated metho 1 2022/04/08 09:39
- Mac OS El Capitanがインストールできない… 1 2023/06/16 13:05
- 英語 accommodate の日本語訳について教えてください。 Social attitudes wil 3 2022/12/17 16:09
- 英語 英語に詳しい方に質問です。 2 2022/06/21 15:33
- 英語 提示文の"hence"の前にピリオドがない理由と文の構造について 8 2022/03/24 10:48
- Visual Basic(VBA) Excel VBA メール作成について 本文の中にExcel でコピーした図を上下に2つ 貼り付けを 2 2023/06/14 01:48
- 英語 英文解釈。 "Evidence" の理解 10 2022/11/07 09:27
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・ハマっている「お菓子」を教えて!
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【JAVA】数字をひし形に出力す...
-
変数の値が勝手に変化する原因
-
ProC 固定SQLでNULLってどう表...
-
4桁の数値を逆に表示されるプ...
-
fortranについて
-
Excelで4096点以上のFFTの方法
-
65536は2の何乗なのでしょうか?
-
Bluestacks内でダウンロードし...
-
PICマイコンのコピー(クローン...
-
スレッド処理からダイアログを...
-
VBAで仕様書は書きますか?
-
javaからAS400のプログラム起動
-
PICアセンブラを出来る方、教え...
-
VBAにてメール作成した際、一部...
-
0除算して、落ちるプログラムと...
-
Excel VBAにてFFT
-
GPIB制御
-
[ EXCEL VBA ] 図形を読み込む...
-
正しい五十音順について
-
「Outlookが他のプログラムによ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
変数の値が勝手に変化する原因
-
Fortran90についての質問です。
-
Matlabについて質問2
-
【JAVA】数字をひし形に出力す...
-
fortran if文
-
JCLの基本について教えてください
-
Sublime Text 3でのFortranプロ...
-
ProC 固定SQLでNULLってどう表...
-
COBOLのピリオド
-
4桁の数値を逆に表示されるプ...
-
360度を超える角度
-
main関数終了時のreturnの意味は?
-
3つの整数のうち奇数のみを表示...
-
Fortran "実引数の型が仮引数の...
-
exitってどう使うの?
-
c言語のプログラミング 2つの整...
-
HeapDestroyを安全に行う方法
-
PICのプログラムでsrandを使う...
-
"n!"(階乗)の数字列の生成
-
fortranについて
おすすめ情報