エラー、バグ、質問 - ページ 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型の値を返すことになる。

あなたと私は2本目に行きました。同じ質問には同じ答えを出す ))

no call - nopattern application, that's it - that's how it works

)))

スクリプトをスケッチし、試してみる

このように

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


2次元の配列が簡単に作れて、コピーコンストラクタの記述がなくても代入がすぐにできるのは困りものです。

私のコードのどこが正しく動作していないのでしょうか?

 

デコンパイル禁止

 

念のため、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