新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 936

 
Igor Makanu:

再次强调:你没有得到一个编译错误 并不意味着你的模板类被包含了 - CData类对象在哪里?- 我看到了一个模板声明,但这样一个变量在哪里?- 对象?

如果你 "非常需要 "解决这个问题,那就编写完全可重复的代码--完全没有.....,由你决定,而且我不明白使用宏替换的逻辑。

也许这就是问题的关键,我很少使用宏,至少如果我使用宏,我明白它最终的结果是什么,在你的例子中,它对我来说是个谜。

是的,你是对的,该对象没有被创建,所以我检查了一下

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

#define  templ(T)          template<typename T>// задача данного макроса определять int bool double и т.д


#define  Vosmas(a,b,c,d,e) /*return*/(Fun(a,b,c,d,e))//a- массив, 
                                                    //b- номер строки если нужен
                                                    //c,d- номера измерений если нужны и массив многомерный

int Mas[2],Mas2[2][2],Mas3[2][2][2];

int OnInit()
{int Perem=0;
 Perem=Vosmas(Mas,0,0,0,3);
 Print("Vosmas: ",Perem);//результат 3
return(INIT_SUCCEEDED);}

class CData{
public:CData(){};~CData(){};

       int Total(int &mas[]    ,int y1=0){return(mas[y1]);}  
       int Total(int &mas[][]  ,int y1=0/*,int y=0*/){return(mas[y1][0]);}
       int Total(int &mas[][][],int y1=0/*,int y=0,int u=0*/){return(mas[y1][0][0]);}};
       
         
templ(T) T Fun(T &a[],int b,int c,int d,int e){a[b]=e; return (a[b]);}

我不明白为什么我需要这样一种编程语言,如果我甚至不能重载它们,我为什么需要这样的类,所有的东西都是死的和静态的。

 
我如何给mql4的开发者写一封信,如何看到编译器的代码,我可以给它增加更多的功能,使它不那么静态?
 
Seric29:

是的,你是对的,该对象没有被创建,我就是这样检查的。

结果,重载是不可能的,这是一个减分项,那么我为什么需要这样一种编程语言,如果我连重载都不能,那么我为什么需要这样的类,一切都是死的,静态的?

真的吗?

你不知道。

那么人们是如何写出复杂的东西的呢?这是无法理解的......

 
Seric29:

宏的任务是调用类中的函数,并将值传递给这个函数,由于宏可以接受任何维度的数组,所以我想做这样一个方案。当然有很多石头,但我需要从类中调用函数,我不知道如何从类中调用一个简单的函数(在我的例子中,方法Total没有描述)不是写在Help中,有复杂的例子与转移有关。

下面是一个例子,一个宏需要一个任意维度的数组,开发者削减了这些功能,对复杂的元素进行正常工作,这是很糟糕的。

你可以不用模板,但有模板会更好。

我不想这样,但我打开了终端,这是你的例子。

#property strict
#property  show_inputs
//+------------------------------------------------------------------+
//#define templ(T)          template<typename T>// задача данного макроса определять int bool double и т.д

#define  Vosmas(a,b,c,d,e)  5
int Mas[2],Mas2[2][2],Mas3[2][2][2];//объявил массивы которые будут хранить информацию// обработка с помощью классов должна быть любого типа templ(T)
//+------------------------------------------------------------------+
void OnStart()
  {
   int Perem=0;
   Perem=Vosmas(Mas,0,0,0,0);
   Print("Vosmas: ",Perem);
   Perem=Vosmas(Mas2,0,0,0,0);
   Print("Vosmas: ",Perem);
   Perem=Vosmas(Mas3,0,0,0,0);
   Print("Vosmas: ",Perem);//во всех случаях результат 5
  }
//+------------------------------------------------------------------+

我注释了宏替换,代码可以编译,那么它就不工作了吗? 我问了三次,为什么一个模板不被使用,为什么一个宏替换只是重复了一个语言关键词?

我不仅不明白需要什么,而且也不明白该如何处理部分不能编译的代码。

HH:如果你想用这个模板或宏来制作一个多维数组--我认为是行不通的,通过论坛搜索找到一个现成的解决方案,并使用

ZS:我肯定会放弃,这对我来说不是一个问题。

 
Seric29:
我如何给mql4的开发者写一封信,如何看到编译器的代码,我可以给它增加更多的功能,使它不那么静态?

在把裤子套在头上的情况下就不行了 :)

 
Artyom Trishkin:

真的吗?

你不知道。

那么人们是如何写出复杂的东西的呢?这是无法理解的...

好吧,如果内存访问被拒绝与动态函数一起工作,你能在这里写得多复杂,甚至连重载都不可能,所以你必须多写1000行代码来完成你的程序,启动额外的循环和变量,因此程序的性能为0。

 
Seric29:

好吧,如果内存访问被拒绝,你不能使用动态函数,甚至连重载都不可能,那么你必须多写1000行代码来完成你的程序,启动额外的循环和变量,所以程序性能为0,这有什么难写的。

嗯,如果程序结构最初是死的,是的,没有办法。

该程序写在最后。首先,对计划结构采取周到的方法。

说实话,我不明白你为什么要为一些以不同方式完成的事情奋斗几个月,而且是在5分钟内。我真的不明白...

 
Igor Makanu:

我不想这样做,但我打开了我的终端,这是你的例子。

我注释了这个宏替换,代码可以编译,那么它就不能工作了吗? 我问了三次,为什么不使用的模式,为什么只是重复语言关键词的宏替换?

我不仅不明白需要什么,而且也不明白该如何处理部分不能编译的代码。

HH:如果你想用这个模板或宏来制作一个多维数组--我认为是行不通的,通过论坛搜索找到一个现成的解决方案,并使用

ZS:我肯定会放弃,这对我来说不是一个问题。

这里我举了一个例子,Vosmas 宏接受任何数组。数组的唯一解决方案是使用相同维度的数组,我不是在说各种指针和引用以及在C++中工作的动态函数,甚至在C++中输出一个函数的问题,指定类型和其他东西都是太静态的语言,你不能在这里写出真正酷的东西。

 
Seric29:

这里我举了一个例子,Vosmas 宏接受任何数组。数组的唯一解决方案是使用相同维度的数组,我不是在说各种指针和引用以及在C++中工作的动态函数,还有在C++中派生函数指定类型和其他废话的问题,总之太静态的语言和所有,你无法在这里写出真正酷的东西。

开始阅读C++基础知识,MQL有最小的差异!

ZS: 恭喜你,你写了一个万能的宏,可以做任何事情,数组是它最容易 "处理 "的东西,例子可以复制。

#property strict
#define  Vosmas(a,b,c,d,e)  5
int Mas[2],Mas2[2][2],Mas3[2][2][2];//объявил массивы которые будут хранить информацию// обработка с помощью классов должна быть любого типа templ(T)
//+------------------------------------------------------------------+
void OnStart()
  {
   int Perem=0;
   Perem=Vosmas(Mas,0,0,0,0);
   Print("Vosmas: ",Perem);
   Perem=Vosmas(Mas2,0,0,0,0);
   Print("Vosmas: ",Perem);
   Perem=Vosmas(Mas3,0,0,0,0);
   Print("Vosmas: ",Perem);//во всех случаях результат 5
   
   class CA{public: int a;} A;
   class CB{public: int b;} B;
   class CC{public: int c;} C;
   class CD{public: int d;} D;
   class CE{public: int e;} E;
   Perem=Vosmas(A,B,C,D,E);     Print("Vosmas: ",Perem);//во всех случаях результат 5
   Perem=Vosmas("УРА","Я","УЧУ","MQL","4");     Print("Vosmas: ",Perem);//во всех случаях результат 5
  }
//+------------------------------------------------------------------+
 
Igor Makanu:

开始阅读C++基础知识,MQL的差别很小

ZS: 恭喜你,你写了一个万能的宏,可以做任何事情,数组是它最容易 "处理 "的东西,例子可以参考。

好吧,我想通过将一个数组传入一个宏,并在宏中调用一个可重载的函数并返回结果来掌握这个问题,似乎是一个原始的任务,但是当你在宏中调用一个可重载的函数时,它会抛出一个警告,即函数3原来在宏中你需要写一个标准来确定调用哪个可重载的函数,这里你又得问如何做这个检查,一般来说这个想法会失败。

原因: