MQL5中的OOP问题 - 页 61

 
Alexey Navoykov:
另一方面,对于序列化来说,明确指定文本字段名可能更好,这样你就可以在代码中自由重命名,而不用担心存储的文件会停止工作。

我问的是变通的结构,实施本身并不是什么大问题 ))))

命名字段不是问题,问题是要考虑,以后该怎么做--json将只是每个类中的一个方法,还是一个静态类,还是一般以text....的形式重复类字段。

;)


ZS。

想到了一些既定的夸夸其谈--"是的,我有代码,一般来说,从MQL移植到C++中,这里和那里都没有改变!!!!"

这当然是需要的,但就开发这种代码结构所花费的时间而言,它是相当昂贵的,而且还需要有新愿望的代码支持。

只有连接C++(++ MQL)的优势是不明确的,语法结构有90%是相同的,为什么要重复呢? IMHO有趣的其他语言的扩展语法和编译器的可能性,在IDE中的控制,而写的项目- 它是至少快速和舒适,更不用说准备在公共领域的发展,同样的C#和蟒蛇

 
Igor Makanu:

只有C++捆绑(++ MQL)的优势不明显

C++有更多的可能性。加上10亿个不同的图书馆。

 
Koldun Zloy:

C++有更多的功能。加上10亿个不同的图书馆。

毋庸置疑地

但无论你如何努力,你都无法在MQL中打开任何C头文件,并使用现成的C++解决方案来连接一百万的库

今年早些时候,我在网上搜索了一下,并试图将TensorFlow连接到具有C++ API的MQL。

 
Igor Makanu:

无疑

但是,无论你如何努力,你都不能把任何C语言头文件,在MQL中打开,并使用C++中现成的解决方案来连接一百万个库。

今年早些时候,我在谷歌上搜索了一下,并试图将TensorFlow连接到具有C++ API的MQL上--你需要写一个viper

你问到了C++和MQL的配对问题。我知道C++在DLL中使用。不然怎么会这样呢?

 
Koldun Zloy:

你问的是C++和MQL之间的联系。我理解C++在DLL中被使用。不然怎么会这样呢?

我问:https://www.mql5.com/ru/forum/307970/page10#comment_11652222

否则,好....一个技巧,允许你在MQL中打开头文件c_api.h,然后使用TensorFlow文档。

现在你在VS中打开头文件,然后包住调用、模型、内部状态...。...到你的.dll中,然后你可以在MQL中使用它。


这一切都很费时


Igor Makanu:

这就是为什么我问的是解决方法的结构,实施本身是事后的想法。)

也许使用MQL工具在json中序列化简单的结构是现实的https://habr.com/ru/post/311262/

至少知道这些材料可以在网上找到是令人欣慰的。

附加的文件:
c_api.zip  17 kb
 
Igor Makanu:

嗯哼...我再试着问一下。

请帮助我,并需要一个例子!请!

这只是我在膝盖上写的东西,只是为了思考一下。

#define  COMMA (text==NULL?NULL:",\n")
#define  PUSH(dVal) Push(#dVal,dVal)

class CJSon{
   string text;
public:
   CJSon():text(NULL){}
   CJSon* Push(string key,string value) {text+=COMMA+"\""+key+"\":\""+value+"\""; return &this;}
   CJSon* Push(string key,long value)   {text+=COMMA+"\""+key+"\":"+(string)value; return &this;}
   CJSon* Push(string key,double value) {text+=COMMA+"\""+key+"\":"+(string)value; return &this;}
   string Finish()   {return text="{\n"+text+"\n}";}
};

#undef  COMMA

void OnStart(){
   int a=56;
   double b=0.369;
   string text="Example";
   string json=(CJSon()).PUSH(a).PUSH(b).PUSH(text).Finish();
   Print(json);
 } 
 
Vladimir Simakov:

写在我的膝盖上,只是为了想一想。

谢谢,但它不工作(())。

//+------------------------------------------------------------------+
static string _json;
template<typename T>class CJSon{
#define  COMMA (_json==NULL?NULL:",\n")
#define  PUSH(dVal) Push(#dVal,dVal)
public:
   CJSon() {_json = "";}
   CJSon* Push(string key,string value) {_json+=COMMA+"\""+key+"\":\""+value+"\""; return &this;}
   CJSon* Push(string key,long value)   {_json+=COMMA+"\""+key+"\":"+(string)value; return &this;}
   CJSon* Push(string key,double value) {_json+=COMMA+"\""+key+"\":"+(string)value; return &this;}
   static string Finish()   {return _json="{\n"+_json+"\n}";}
};
//+------------------------------------------------------------------+
class A
{
   public:
   static long a1;
};
long A::a1;
//+------------------------------------------------------------------+
void OnStart()
{
   CJSon<A> a;
   A::a1 = 10;
   
   a.PUSH(A::a1);
   string s = a.Finish() ;
   
   PRINT(s);
}
//+------------------------------------------------------------------+

2020.05.20 23:51:43.932 tst____ (EURUSD,H1) s = {

2020.05.20 23:51:43.932 tst____ (EURUSD,H1)

2020.05.20 23:51:43.932 tst____ (EURUSD,H1) "A::a1":10

2020.05.20 23:51:43.932 tst____ (EURUSD,H1) }

除此之外,它只想与静力学一起工作。

虽然在一个方法中用定义来收集一个字符串并不难,但一般来说,你需要考虑一下

 
Igor Makanu:

这里是问https://www.mql5.com/ru/forum/307970/page10#comment_11652222

否则,好....一些技巧,允许在MQL中打开头文件c_api.h,然后使用TensorFlow文档。

现在你在VS中打开头文件,然后包住调用、模型、内部状态...。...到你的.dll中,然后你可以在MQL中使用它。


总而言之,这很耗费时间

没有允许用MQL编译器编译C++源代码的技巧。

TensorFlow库输出了很多函数。你可能只需要其中的一小部分。

写出你所使用的函数的原型。这不会花很长时间。


 
Vladimir Simakov:

写在我的膝盖上,只是为了想一想。

最后,一些非常有趣的事情。这是一个 "蒸汽火车 "的图案吗?

 
Igor Makanu:

谢谢,但它没有坚持下去(())。

2020.05.20 23:51:43.932 tst____ (EURUSD,H1) s = {

2020.05.20 23:51:43.932 tst____ (EURUSD,H1)

2020.05.20 23:51:43.932 tst____ (EURUSD,H1) "A::a1":10

2020.05.20 23:51:43.932 tst____ (EURUSD,H1) }

除此之外,它只想与静力学一起工作。

虽然用定义在一个方法中收集一个字符串并不难,但你需要考虑一下

不知何故,你的做法是错误的)

#define  COMMA (text==NULL?"{\n":",\n")
#define  VALUE(dVal) Push(#dVal,dVal)
#define  STRUCT(dVal) PushStruct(#dVal,dVal.JSon())

class CJSon{
   string text;
public:
   CJSon():text(NULL){}
   CJSon* Push(string key,string value) {text+=COMMA+"\""+key+"\":\""+value+"\""; return &this;}
   CJSon* PushStruct(string key,string value) {text+=COMMA+"\""+key+"\":"+value; return &this;}
   CJSon* Push(string key,long value)   {text+=COMMA+"\""+key+"\":"+(string)value; return &this;}
   CJSon* Push(string key,double value) {text+=COMMA+"\""+key+"\":"+(string)value; return &this;}
   string Finish()   {return text+="\n}";}
};

#undef  COMMA

class _CTest{
   int a;
   double b;
   string t;
public:
   _CTest(int _a,double _b,string _t):a(_a),b(_b),t(_t){}
   string JSon()  {return (CJSon()).VALUE(a).VALUE(b).VALUE(t).Finish();}
};

class CTest{
   _CTest test;
   int a;
   long b;
public:
   CTest():test(10,0.369,"Hi"),a(555),b(LONG_MIN){}
   string JSon() {return (CJSon()).STRUCT(test).VALUE(a).VALUE(b).Finish();}
};

void OnStart(){
   CTest test;
   Print(test.JSon());
 } 
纠正的PS