سؤال

لقد حصلت على سلسلة من ملفات yaml التي تم إنشاؤها

أنا بخير على أشياء بسيطة ، لكن تمثيل المصفوفة يصعب.

# Center of table
tableCenter: !!opencv-matrix
   rows: 1
   cols: 2
   dt: f
   data: [ 240,    240]

هذا يجب أن يرسم الخريطة في المتجه

240
240

مع النوع يطفو. رمز بلدي يشبه:

#include "yaml.h"
#include <fstream>
#include <string>

struct Matrix {
    int x;
};

void operator >> (const YAML::Node& node, Matrix& matrix) {
   unsigned rows;
   node["rows"] >> rows;
}

int main()
{
   std::ifstream fin("monsters.yaml");
   YAML::Parser parser(fin);
   YAML::Node doc;

    Matrix m;
    doc["tableCenter"] >> m;

   return 0;
}

لكني أحصل

terminate called after throwing an instance of 'YAML::BadDereference'
  what():  yaml-cpp: error at line 0, column 0: bad dereference
Abort trap

لقد بحثت عن بعض الوثائق لـ YAML-CPP ، ولكن لا يبدو أن هناك أيًا ، بصرف النظر عن مثال تمهيدي قصير على تحليل وينبعث. لسوء الحظ ، لم يساعد أي من هذين في هذا الظرف بالذات.

كما أفهم ، !! تشير إلى أن هذا نوع محدد من قبل المستخدم ، لكنني لا أرى مع Yaml-CPP كيفية تحليل ذلك.

هل كانت مفيدة؟

المحلول

عليك أن تقول yaml-cpp كيفية تحليل هذا النوع. نظرًا لأن C ++ لم يتم كتابته ديناميكيًا ، فهو لا يمكنه اكتشاف نوع البيانات الذي تريده وإنشائه من نقطة الصفر - عليك أن تخبره مباشرة. إن وضع علامة على العقدة هو حقًا لنفسك فقط ، وليس من أجل المحلل (سوف يخزنها بأمانة).

لست متأكدًا حقًا كيف يتم تخزين مصفوفة OpenCV ، ولكن إذا كان الأمر كذلك: شيء من هذا القبيل:

class Matrix {
public:
   Matrix(unsigned r, unsigned c, const std::vector<float>& d): rows(r), cols(c), data(d) { /* init */ }
   Matrix(const Matrix&) { /* copy */ }
   ~Matrix() { /* delete */ }
   Matrix& operator = (const Matrix&) { /* assign */ }

private:
   unsigned rows, cols;
   std::vector<float> data;
};

ثم يمكنك كتابة شيء مثل

void operator >> (const YAML::Node& node, Matrix& matrix) {
   unsigned rows, cols;
   std::vector<float> data;
   node["rows"] >> rows;
   node["cols"] >> cols;
   node["data"] >> data;
   matrix = Matrix(rows, cols, data);
}

يحرر يبدو أنك بخير حتى هنا ؛ لكنك تفتقد الخطوة التي يقوم المحلل بتحميل المعلومات في YAML::Node. بدلاً من ذلك ، مثل:

std::ifstream fin("monsters.yaml");
YAML::Parser parser(fin);
YAML::Node doc;
parser.GetNextDocument(doc); // <-- this line was missing!

Matrix m;
doc["tableCenter"] >> m;

ملاحظة: أنا أظن dt: f يعني "نوع البيانات تعويم". إذا كان هذا هو الحال ، فسوف يعتمد حقًا على كيفية Matrix الفصل يتعامل مع هذا. إذا كان لديك فئة مختلفة لكل نوع بيانات (أو فصل دراسي) ، فسيتعين عليك قراءة هذا الحقل أول, ، ثم اختر أي نوع لاستنباطه. (اذا أنت أعرف سيكون دائمًا ما يطفو ، وسيجعل حياتك أسهل ، بالطبع).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top