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

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

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

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

Q&A

2回答

1163閲覧

C言語・PDBファイル取り扱い

vowwowkuma1

総合スコア10

C

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

0グッド

0クリップ

投稿2018/11/23 08:52

C言語・pdbファイルで起こるSegmentation faultについて

pdbファイルを扱ってそこから情報を取ろうと思っているんでんですがSegmentation fault: 11が出てしまって。わからなくなってしまいました。具体的にはPDBの1行目がATOMかつ3行目がCAとなっている列の中から6,7,8行目の数値を出力したいと考えています。どうぞ教えてください。

発生している問題・エラーメッセージ

Segmentation fault: 11

該当のソースコード

#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include"PDB.h" #define N 256 int main(int argc,char* argv[]){ FILE* fpt; char* readline; int Atom_count = 0; int CA_count = 0; arrayPDB* pdb; if((fpt=fopen(argv[1],"r"))==NULL){ printf("ファイルが存在しません\n"); return(-1); } while(fgets(readline,N,fpt) != NULL){ if(strcmp(readline,"A")==0 && strcmp(readline+1,"T")==0 && strcmp(readline+2,"O")==0){ Atom_count++; if(strcmp(readline+13,"C")==0 && strcmp(readline+14,"A")==0){ CA_count++; } } } pdb->numAtom = Atom_count; pdb->numCAAtom = CA_count; pdb->CA = (Atom*)malloc(sizeof(float)*CA_count); fseek(fpt,0L,SEEK_SET); while(fgets(readline,N,fpt) != NULL){ if(strcmp(readline,"A")==0&&strcmp(readline+1,"T")==0&&strcmp(readline+2,"O")==0){ if(strcmp(readline+13,"C")==0 && strcmp(readline+14,"A")==0){ if(strcmp(readline+31,"-")==0){ pdb->CA->x = (-1)*(atof(readline+32)*10+atof(readline+33)+atof(readline+34)*0.1+atof(readline+35)*0.01+atof(readline+36)*0.001); } else if(strcmp(readline+32,"-")==0){ pdb->CA->x = (-1)*(atof(readline+33)+atof(readline+35)*0.1+atof(readline+36)*0.01+atof(readline+37)*0.001); } else{ pdb->CA->x = atof(readline+32)*10+atof(readline+33)+atof(readline+35)*0.1+atof(readline+36)*0.01+atof(readline+37)*0.001; } if(strcmp(readline+40,"-")==0){ pdb->CA->y = (-1)*(atof(readline+41)*10+atof(readline+42)+atof(readline+44)*0.1+atof(readline+45)*0.01+atof(readline+46)*0.001); } else if(strcmp(readline+41,"-")==0){ pdb->CA->y = (-1)*(atof(readline+42)+atof(readline+44)*0.1+atof(readline+45)*0.01+atof(readline+46)*0.001); } else{ pdb->CA->y = atof(readline+41)*10+atof(readline+42)+atof(readline+44)*0.1+atof(readline+45)*0.01+atof(readline+46)*0.001; } if(strcmp(readline+47,"-")==0){ pdb->CA->z = (-1)*(atof(readline+48)*10+atof(readline+49)+atof(readline+51)*0.1+atof(readline+52)*0.01+atof(readline+53)*0.001); } else if(strcmp(readline+48,"-")==0){ pdb->CA->z = (-1)*(atof(readline+49)+atof(readline+51)*0.1+atof(readline+52)*0.01+atof(readline+53)*0.001); } else{ pdb->CA->z = atof(readline+48)*10+atof(readline+49)+atof(readline+51)*0.1+atof(readline+52)*0.01+atof(readline+53)*0.001; } printf("%f %f %f\n",pdb->CA->x,pdb->CA->y,pdb->CA->z); pdb->CA++; } } } free(pdb->CA); return(0); }

試したこと

1度ファイルを最初から最後まで読み取り、1行目、3行目
でそれぞれ特定の文字があったら、その数をカウントし、一度リセットして、そこの6,7,8行目の数値を出力しようと思ってしました。

補足情報(FW/ツールのバージョンなど)

//pdbファイルの一部
ORIGX3 0.000000 0.000000 1.000000 0.00000 121P 100

SCALE1 0.024876 0.014362 0.000000 0.00000 121P 101

SCALE2 0.000000 0.028724 0.000000 0.00000 121P 102

SCALE3 0.000000 0.000000 0.006196 0.00000 121P 103

ATOM 1 N MET 1 -13.229 7.434 -18.546 1.00 14.06 0 121P 104

ATOM 2 CA MET 1 -11.966 6.732 -18.567 1.00 17.27 0 121P 105

ATOM 3 C MET 1 -11.956 5.664 -17.491 1.00 16.41 0 121P 106

ATOM 4 O MET 1 -12.756 5.685 -16.545 1.00 16.12 0 121P 107

ATOM 5 CB MET 1 -10.765 7.673 -18.306 1.00 17.94 0 121P 108
//構造体
typedef struct arrayPDB arrayPDB ;

struct arrayPDB{
int numAtom;
int numCAAtom;
Atom* CA;
};

typedef struct Atom Atom;

struct Atom{
float x;
float y;
float z;
};

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

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

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

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

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

guest

回答2

0

まず、

while(fgets(readline,N,fpt) != NULL){

fgets の第一引数はデータを読み込むためのバッファアドレスを指定する必要がありますが、この場合、ポインタ変数、しかも未初期化のものを当てています

これではどこかわからないところにデータが展開されるため、エラーとなってしまいますね

投稿2018/11/23 13:01

y_waiwai

総合スコア87719

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

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

0

まず、"Segmentation fault" の件は、y_waiwaiさんの指摘の通りで、readline が charポインタのみで、文字列を格納する領域が確保されていません。

正確には、どこで発生したのか調べる必要がありますが、発生行数とかの表示はないでしようか? デバッガ上で実行すれば、表示されると思います。
そうでなければ、適当にデバッグメッセージの出力を行うなどの方法で確認する必要があります。

また、その他の問題ですが、

if(strcmp(readline,"A")==0 && strcmp(readline+1,"T")==0 && strcmp(readline+2,"O")==0){

strcmp()関数の仕様は確認されていますか? 文字列同士の比較です。
'strcmp(readline,"A")' は、 readlineに格納されている文字列と、文字列"A" の比較になります。もし、readline に "ATOM"(null終端)が入っている
場合、偽(false) となります。 他も同様。

この辺も確認し、見直しを行った方が良いです。

投稿2018/11/25 11:55

pepperleaf

総合スコア6383

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問