0

YAML と yaml-cpp ライブラリを使用してファイルを解釈し始めています。「モンスター」の例を、自分のプロジェクトからの情報で拡張しました。コードと yaml ファイルは以下のとおりですが、最初に質問があります。

プロジェクトから取得するすべてのデータを 1 つの巨大な構造に配置する必要がありますか? モンスターの例では、文書 doc[i] から値を読み取るのはモンスターのリストだったので簡単でした。私の例では、いくつかのリストだけでなく、スカラーなども使用します。これを行う唯一の方法は、技術的にエントリが 1 つだけのリストを作成することです (つまり、先頭に '-' が 1 つだけあります)。ファイルの、すべてがブロックにインデントされます)。答えは、オーバーロードされた >> 演算子の 'problemformulation' バージョンのコンテンツの一部を取得することだと思いますが、そのコンテンツをその関数内に配置しないと、適切に機能させることができませんでした。ヘルプやアドバイスをいただければ幸いです。

ea_test.cpp:

    #include "yaml-cpp/yaml.h"
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <vector>

    struct Vec2{
  double x, y;
    };

    struct DecVar{
  std::string name;
  std::string tag;
      Vec2 range;
  std::string description;
    };

    struct ProblemFormulation{
  std::vector <DecVar> decvars;
  int numrealizations;
    };

    void operator >> (const YAML::Node& node, Vec2& v) {
  node[0] >> v.x;
  node[1] >> v.y;
    }

    void operator >> (const YAML::Node& node, DecVar& decvar){
  node["name"] >> decvar.name;
  node["tag"] >> decvar.tag;
      node["range"] >> decvar.range;
  node["description"] >> decvar.description;
    }

    void operator >> (const YAML::Node& node, ProblemFormulation& problemformulation){
      node["realizations"] >> problemformulation.numrealizations;
      std::cout << " read realizations!" << std::endl; 
      const YAML::Node& decvarNode = node["decisions"];
      for (unsigned int i = 0; i < decvarNode.size(); i++)
      {
    DecVar decvar;
    decvarNode[i] >> decvar;
        problemformulation.decvars.push_back(decvar);
      }
    }

    int main()
    {
        std::ifstream fin("./ea.yaml");
        YAML::Parser parser(fin);
        YAML::Node doc;
        parser.GetNextDocument(doc);
        std::cout << "entering loop" << std::endl;

        ProblemFormulation problemformulation;

        for (unsigned int i = 0; i < doc.size(); i++)
        {
              doc[i] >> problemformulation;
        }
        return 0;
    }

そして、ea.yaml:

    -
      realizations: 10
      decisions:
        - name: reservoir
          tag: res_tag
          range: [0, 1.0]
          description: >
            This is a description.
        - name: flow
          tag: flow_tag
          range: [0, 2.0]
          description: >
            This is how much flow is in the system.

あなたの助けとヒントを前もってありがとう!

編集: おそらく、実行する yaml ドキュメントは 1 つだけで、作成される problemformulation オブジェクトは 1 つだけです。私のコードは、リストに対して行うことを適応させますが、一度しか行いません。「1回だけ実行する」という適切な方法を知りたいのですが、それはよりクリーンで見栄えの良いYAMLファイルを作成すると思うからです(すべてのものを理由もなく1ブロックインデントする必要はありません)。

4

1 に答える 1

1

あなたが書くとき

for (unsigned int i = 0; i < doc.size(); i++)
{
    doc[i] >> problemformulation;
}

これは、[シーケンスと見なされる] ドキュメント内のすべてのエントリをループし、それぞれを読み取ります。最上位ノードがシーケンス ノードではなく、「問題の定式化」である場合は、次のように記述します。

doc >> problemformulation;
于 2012-02-09T15:50:05.840 に答える