Errori, bug, domande - pagina 2703

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

}

Non dovrebbe esserci un errore durante la compilazione di questo codice che la funzione dovrebbe restituire un valore?

 
Alexey Kozitsyn:

Non dovrebbe esserci un errore durante la compilazione di questo codice che la funzione dovrebbe restituire un valore?

dovrebbe

Molto probabilmente, non hai accesso a questo metodo e il compilatore non ha incluso questa parte di codice nel file eseguibile

 
Igor Makanu:

dovrebbe

Molto probabilmente, non avete avuto accesso a questo metodo e il compilatore non ha incluso questo frammento di codice nel file eseguibile.

Ma se designo la funzione Test() nella stessa classe e la implemento in questo modo:

int CMapManager::Test()
{
        
}

L'errore si verificherà, anche se non ho avuto accesso a questa funzione da nessuna parte.

 
Alexey Kozitsyn:

Ma se designo la funzione Test() nella stessa classe e la implemento in questo modo:

Si verificherà un errore, anche se non ho avuto accesso a questa funzione da nessuna parte.

perché questo metodo non è un modello - non c'è un modello

un template è essenzialmente una sostituzione di macro, in cui il compilatore inserisce i tipi necessari quando rileva le chiamate di funzioni(metodi di classe)

questa "sostituzione" "genererà" funzioni con tipi di dati specifici

Questo è approssimativamente come funziona

 
Igor Makanu:

perché questo metodo non è un modello - non c'è un modello

un template è essenzialmente una sostituzione di macro, in cui il compilatore sostituisce i tipi necessari quando rileva le chiamate a funzioni(metodi di classe)

questa "sostituzione" "genererà" funzioni con tipi di dati specifici

Questo è approssimativamente come funziona

È più o meno come la vedo io, grazie. Ma la domanda è perché nella fase "prima della generazione" non dovremmo informare che il valore int dovrebbe essere restituito?

Dopo tutto, indipendentemente dalle funzioni generate, tutte restituiranno un valore di tipo int.

 
Alexey Kozitsyn:

È più o meno come la vedo io, grazie. Ma la domanda è un'altra, perché nella fase "prima della generazione" non informiamo che abbiamo bisogno di restituire un valore int?

Dopo tutto, indipendentemente dalle funzioni generate, tutte restituiranno un valore di tipo int.

Tu ed io abbiamo fatto la seconda corsa - daremo le stesse risposte alla stessa domanda )))

nessuna chiamata - nessuna applicazione del modello, tutto qui - è così che funziona

)))

abbozzare lo script e provarlo

come questo:

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

}

compila così, poi apri i tuoi commenti - ci saranno errori

 

Ho perso qualcosa da qualche parte, in generale sto cercando una cattura in un codice del genere:

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


è sconcertante che sia così facile creare un array bidimensionale e l'assegnazione senza descrizione del costruttore di copia funziona fuori dalla scatola

cosa nel mio codice potrebbe non funzionare correttamente?

 

NON È CONSENTITA LA DECOMPILAZIONE!

 

Nel caso, c'è un modo per far sì che la funzioneStringToCharArray copi i byte senza conversioni? Provato tutti i CP_XXX, nessuno di loro fornisce copie 1 a 1 nel caso generale. Ecco un esempio:

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

Il modo di ottenere il byte 0x81 può essere diverso, qui è impostato "di testa" per semplicità. Se non usate la copia manuale byte per byte (come nella linea non menzionata), la funzione StringToCharArray converte il byte 129 (0x81) in 63.

Finora ho dovuto sostituire StringToCharArray con un ciclo, ma forse c'è un CP_XXX segreto?

 
Stanislav Korotky:

Nel caso, c'è un modo per far sì che la funzione StringToCharArray copi i byte senza conversioni? Provato tutti i CP_XXX, nessuno di loro fornisce copie 1 a 1 nel caso generale. Ecco un esempio:

Il modo di ottenere il byte 0x81 può essere diverso, qui è impostato "di testa" per semplicità. Se non usate la copia manuale byte per byte (come nella linea non menzionata), la funzione StringToCharArray converte il byte 129 (0x81) in 63.

Ho dovuto sostituire StringToCharArray con un ciclo per ora, ma forse c'è un CP_XXX segreto?

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

Motivazione: