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

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

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

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

make

make は、ビルド作業を自動化するツールです。さまざまなファイルの最終変更時刻を比較し、従属するファイルよりも「ターゲット」のファイルが古いことがわかったときユーザーが設定していた命令を実行する事が可能です。

Q&A

解決済

2回答

2094閲覧

c言語 Segmentation faultについて

MF_19

総合スコア27

C

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

make

make は、ビルド作業を自動化するツールです。さまざまなファイルの最終変更時刻を比較し、従属するファイルよりも「ターゲット」のファイルが古いことがわかったときユーザーが設定していた命令を実行する事が可能です。

0グッド

0クリップ

投稿2018/06/08 06:44

編集2018/06/08 06:52

前提・実現したいこと

コンパイルは通るのですが、プログラムを実行すると
Segmentation faultとなります。

調べてみるとmallocなどを使うべきなのかと思っていますが、
上手くかけていません。

全体の目的としてはcfgファイルから2つの数値をweight1,2として取得し、
とある計算の引数にしようと思っています。

c初心者なのですが、どのような原因や対策があるのか教えて頂ければと思います。

該当のソースコード

cfgファイルから値を取得
parser.c

c

1#include <stdio.h> 2#include <string.h> 3#include <stdlib.h> 4 5void parse_sse_ng_config(float* weight1, float* weight2) 6{ 7 char values[100]; 8 char *filename; 9 long lines; 10 // read file 11 filename="sse_ng.cfg"; 12 FILE* fp = fopen(filename, "r"); 13 lines = fread(values, sizeof(values), 1, fp); 14 // read values from fp 15 sscanf(values, "%f %f", weight1, weight2); 16 fclose(fp); 17}

parser.cからweight1,2を参照して別の関数の引数とする
cost_layer.c

c

1#include "cost_layer.h" 2#include <string.h> 3#include <stdlib.h> 4#include <stdio.h> 5#include "parser.h" 6 7void parse_sse_ng_config(float* weight1, float* weight2); 8void forward_cost_layer_gpu(cost_layer l, network net) 9{//コード省略 10 } else if(l.cost_type == SSE_NG){ 11 float weight1 = 0.0; 12 float weight2 = 0.0; 13 14 parse_sse_ng_config(&weight1, &weight2); 15 sse_ng_gpu(~~~~~, weight1, weight2); 16 } else //コード省略 17

sse_ng.cfg
スペース区切りの数値2つ

50.0 2.0

##make コンパイル時
コンパイル時はこのような出力がでます。
もう一度makeをすると
make: Nothing to be done for 'all'.
となるので、コンパイルは通っています。

gcc -Iinclude/ -Isrc/ -DGPU -I/usr/local/cuda/include/ -DCUDNN -Wall -Wno-unknown-pragmas -Wfatal-errors -fPIC -fopenmp -Ofast -DGPU -DCUDNN -c ./src/cost_layer.c -o obj/cost_layer.o gcc -Wall -Wno-unknown-pragmas -Wfatal-errors -fPIC -fopenmp -Ofast -DGPU -DCUDNN -shared obj/gemm.o obj/utils.o obj/cuda.o obj/deconvolutional_layer.o obj/convolutional_layer.o ob ...............

###補足
cost_layer.cのparse_sse_ng_config(&weight1, &weight2);
をコメントアウトするとプログラムが通るので、
この部分が問題だと考えています。

parser.c内のchar values[100]の定義に問題があるのかもしれません。

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

ubuntu

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

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

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

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

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

guest

回答2

0

ベストアンサー

まず確かめるべきは

  1. ファイルは開けているか?
  2. ファイルは読み込めているか?
  3. weight1およびweight2は読み込めているか?

です。

1. ファイルは開けているか?

c

1// parser.c 2#include <unistd.h> // getcwd 3#include <math.h> // NaN 4 5// `FILE* fp = fopen(filename, "r");`直後に 6if(fp == NULL){ 7 printf("can't open %s\n", filename); 8 // あんまり行儀よくないが面倒くさいので再利用 9 if(getcwd(values, sizeof(values)) != NULL) 10 printf("cwd: [%s]\n", values); 11 fflush(stdout); 12 weight1 = weight2 = NAN; 13 return; 14}

2. ファイルは読み込めているか?

c

1// lines = fread(values, sizeof(values), 1, fp); 直下に 2printf("%s read %d bytes, [%s]\n", filename, lines, values); 3fflush(stdout);

3. weigth1, weight2は読み込めているか

c

1// sscanf(values, "%f %f", weight1, weight2); 直下に 2printf("weight1: %f, weight2: %f\n", weight1, weight2); 3fflush(stdout);

まぁ、こんな感じに順に確かめていきます。

投稿2018/06/08 07:09

asm

総合スコア15147

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

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

MF_19

2018/06/08 08:32

ファイルの読み取りが上手く出来ていませんでした! 詳細ありがとうございます。
guest

0

  1. void parse_sse_ng_config(float* weight1, float* weight2)

このfloat* をdouble* にしよう。他のところも全部double に。

  1. FILE* fp = fopen(filename, "r");

fp のNULLチェックを入れる必要あり
このままではオープンに失敗した場合、コケます

投稿2018/06/08 06:54

y_waiwai

総合スコア87747

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

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

MF_19

2018/06/08 08:31

回答頂きありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問