Erreurs, bugs, questions - page 2703

 
Alexey Kozitsyn:

Ne devrait-il pas y avoir une erreur lors de la compilation de ce code indiquant que la fonction devrait retourner une valeur ?

il devrait

Il est fort probable que vous n'ayez pas accédé à cette méthode et que le compilateur n'ait pas inclus cette partie du code dans le fichier exécutable.

 
Igor Makanu:

devrait

Il est fort probable que vous n'ayez pas accédé à cette méthode et que le compilateur n'ait pas inclus ce fragment de code dans le fichier exécutable.

Mais si je désigne la fonction Test() dans la même classe et que je l'implémente de cette façon :

int CMapManager::Test()
{
        
}

L'erreur se produira, bien que je n'aie pas non plus accédé à cette fonction nulle part.

 
Alexey Kozitsyn:

Mais si je désigne la fonction Test() dans la même classe et que je l'implémente de cette façon :

Une erreur se produit, même si je n'ai pas accédé à cette fonction nulle part non plus.

parce que cette méthode n'est pas un modèle - il n'y a pas de modèle

un template est essentiellement une substitution de macro, dans laquelle le compilateur insère les types nécessaires lors de la détection des appels de fonctions(méthodes de classe)

Cette "substitution" va "générer" des fonctions avec des types de données spécifiques.

Voici à peu près comment cela fonctionne

 
Igor Makanu:

parce que cette méthode n'est pas un modèle - il n'y a pas de modèle

un modèle est essentiellement une substitution de macro, dans laquelle le compilateur substitue les types nécessaires lors de la détection des appels de fonction(méthode de classe).

Cette "substitution" va "générer" des fonctions avec des types de données spécifiques.

Voici à peu près comment cela fonctionne

C'est à peu près comme ça que je vois les choses, merci. Mais la question est de savoir pourquoi, à l'étape "avant la génération", nous ne devrions pas informer que la valeur int devrait être retournée ?

Après tout, quelles que soient les fonctions générées, elles renverront toutes une valeur de type int.

 
Alexey Kozitsyn:

C'est à peu près comme ça que je vois les choses, merci. Mais, la question est différente, pourquoi à l'étape "avant la génération" nous n'informons pas que nous devons retourner une valeur int ?

Après tout, quelles que soient les fonctions générées, elles renverront toutes une valeur de type int.

Vous et moi avons fait la deuxième manche - nous donnerons les mêmes réponses à la même question ;)))

pas d'appel - pas d'application du modèle, c'est tout - c'est comme ça que ça marche

)))

esquissez le script et essayez-le

comme ça :

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

}

il compile comme ceci, puis ouvrez vos commentaires - il y aura des erreurs

 

J'ai raté quelque chose quelque part, en général, je cherche une prise dans un tel 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


c'est déroutant qu'il soit si facile de créer un tableau à deux dimensions et que l'affectation sans description du constructeur de copie fonctionne dès le départ

Qu'est-ce qui peut ne pas fonctionner correctement dans mon code ?

 

PAS DE DÉCOMPILATION AUTORISÉE !

 

Juste au cas où, y a-t-il un moyen de faire en sorte que la fonctionStringToCharArray copie des octets sans conversion ? J'ai essayé tous les CP_XXX, aucun d'entre eux ne fournit de copies 1 pour 1 dans le cas général. Voici un exemple :

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

La façon d'obtenir l'octet 0x81 peut être différente, ici il est placé "en tête" pour la simplicité. Si vous n'utilisez pas la copie manuelle octet par octet (comme dans la ligne non mentionnée), la fonction StringToCharArray convertit l'octet 129 (0x81) en 63.

Jusqu'à présent, j'ai dû remplacer StringToCharArray par une boucle, mais peut-être existe-t-il un CP_XXX secret ?

 
Stanislav Korotky:

Juste au cas où, y a-t-il un moyen de faire en sorte que la fonction StringToCharArray copie des octets sans conversion ? J'ai essayé tous les CP_XXX, aucun d'entre eux ne fournit de copies 1 pour 1 dans le cas général. Voici un exemple :

La façon d'obtenir l'octet 0x81 peut être différente, ici il est placé "en tête" pour la simplicité. Si vous n'utilisez pas la copie manuelle octet par octet (comme dans la ligne non mentionnée), la fonction StringToCharArray convertit l'octet 129 (0x81) en 63.

J'ai dû remplacer StringToCharArray par une boucle pour le moment, mais peut-être y a-t-il un CP_XXX secret ?

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

 
Сергей Таболин:

perte éventuelle de données due à la conversion de type

Des idées ?

Oui. La décompilation est interdite !