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

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

ただいまの
回答率

90.75%

  • C

    3455questions

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

  • Ubuntu

    1261questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 148

MF_19

score 19

初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)

void parse_config(float* weight1, float* weight2)
{
    char values[100+1];
    char *filename;
    long lines;

    // read file
    filename="test.cfg";
    FILE* fp = fopen(filename, "r");
    lines = fread(values, sizeof(float), 1, fp);

    // read values from fp
    sscanf(values, "%f %f\n", weight1, weight2);
    //*weight1 = 
    //*weight2 =
    fclose(fp);
}

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

void forward_cost_layer(cost_layer l, network net)
if
//途中コード省略
else if(l.cost_type == SSE_NG){
        float weight1 = 0.0;
        float weight2 = 0.0;
        parse_config(&weight1, &weight2);
        sse_ng_gpu(l.batch*l.inputs, net.input_gpu, net.truth_gpu, l.delta_gpu, l.output_gpu, weight1, weight2);
               }  else {
        l2_gpu(l.batch*l.inputs, net.input_gpu, net.truth_gpu, l.delta_gpu, l.output_gpu, weight1, weight2);
    }


エラー

./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

 該当のソースコード

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void parse_config(float* weight1, float* weight2)
{
    char values[100+1]
    char *filename
    float *weight1;
    float *weight2;
    float lines;

    // read file
    filename="test.cfg";
    FILE* fp = fopen(filename, "r");
    lines = fread(values, sizeof(float), 100, fp);

    // read values from fp
    *weight1 =
    *weight2 =

    fclose(fp);
}


test.cfg

100 1

 試したこと

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

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

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

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void) {
    FILE *fp;
    char *filename="sse_ng.cfg";
    char values[1000];
    char *value1;
    char *value2;
    float *weight1;
    float *weight2;
    float lines;

    fp = fopen(filename, "r");
    lines =fread(values, sizeof(float), 100, fp);

    value1 = strtok(values, " ");
    while(value1 != NULL) {
        value1 = strtok(NULL, " ");
        printf("%s\n", value1);
        if(value1 != NULL) {
            value2 = value1;
            }
        }

    printf("%s", value1);
    printf("%s", value2);
    weight1 = atof(value1);
    printf("%f", *weight1);
    fclose(fp);
}


よろしくお願いします。

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

ubuntu

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

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

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

#include <stdio.h>

void parse_config(float* weight1, float* weight2);

int main(void)
{
    float weight1;
    float weight2;
    parse_config(&weight1, &weight2);
    printf("%f %f\n", weight1, weight2);

    return 0;
}

void parse_config(float* weight1, float* weight2)
{
    char values[100+1];
    char *filename;
    long lines;

    // read file
    filename="test.cfg";
    FILE* fp = fopen(filename, "r");
    lines = fread(values, sizeof(values), 1, fp);

    // read values from fp
    sscanf(values, "%f %f\n", weight1, weight2);

    fclose(fp);
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/07 21:05

    早速ありがとうございます。

    教えて頂いたコードで試すと、別のエラーが発生しました。
    void parse_config内の// read values from fp以下ですが、
    下記のような定義は不要でしょうか?
    *weight1= ~~~ もしくはweight1=~~~

    詳細は質問に更新という形で記載します。

    もし別の問題でしたら、別の質問を作成しようと思います。

    キャンセル

  • 2018/06/07 21:53

    追加の質問は本件とは完成ありませんでした。

    引数で渡すときに型指定が間違っていました。
    ありがとうございました。

    キャンセル

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

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C

    3455questions

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

  • Ubuntu

    1261questions

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