🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

3266閲覧

コアダンプを直したい(fgets,fscanf,fprintf)

tomatoeggs

総合スコア2

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/03/26 17:36

編集2021/03/26 18:01

前提・実現したいこと

c++においてコアダンプが消えてくれず困っています。
プログラムは最後のclose(file)まで実行され、生成されるfileも中身は正しいのですが、
如何せんコアダンプが気持ち悪く質問した次第です。

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

Segmentation fault (core dumped)

core ファイルの解析

GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-119.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later http://gnu.org/licenses/gpl.html
[New LWP 145344]
Core was generated by `./a.out'.
Program terminated with signal 11, Segmentation fault.
.#0 0x00007f619eb04575 in ?? () from /lib64/libstdc++.so.6
Missing separate debuginfos, use: debuginfo-install glibc-2.17-317.el7.x86_64 libgcc-4.8.5-44.el7.x86_64 libstdc++-4.8.5-
44.el7.x86_64
(gdb) bt
.#0 0x00007f619eb in ?? () from /lib64/libstdc++.so.6
.#1 0x00007f619eb in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string() ()
from /lib64/libstdc++.so.6
.#2 0x00007f619e1 in __run_exit_handlers () from /lib64/libc.so.6
.#3 0x00007f619e1 in exit () from /lib64/libc.so.6
.#4 0x00007f619e1 in __libc_start_main () from /lib64/libc.so.6
.#5 0x00000000004 in _start ()

該当のソースコード

c++

1 35 #define N 256 2 37 using namespace std; 3 39 string gomi,gomi2; 4 40 double G1, G2; 5 41 double z_o1,z_w1; 6 43 double d1; 7 8 44 int main() 9 45 { 10 46 int skip1 = 13; 11 47 int skip2 = 1; 12 48 13 49 FILE *fin_o1=fopen("./O1.var","r"); 14 51 FILE *fin_w1=fopen("./W1.var","r"); 15 53 FILE *fin_G=fopen("./out.Gnew","r"); 16 54 FILE *fout_j=fopen("./out.D","w"); 17 56 char moji[N]; 18 57 fgets(moji,N,fin_G); 19 58 rep(i, skip1) //for i=0 i < skip i++ 20 59 { 21 60 fgets(moji,N,fin_o1); 22 62 fgets(moji,N,fin_w1); 23 64 } 24 65 25 66 fscanf(fin_G,"%lf",&G1); 26 67 fscanf(fin_G,"%lf",&G2); 27 68 fclose(fin_G); 28 69 29 70 double a = 0.0, b = 0.0; 30 71 fscanf(fin_o1,"%s %s %lf", &gomi,&gomi2,&a); 31 72 fscanf(fin_o1,"%s %s %lf", &gomi,&gomi2,&b); 32 77 fclose(fin_o1); 33 73 z_o1 = a * G1 + b; 34 74 35 75 fscanf(fin_w1,"%s %s %lf", &gomi,&gomi2,&a); 36 76 fscanf(fin_w1,"%s %s %lf", &gomi,&gomi2,&b); 37 77 fclose(fin_w1); 38 77 z_w1 = a * G1 + b; 39 92 d1 = z_o1 - z_w1; 40 94 fprintf(fout_j,"%.10lf \n",d1); 41 96 42 97 fclose(fout_j); 43 98 return 0;

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

コンパイルは
g++ -O3 *.cpp
で行いました。
gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)

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

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

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

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

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

dodox86

2021/03/27 00:12

C++コンパイラの出す警告(warning)メッセージに向き合いましょう。"-Wall" オプション付きでたくさん出てきます。(以下、試してみた例) $ g++ -Wall -O3 x1.cpp x1.cpp: In function ‘int main()’: x1.cpp:66:51: warning: format ‘%s’ expects argument of type ‘char*’, but argument 3 has type ‘std::__cxx11::string* {aka std::__cxx11::basic_string<char>*}’ [-Wformat=] fscanf(fin_o1,"%s %s %lf", &gomi,&gomi2,&a); ~~~~~ ^ x1.cpp:66:51: warning: format ‘%s’ expects argument of type ‘char*’, but argument 4 has type ‘std::__cxx11::string* {aka std::__cxx11::basic_string<char>*}’ [-Wformat=] ... たくさん
guest

回答2

0

fscanf(fin_o1,"%s %s %lf", &gomi,&gomi2,&a);

%s をstringのアドレスで受けてるのがダメです
#他のところも同様

投稿2021/03/26 22:06

編集2021/03/26 22:07
y_waiwai

総合スコア88040

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

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

angel_p_57

2021/03/27 02:10

便乗してコメントしますが、メインの計算中は gomi,gomi2 の値を使わないので問題が顕在化していなくて、プログラム終了時に各オブジェクトのデストラクタが実行されるとき、string としての管理情報の破壊された状態がセグメンテーションフォルトにつながっているのでしょうね。
tomatoeggs

2021/03/27 06:45

仰る通りでstringをcharに直したら直りました。 勉強になります。 ありがとうございました。
guest

0

ベストアンサー

コアダンプが消えてくれず

あなたが消すために「何をしたか」が大事な情報のひとつかと思いますがいかが。

プログラムは最後のclose(file)まで実行され

これはなにを根拠にそう言っていますか? 別に疑っているわけじゃないですが、「事実」を示してください。

如何せんコアダンプが気持ち悪く

気持ち悪い、で済ませてよい事象ではありません。

とりあえず、
・ファイルのopenに対してはNULLチェック必須
・fscanfの%sに対してはstringではなくchar*を与える、
・読み飛ばしたいだけなら書式指定を%*sとする
というあたりの対応をするところでしょう。
stringのデータをめちゃくちゃに壊した結果デストラクタでコアダンプしてるとかを予想していますが。

stringを使いたいならcin使うのが適切なように思いますが。

投稿2021/03/26 22:08

thkana

総合スコア7703

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

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

tomatoeggs

2021/03/27 06:42

仰る通りです。 stringをchar*に変えたら直りました。 ありがとうございます。
thkana

2021/03/27 07:42

> stringをchar* まさかと思いますけれど、 char* gomi,*gomi2; fscanf(fin_o1,"%s%s%lf", gomi,gomi2,&a); とかしてないですよね?
tomatoeggs

2021/03/27 09:52

他のプログラムも参考にしながらstring gomiを char gomi[N] char *buff=gomiと直して fscanf(fin_o1,"%s%s%lf", buff,buff2,&a);と直しました。
thkana

2021/03/27 11:09

どのくらい消化してプログラムを書いているかわかりませんが、buffとかbuff2とか必要ではなくて char gomi[N]; fscanf(fin_o1,"%s%s%lf", gomi,gomi,&a); で全然構わない、というのは大丈夫ですか? (でも、バッファは何文字あればいいんだろうとか諸々考えると fscanf(fin_o1,"%*s%*s%lf", &a); がいいような気がするなぁ)
tomatoeggs

2021/03/27 14:20

*についてちゃんと理解していませんでした。 fscanf(fin_o1,"%*s%*s%lf", &a);を参考にさせて頂きます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問