Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ quickfix/c+中的重复组+;_C++_Stl_Quickfix - Fatal编程技术网

C++ quickfix/c+中的重复组+;

C++ quickfix/c+中的重复组+;,c++,stl,quickfix,C++,Stl,Quickfix,我正在编写一个使用quickfix库的程序。文件很差,因此我请求so研究员的帮助 我在Group类中看到了迭代器。因此,我假设有某种类似STL的方法来解析重复组。我错了吗? 有人能提供一个简单的例子来说明这一点吗 非常感谢您的光临。请使用Quickfix库以及有关如何构造修复消息的文档。否则很难破译这些信息是如何组织的 这是我们的一个例子 您的消息是MarketDataSnapshotFullRefresh类对象 FIX::NoMDEntries noMDEntries; message.ge

我正在编写一个使用quickfix库的程序。文件很差,因此我请求so研究员的帮助

我在Group类中看到了迭代器。因此,我假设有某种类似STL的方法来解析重复组。我错了吗? 有人能提供一个简单的例子来说明这一点吗


非常感谢您的光临。

请使用Quickfix库以及有关如何构造修复消息的文档。否则很难破译这些信息是如何组织的

这是我们的一个例子

您的消息是MarketDataSnapshotFullRefresh类对象

FIX::NoMDEntries noMDEntries; 
message.get(noMDEntries); -> 
您将获得重复组的计数,即需要迭代对象消息多少次才能获得所有条目。记住FIX::NoMDEntries是一个字段

FIX42::MarketDataSnapshotFullRefresh::NoMDEntries group; -> 
这有点棘手。你进入一条信息中,以获取群组。这里,NoMDEntries是MarketDataSnapshotFullRefresh类中的一个封闭类。请记住,这是将为您提供数据的类。现在,要么运行循环,要么多次编写相同的代码,以提取每个组中的所有字段。getGroup提供从中提取字段的组。getField将为您提供字段数据。Quickfix的大多数术语都是修复消息。因此,参考一个像这样的修复信息网站,你的生活就会轻松得多

FIX::MDEntryType MDEntryType;
FIX::MDEntryPx MDEntryPx;
FIX::MDEntrySize MDEntrySize;
FIX::OrderID orderID;

message.getGroup(1, group);
group.get(MDEntryType);
group.get(MDEntryPx);
group.get(MDEntrySize);
group.get(orderID);

message.getGroup(2, group);
group.get(MDEntryType);
group.get(MDEntryPx);
group.get(MDEntrySize);
group.get(orderID);

FieldMap
类中有迭代器,它是
Message
Group
类的超类

我不知道你所说的解析重复组是什么意思

当原始修复消息到达时,修复引擎会为您解析它们,您的回调会得到已解析的修复消息-它具有消息头、正文和尾部中标记的内部标记映射(键/值)

查看1.13.2版本的代码,当引擎从网络获取新的字符串消息时,它最终将创建一条
消息
并将字符串传递给它<代码>消息构造函数然后对自身调用
setString()
,该构造函数有效地解析接收到的字符串并创建标记映射

如果查看
Message::setString
可以看到,首先添加了新字段,然后在
setGroup
中检查字段是否是组的一部分。如果是,则此方法,
setGroup
,将接管以下标记的解析,而这些标记是组的一部分。一旦遇到不属于组的标记,它就会停止解析组,返回并继续解析消息中的字段

现在,这一切都发生在你处理收到的消息的应用程序回调之前

有一种方法可以迭代消息中的字段。您可以迭代标题、正文或组(以及每个组)的字段

身体也是如此:

FIX::FieldMap::iterator it;
FIX::FieldMap::iterator b = msg.begin();
FIX::FieldMap::iterator e = msg.end();
还有组迭代器(
FieldMap::g_begin/g_end
),因此您可以在msg或header中对组进行迭代,也可以在每个组中迭代或搜索标记

const FIX40::ExecutionReport& msg; // new incoming message

// iterate over header
FIX::FieldMap::iterator it;
FIX::FieldMap::iterator b = msg.getHeader().begin();
FIX::FieldMap::iterator e = msg.getHeader().end();

for(it = b; it != e; ++it)
{
    switch(it->first)
    {
        case FIX::FIELD::MsgSeqnum:
              /* it->second.getString() - do something with tag data*/ ;
              break;
        ...
    }
}
组以及消息扩展了FieldMap,因此所有的getField/setField功能都可以在多个应用程序之间共享

内部。。。如果细节太多,请跳过。

在上面的示例中,此代码:

message.getGroup(1, group);
group.get(MDEntryType);
有效地传递来自
message.getGroup(1,group)
->
FieldMap::getGroup(1,group.field(),group)
->
getGroupRef(num,field)
->
m\u groups.find(field)
,它提供组向量(
vector
),并返回
num
元素,aka消息中的
num
组(a
FieldMap

group.get(field)
是使用宏为每个标记创建的,这些标记被有效地转换为
(map).getField(field)
。 在初始化期间,组的(映射)是对标记所属对象的引用,因此它从特定组返回标记(参见示例
src/C++/fix44/neworderssingle.h
它有两个扩展组的内部类)


希望它有一定的意义。

+1让您的lonk修复。但是,您似乎没有回答我关于迭代器的问题(我已经阅读了Quickfix文档)。@Luca Martini-您不使用内部迭代器,主要是字段迭代器会更容易。它们需要知道哪些字段位于哪个位置的开销。使用公共函数来解析消息,使用提供的函数返回组。get和set函数应该是您应该用来解析消息的函数,除非您正在对库进行更改。提醒:即使FAQ声明不同的quickfix(从1.13.3开始)在没有数据字典的情况下也不会执行重复组。如果看到已知存在的组引发FieldNotFound异常,请仔细检查配置。