初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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/07 12:05
2018/06/07 12:53