Errores, fallos, preguntas - página 2703

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

}

¿No debería haber un error al compilar este código de que la función debería devolver un valor?

 
Alexey Kozitsyn:

¿No debería haber un error al compilar este código de que la función debería devolver un valor?

debería

Lo más probable es que no hayas accedido a este método y que el compilador no haya incluido esta parte del código en el archivo ejecutable

 
Igor Makanu:

debe

Lo más probable es que no hayas accedido a este método y que el compilador no haya incluido este fragmento de código en el archivo ejecutable.

Pero si designo la función Test() en la misma clase y la implemento así:

int CMapManager::Test()
{
        
}

El error se producirá, aunque tampoco he accedido a esta función en ningún sitio.

 
Alexey Kozitsyn:

Pero si designo la función Test() en la misma clase y la implemento así

Se produce un error, aunque tampoco he accedido a esta función en ningún sitio.

porque este método no es una plantilla - no hay ninguna plantilla

una plantilla es esencialmente una macro-sustitución, en la que el compilador inserta los tipos necesarios al detectar las llamadas a funciones(métodos de clase)

esta "sustitución" "generará" funciones con tipos de datos específicos

así es como funciona aproximadamente

 
Igor Makanu:

porque este método no es una plantilla - no hay ninguna plantilla

una plantilla es esencialmente una sustitución de macros, en la que el compilador sustituirá los tipos necesarios al detectar las llamadas a funciones(métodos de clase)

esta "sustitución" "generará" funciones con tipos de datos específicos

así es como funciona aproximadamente

A grandes rasgos, así lo veo yo, gracias. Pero la pregunta es ¿por qué en la etapa "antes de la generación" no se nos informa de que se debe devolver el valor int?

Después de todo, independientemente de las funciones generadas, todas ellas devolverán un valor de tipo int.

 
Alexey Kozitsyn:

A grandes rasgos, así lo veo yo, gracias. Pero, la pregunta es diferente, ¿por qué en la etapa "antes de la generación" no informamos que necesitamos devolver el valor int?

Después de todo, independientemente de las funciones generadas, todas ellas devolverán un valor de tipo int.

Tú y yo hemos ido por la segunda carrera - daremos las mismas respuestas a la misma pregunta )))

no hay llamada - no hay aplicación de patrones, eso es todo - así es como funciona

)))

esboza el guión y pruébalo

así:

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

}

compila así, luego abre tus comentarios - habrá errores

 

Me he perdido algo en alguna parte, en general estoy buscando una trampa en dicho código:

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 confuso que sea tan fácil crear un array bidimensional y la asignación sin la descripción del constructor de copia funciona de forma inmediata

¿qué hay en mi código que no funcione correctamente?

 

¡NO SE PERMITE LA DESCOMPILACIÓN!

 

Por si acaso, ¿hay alguna forma de hacer que la funciónStringToCharArray copie bytes sin conversiones? Probado todos los CP_XXX, ninguno de ellos proporciona copias 1 a 1 en el caso general. He aquí un ejemplo:

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 forma de obtener el byte 0x81 puede ser diferente, aquí se pone "de frente" para simplificar. Si no se utiliza la copia manual byte a byte (como en la línea no mencionada), la función StringToCharArray convierte el byte 129 (0x81) en 63.

Hasta ahora he tenido que reemplazar StringToCharArray con un bucle, pero tal vez hay un secreto CP_XXX?

 
Stanislav Korotky:

Por si acaso, ¿hay alguna forma de hacer que la función StringToCharArray copie bytes sin conversiones? Probado todos los CP_XXX, ninguno de ellos proporciona copias 1 a 1 en el caso general. He aquí un ejemplo:

La forma de obtener el byte 0x81 puede ser diferente, aquí se pone "de frente" para simplificar. Si no se utiliza la copia manual byte a byte (como en la línea no mencionada), la función StringToCharArray convierte el byte 129 (0x81) en 63.

Tuve que reemplazar StringToCharArray con un bucle por ahora, pero tal vez hay un secreto 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