Fehler, Irrtümer, Fragen - Seite 2703

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

}

Sollte beim Kompilieren dieses Codes nicht ein Fehler auftreten, dass die Funktion einen Wert zurückgeben sollte?

 
Alexey Kozitsyn:

Sollte beim Kompilieren dieses Codes nicht ein Fehler auftreten, dass die Funktion einen Wert zurückgeben sollte?

sollte es

Wahrscheinlich haben Sie nicht auf diese Methode zugegriffen und der Compiler hat diesen Teil des Codes nicht in die ausführbare Datei aufgenommen

 
Igor Makanu:

sollte

Höchstwahrscheinlich haben Sie nicht auf diese Methode zugegriffen und der Compiler hat dieses Codefragment nicht in die ausführbare Datei aufgenommen.

Aber wenn ich die Funktion Test() in derselben Klasse benenne und sie auf diese Weise implementiere:

int CMapManager::Test()
{
        
}

Der Fehler tritt auf, obwohl ich auch auf diese Funktion nirgends zugegriffen habe.

 
Alexey Kozitsyn:

Aber wenn ich Test()-Funktion in der gleichen Klasse benennen und implementieren es auf diese Weise:

Es tritt ein Fehler auf, obwohl ich nirgendwo auf diese Funktion zugegriffen habe.

weil diese Methode keine Vorlage ist - es gibt keine Vorlage

eine Schablone ist im Wesentlichen eine Makro-Substitution, in die der Compiler bei der Erkennung von Aufrufen von Funktionen(Klassenmethoden) die erforderlichen Typen einfügt

diese "Ersetzung" wird Funktionen mit bestimmten Datentypen "erzeugen"

So funktioniert es ungefähr

 
Igor Makanu:

weil diese Methode keine Vorlage ist - es gibt keine Vorlage

eine Schablone ist im Wesentlichen eine Makro-Substitution, bei der der Compiler die erforderlichen Typen ersetzt, wenn er Funktionsaufrufe(Klassenmethoden) erkennt

diese "Ersetzung" wird Funktionen mit bestimmten Datentypen "erzeugen"

So funktioniert es ungefähr

So ungefähr sehe ich das auch, danke. Aber die Frage ist, warum wir in der Phase "vor der Generierung" nicht mitteilen sollten, dass der Wert int zurückgegeben werden soll?

Denn unabhängig von den erzeugten Funktionen geben alle einen Wert vom Typ int zurück.

 
Alexey Kozitsyn:

So ungefähr sehe ich das auch, danke. Die Frage ist jedoch eine andere: Warum teilen wir in der Phase "vor der Generierung" nicht mit, dass wir den Wert int zurückgeben müssen?

Denn unabhängig von den generierten Funktionen geben alle einen Wert vom Typ int zurück.

Sie und ich haben den zweiten Durchlauf gemacht - wir werden die gleichen Antworten auf die gleiche Frage geben )))

kein Anruf - keine Musteranwendung, das ist alles - so funktioniert es

)))

Skizzieren Sie das Skript und probieren Sie es aus

wie diese:

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

}

es kompiliert so, dann öffnen Sie Ihre Kommentare - es wird Fehler geben

 

Ich habe irgendwo etwas übersehen, im Allgemeinen suche ich nach einem Haken in einem solchen Code:

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


Es ist verwirrend, dass es so einfach ist, ein zweidimensionales Array zu erstellen, und dass die Zuweisung ohne Kopierkonstruktorbeschreibung sofort funktioniert.

Was in meinem Code könnte nicht richtig funktionieren?

 

KEINE DEKOMPILIERUNG ERLAUBT!

 

Nur für den Fall, gibt es eine Möglichkeit, dieStringToCharArray-Funktion kopieren Bytes ohne Konvertierungen zu machen? Ich habe alle CP_XXX ausprobiert, keiner von ihnen bietet im Allgemeinen 1:1-Kopien an. Hier ist ein Beispiel:

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);
}

Der Weg zum 0x81-Byte kann unterschiedlich sein, hier ist er der Einfachheit halber "frontal" gesetzt. Wenn Sie nicht das manuelle byteweise Kopieren verwenden (wie in der nicht erwähnten Zeile), wandelt die Funktion StringToCharArray Byte 129 (0x81) in 63 um.

Bisher hatte ich StringToCharArray mit einer Schleife zu ersetzen, aber vielleicht gibt es ein Geheimnis CP_XXX?

 
Stanislav Korotky:

Nur für den Fall, gibt es eine Möglichkeit, die StringToCharArray-Funktion kopieren Bytes ohne Konvertierungen zu machen? Ich habe alle CP_XXX ausprobiert, keiner von ihnen bietet im Allgemeinen 1:1-Kopien an. Hier ist ein Beispiel:

Der Weg zum 0x81-Byte kann unterschiedlich sein, hier ist er der Einfachheit halber "frontal" gesetzt. Wenn Sie nicht das manuelle byteweise Kopieren verwenden (wie in der nicht erwähnten Zeile), wandelt die Funktion StringToCharArray Byte 129 (0x81) in 63 um.

Ich musste StringToCharArray mit einer Schleife für jetzt zu ersetzen, aber vielleicht gibt es ein Geheimnis 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

Grund der Beschwerde: