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

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

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

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

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Q&A

解決済

1回答

563閲覧

c言語 ファイルの読み込み

MF_19

総合スコア27

C

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

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

0グッド

1クリップ

投稿2018/06/07 10:17

編集2018/06/07 12:27

初C言語で躓いてしまっており、
ソースコードもおかしな点があると思いますので、教えて頂ければと思います。

前提・実現したいこと

test.cfgファイルにスペース区切りで2つの数値があります。

その数値をweight1, weight2のポインタ(float型)変数として
別の関数から呼び出せるようにしたいです。
(書き方自体が間違っていればご指摘お願いします)

まずは2つの数値をポインタ(float型)変数としてcfgファイルから読み込みたいとのですが、どのようにすれば宜しいでしょか。

該当のソースコード 修正版

回答頂いたコードを元に変更すると、コンパイル時にエラーが発生しています。
layer.cでsse_ng_gpuにweight1, weight2を渡していますが、
渡し型の問題でしょうか?

main.cの// read values from fpで間違いなければ別の質問を
作成しようと思いましたが、元々の質問と繋がっているかもしれず
こちらでまずは確認させて頂きました。

元々のコード記載ファイル(main.c)

c

1void parse_config(float* weight1, float* weight2) 2{ 3 char values[100+1]; 4 char *filename; 5 long lines; 6 7 // read file 8 filename="test.cfg"; 9 FILE* fp = fopen(filename, "r"); 10 lines = fread(values, sizeof(float), 1, fp); 11 12 // read values from fp 13 sscanf(values, "%f %f\n", weight1, weight2); 14 //*weight1 = 15 //*weight2 = 16 fclose(fp); 17}

上記を呼び出す別ファイル(layer.c)

c

1void forward_cost_layer(cost_layer l, network net) 2if 3//途中コード省略 4else if(l.cost_type == SSE_NG){ 5 float weight1 = 0.0; 6 float weight2 = 0.0; 7 parse_config(&weight1, &weight2); 8 sse_ng_gpu(l.batch*l.inputs, net.input_gpu, net.truth_gpu, l.delta_gpu, l.output_gpu, weight1, weight2); 9 } else { 10 l2_gpu(l.batch*l.inputs, net.input_gpu, net.truth_gpu, l.delta_gpu, l.output_gpu, weight1, weight2); 11 }

エラー

./src/cost_layer.c: In function ‘forward_cost_layer’: ./src/cost_layer.c:147:95: error: incompatible type for argument 6 of ‘sse_ng_gpu’ l.batch*l.inputs, net.input_gpu, net.truth_gpu, l.delta_gpu, l.output_gpu, weight1, we ^ compilation terminated due to -Wfatal-errors. Makefile:103: recipe for target 'obj/cost_layer.o' failed make: *** [obj/cost_layer.o] Error 1

該当のソースコード

c

1#include <stdio.h> 2#include <string.h> 3#include <stdlib.h> 4 5void parse_config(float* weight1, float* weight2) 6{ 7 char values[100+1] 8 char *filename 9 float *weight1; 10 float *weight2; 11 float lines; 12 13 // read file 14 filename="test.cfg"; 15 FILE* fp = fopen(filename, "r"); 16 lines = fread(values, sizeof(float), 100, fp); 17 18 // read values from fp 19 *weight1 = 20 *weight2 = 21 22 fclose(fp); 23} 24

test.cfg

100 1

試したこと

上記のコードは他にも色々コードが書いてあるので、
一旦今回の目的機能のみ抜き出して下記のようにスクリプトを書いてみました。

試したことは、まずはstrtokを用いてcfgから数値を文字列として
読み取り、そこからatofを用いてstr to floatなどを行えればと思いました。

ただ、上手くcfgファイルから値が読み取れず、キャストも失敗します。
恐らくやり方自体がシンプルではないと感じてますので、
解決方法を教えて頂ければと思います。

c

1#include <stdio.h> 2#include <string.h> 3#include <stdlib.h> 4 5int main(void) { 6 FILE *fp; 7 char *filename="sse_ng.cfg"; 8 char values[1000]; 9 char *value1; 10 char *value2; 11 float *weight1; 12 float *weight2; 13 float lines; 14 15 fp = fopen(filename, "r"); 16 lines =fread(values, sizeof(float), 100, fp); 17 18 value1 = strtok(values, " "); 19 while(value1 != NULL) { 20 value1 = strtok(NULL, " "); 21 printf("%s\n", value1); 22 if(value1 != NULL) { 23 value2 = value1; 24 } 25 } 26 27 printf("%s", value1); 28 printf("%s", value2); 29 weight1 = atof(value1); 30 printf("%f", *weight1); 31 fclose(fp); 32}

よろしくお願いします。

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

ubuntu

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

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

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

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

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

guest

回答1

0

ベストアンサー

読み込むところまではできてるので、ちょっとの手直しでいける、と思いましたが、ちょいちょいミスってますね。

  • セミコロンがない
  • freadの戻り値の型
  • freadに与えるサイズ
  • 引数と同じ名前の変数を宣言している

これらを踏まえて修正してみました。

c

1#include <stdio.h> 2 3void parse_config(float* weight1, float* weight2); 4 5int main(void) 6{ 7 float weight1; 8 float weight2; 9 parse_config(&weight1, &weight2); 10 printf("%f %f\n", weight1, weight2); 11 12 return 0; 13} 14 15void parse_config(float* weight1, float* weight2) 16{ 17 char values[100+1]; 18 char *filename; 19 long lines; 20 21 // read file 22 filename="test.cfg"; 23 FILE* fp = fopen(filename, "r"); 24 lines = fread(values, sizeof(values), 1, fp); 25 26 // read values from fp 27 sscanf(values, "%f %f\n", weight1, weight2); 28 29 fclose(fp); 30}

投稿2018/06/07 10:47

ttyp03

総合スコア16998

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

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

MF_19

2018/06/07 12:05

早速ありがとうございます。 教えて頂いたコードで試すと、別のエラーが発生しました。 void parse_config内の// read values from fp以下ですが、 下記のような定義は不要でしょうか? *weight1= ~~~ もしくはweight1=~~~ 詳細は質問に更新という形で記載します。 もし別の問題でしたら、別の質問を作成しようと思います。
MF_19

2018/06/07 12:53

追加の質問は本件とは完成ありませんでした。 引数で渡すときに型指定が間違っていました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問