Erros, bugs, perguntas - página 2703

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

}

Não deveria haver um erro na compilação deste código que a função deveria devolver um valor?

 
Alexey Kozitsyn:

Não deveria haver um erro na compilação deste código que a função deveria devolver um valor?

deve

Muito provavelmente, não teve acesso a este método e o compilador não incluiu esta parte do código no ficheiro executável

 
Igor Makanu:

deve

Muito provavelmente, não acedeu a este método e o compilador não incluiu este fragmento de código no ficheiro executável.

Mas se eu designar a função Teste() na mesma classe e a implementar dessa forma:

int CMapManager::Test()
{
        
}

O erro irá ocorrer, embora eu também não tenha acedido a esta função em nenhum lugar.

 
Alexey Kozitsyn:

Mas se eu designar a função Test() na mesma classe e a implementar desta forma:

Ocorrerá um erro, mesmo que eu também não tenha acedido a esta função em lado nenhum.

porque este método não é um modelo - não há modelo

um modelo é essencialmente uma substituição macro, em que o compilador insere os tipos necessários ao detectar chamadas de funções(métodos de classe)

esta "substituição" irá "gerar" funções com tipos de dados específicos

isto é aproximadamente como funciona

 
Igor Makanu:

porque este método não é um modelo - não há modelo

um modelo é essencialmente uma substituição macro, em que o compilador substituirá os tipos necessários ao detectar chamadas de função(método de classe)

esta "substituição" irá "gerar" funções com tipos de dados específicos

isto é aproximadamente como funciona

É mais ou menos assim que eu vejo as coisas, obrigado. Mas a questão é porque é que na fase "antes da geração" não devemos informar que o valor int deve ser devolvido?

Afinal de contas, independentemente das funções geradas, todas elas devolverão um valor do tipo int.

 
Alexey Kozitsyn:

É mais ou menos assim que eu vejo as coisas, obrigado. Mas, a questão é diferente, porque é que na fase "antes da geração" não informamos que precisamos de devolver o valor int?

Afinal de contas, independentemente das funções geradas, todas elas devolverão um valor do tipo int.

Você e eu fomos para a segunda corrida - vamos dar as mesmas respostas à mesma pergunta ))))

sem chamada - sem aplicação de padrões, é isso - é assim que funciona

)))

esboçar o guião e experimentá-lo

assim:

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

}

compila desta forma, depois abre os teus comentários - haverá erros

 

Perdi algo algures, em geral estou à procura de um senão num tal 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


é confuso que seja tão fácil criar uma matriz bidimensional e uma atribuição sem a descrição do construtor de cópias funciona fora da caixa

o que no meu código pode não funcionar correctamente?

 

NÃO É PERMITIDA A DESCOMPILAÇÃO!

 

Só por precaução, há alguma forma de fazer a funçãoStringToCharArray copiar bytes sem conversões? Experimentei todos os CP_XXX, nenhum deles fornece 1 para 1 cópias em caso geral. Aqui está um exemplo:

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

A forma de obter 0x81 byte pode ser diferente, aqui está definido "de frente" para simplicidade. Se não utilizar a cópia manual byte-a-byte (como na linha não mencionada), a função StringToCharArray converte o byte 129 (0x81) para 63.

Até agora tive de substituir StringToCharArray por um laço, mas talvez haja um CP_XXX secreto?

 
Stanislav Korotky:

Só por precaução, há alguma forma de fazer a função StringToCharArray copiar bytes sem conversões? Experimentei todos os CP_XXX, nenhum deles fornece 1 para 1 cópias em caso geral. Aqui está um exemplo:

A forma de obter 0x81 byte pode ser diferente, aqui está definido "de frente" para simplicidade. Se não utilizar a cópia manual byte-a-byte (como na linha não mencionada), a função StringToCharArray converte o byte 129 (0x81) para 63.

Por agora tive de substituir StringToCharArray por um laço, mas talvez haja um CP_XXX secreto?

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