発生している問題
現在Cで書かれたプログラムの修正中で、下記のような簡略化したコードを検討しています。
コード自体は実行できる(期待した値が出力される)のですが、vscodeでデバッグをしているとwhile文の部分でsegmentation faultが起こっていると警告が出ます。
ただ、コードを見てもどうしてsegmentation faultが起こっているのかが分かりません。
どなたか解決策を教えていただけないでしょうか?
実行環境
vscodeよりデバッグを実行
wsl2 ubuntu-20.04
コンパイラ: gcc 9.3.0
デバッガ: gdb 9.2
検討しているコード
4行3列のデータが格納されているcsvファイルを読み込み、その値をコンソール上に出力するようなプログラムを書いています。
デバッグなしで実行した場合、期待通りの出力が行われます。
一方で、デバッグを行うと「while(fgets(line, N, fp) != NULL){」の部分でsegmentation faultが起こっていると出力されます。
以下が検討しているコードになります。
C
1#include <stdio.h> 2#include <stdlib.h> 3 4#define N 256 //1行の最大文字数(バイト数) 5 6//csvファイルを読み込むための構造体dataの作成。1行当たり3つの値を格納 7typedef struct str { 8 double f_value[3]; 9} data; 10 11int main(void){ 12 FILE *fp; 13 char fname[] = "test.csv"; 14 char line[N]; 15 double f1, f2, f3; 16 int i = 0; 17 data data[4]; 18 int x, y, j; 19 20 fp = fopen(fname, "r"); 21 //読み込んだcsvファイルを1行ずつ取り出し、各列ごとの値をdataに追加していく 22 while(fgets(line, N, fp) != NULL){ 23 sscanf(line, "%lf,%lf,%lf", &f1, &f2, &f3); 24 double tmp[] = {f1, f2, f3}; 25 for(j = 0; j < sizeof(data[i].f_value) / sizeof(data[i].f_value[0]); j++) { 26 data[i].f_value[j] = tmp[j]; 27 } 28 i++; 29 } 30 fclose(fp); 31 32//読み込んだファイルの中身をコンソール上へと出力 33 for(x=0;x<4;x++) { 34 for(y=0;y<3;y++) { 35 printf("%lf\n", data[x].f_value[y]); 36 } 37 } 38 return 0; 39} 40
vscodeのデバッグの設定
設定ファイルにはlaunch.jsonとtasks.jsonがあります。
参考サイトを確認したところ、launch.jsonの書き方は恐らく問題ないと思います。
tasks.jsonの方は良さそうなサイトを見つけれなかったのですが、こちらに載っているものをそのまま使っていました。
実際に書いたものは以下です。
launch.json
{ // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "gcc - Build and debug active file", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/a.out", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "console": "integratedTerminal", "MIMode": "gdb", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": false } ], "preLaunchTask": "C/C++: gcc build active file", "miDebuggerPath": "/usr/bin/gdb" } ] }
tasks.json
{ "tasks": [ { "type": "cppbuild", "label": "C/C++: gcc build active file", "command": "/usr/bin/gcc", "args": [ "-g", "-O0", "${file}", ], "options": { "cwd": "${workspaceFolder}" }, "problemMatcher": [ "$gcc" ], "group": { "kind": "build", "isDefault": true }, "detail": "Task generated by Debugger." } ], "version": "2.0.0" }
test.csvの中身
5,1,0.2
10,5,0.02
50,0.1,0.01
100,5,10
以上になります。よろしくお願い致します。
回答3件
あなたの回答
tips
プレビュー