错误、漏洞、问题 - 页 2703

 
template <typename T>
int CMapManager::IncreaseArraySize( T &array[] )
{

}

在编译这段代码时,不是应该有一个错误,即该函数应该返回一个值吗?

 
Alexey Kozitsyn:

在编译这段代码时,不是应该有一个错误,即该函数应该返回一个值吗?

它应该

最有可能的是,你没有访问这个方法,而编译器也没有在可执行文件中包含这部分代码

 
Igor Makanu:

最有可能的是,你没有访问过这个方法,而且编译器也没有将这个代码片段纳入可执行文件。

但如果我把Test()函数指定在同一个类中并以这种方式实现它。

int CMapManager::Test()
{
        
}

会出现错误,尽管我也没有在任何地方访问过这个功能。

 
Alexey Kozitsyn:

但如果我在同一个类中指定Test()函数并这样实现它。

会出现错误,尽管我也没有在任何地方访问这个函数。

因为这个方法不是一个模板--没有模板

模板本质上是一种宏替换,在检测函数(类方法)的调用时,编译器插入必要的类型。

这种 "替换 "将 "生成 "具有特定数据类型的函数

这大约是它的运作方式

 
Igor Makanu:

因为这个方法不是一个模板--没有模板

模板本质上是一种宏替换,在检测函数(类方法)调用时,编译器将替换必要的类型。

这种 "替换 "将 "生成 "具有特定数据类型的函数

这大约是它的运作方式

我大致上是这么看的,谢谢你。但问题是,为什么在 "生成前 "阶段,我们不应该告知应该返回int值?

毕竟,无论生成什么样的函数,它们都将返回一个int类型的值。

 
Alexey Kozitsyn:

我大致上是这么看的,谢谢你。但是,问题是不同的,为什么在 "生成前 "阶段,我们不告知我们需要返回int值?

毕竟,无论生成什么样的函数,都会返回一个int类型的值。

你和我都去参加了第二次竞选--我们将对同一个问题给出同样的答案 )))

没有呼叫 - 没有模式应用,就是这样 - 这就是它的工作方式

)))

勾勒出脚本并进行尝试

像这样。

template <typename T>
T add(T a, T b)
{
  // return(a+b);
}
//+------------------------------------------------------------------+
void OnStart()
{
   Print("start");
  // Print(add(1.0 , 2.0));

}

它是这样编译的,然后打开你的评论--会有错误。

 

我在什么地方漏掉了什么,总的来说,我在寻找这样一个代码中的陷阱。

struct SMatrix
{
   SMatrix(){}
   SMatrix(int rows,int cols){ ArrayResize(this.ROW,rows); for(int i=0;i<rows; i++) ArrayResize(this.ROW[i].COL,cols); }
   struct SRow{float COL[];};
   SRow ROW[];
};

//+------------------------------------------------------------------+
void OnStart()
{
   SMatrix matrixA(10,2);
   int count = 0;
   for(int i = 0;i<10;i++)
   {
      for(int j=0;j<2;j++) matrixA.ROW[i].COL[j] = (float)count++; 
   }
   
   SMatrix matrixB = matrixA;
   for(int i=0;i<10;i++)
   {
      ArrayPrint(matrixB.ROW[i].COL);
   }
}

2020.04.12 01:40:16.652 tst (EURUSD,H1) 0.00000 1.00000

2020.04.12 01:40:16.652 tst (EURUSD,H1) 2.00000 3.00000

2020.04.12 01:40:16.652 tst (EURUSD,H1) 4.00000 5.00000

2020.04.12 01:40:16.652 tst (EURUSD,H1) 6.00000 7.00000

2020.04.12 01:40:16.652 tst (EURUSD,H1) 8.00000 9.00000

2020.04.12 01:40:16.652 tst (EURUSD,H1) 10.00000 11.00000

2020.04.12 01:40:16.652 tst (EURUSD,H1) 12.00000 13.00000

2020.04.12 01:40:16.652 tst (EURUSD,H1) 14.00000 15.00000

2020.04.12 01:40:16.652 tst (EURUSD,H1) 16.00000 17.00000

2020.04.12 01:40:16.652 tst (EURUSD,H1) 18.00000 19.00000


创建一个二维数组很容易,而且没有复制构造函数描述的赋值可以开箱即用,这很令人困惑

我的代码中哪些地方可能无法正常工作?

 

不允许反编译!

 

以防万一,有没有办法使StringToCharArray 函数不经转换而复制字节?试过所有的CP_XXX,在一般情况下都不能提供1对1的副本。这里有一个例子。

void OnStart()
{
  uchar buffer[];
  string data = " test";
  StringSetCharacter(data, 0, 0x81); // just an example, can be obtained in other ways
  StringToCharArray(data, buffer);
  // buffer[0] = (uchar)data[0];     // correct/direct copy
  ArrayPrint(buffer);
}

获得0x81字节的方式可以不同,这里为了简单起见,设置为 "正面"。如果你不使用手动逐个字节的复制(如未提及的那一行),StringToCharArray函数将129字节(0x81)转换为63字节。

到目前为止,我不得不用一个循环来代替StringToCharArray,但也许有一个秘密的CP_XXX?

 
Stanislav Korotky:

以防万一,有没有办法使StringToCharArray函数不经转换而复制字节? 试过所有的CP_XXX,在一般情况下都不能提供1对1的副本。这里有一个例子。

获得0x81字节的方式可以不同,这里为了简单起见,设置为 "正面"。如果你不使用手动逐个字节的复制(如未提及的那一行),StringToCharArray函数将129字节(0x81)转换为63字节。

我不得不暂时用一个循环来代替StringToCharArray,但也许有一个秘密的CP_XXX?

void OnStart()
{
   uchar buffer[];
   string data = CharToString(0x81) + " test";
   StringToCharArray(data, buffer,0,StringLen(data));
   ArrayPrint(buffer);
}

2020.04.12 15:57:37.812 tst1 (EURUSD,H1) 129 32 116 101 115 116