Errori, bug, domande - pagina 2132

 
fxsaber:

Quando l'autore è un moderatore part-time.

Piuttosto, un moderatore e codificatore part-time.

 
fxsaber:
È giusto che l'autore di EAs alla KB rimuova i commenti di terzi nella relativa discussione che evidenziano errori nel suo codice?

No, naturalmente.

 
fxsaber:
È giusto che l'autore di EAs alla KB cancelli i commenti di terzi nella relativa discussione che evidenziano errori nel suo codice?
No, certo che no. Tali commenti contribuiscono a correggere questi errori. Metterli a tacere o schiacciarli rende il KB un cattivo manuale.
 

Non capisco, che senso aveva fare il contrario in MQL?

C++ VS2017
MQL
printf( "%s", ... )
printf( "%S", ... )
printf( "%S", ... )
printf( "%s", ... )
printf( "%c", ... )
printf( "%C", ... )
printf( "%C", ... )
printf( "%c", ... )
infatti MQL::printf corrisponde a CPP::wprintf, sebbene non ci sia un analogo di CPP::printf in MQL
 
A100:

Non capisco, che senso aveva fare il contrario in MQL?

C++ VS2017
MQL
printf( "%s", ... )
printf( "%S", ... )
printf( "%S", ... )
printf( "%s", ... )
printf( "%c", ... )
printf( "%C", ... )
printf( "%C", ... )
printf( "%c", ... )
in realtà MQL::printf corrisponde a CPP::wprintf, sebbene non ci sia un analogo di CPP::printf in MQL
MQL5 è tutto unicode, quindi abbiamo completamente abbandonato le stringhe a singolo byte.
 
Renat Fatkhullin:
MQL5 è tutto unicode, quindi abbiamo completamente abbandonato le stringhe a singolo byte.

Non ci credo completamente! Tutto funziona.

void OnStart()
{
        uchar ch[] = { 0x41,0x6E,0x73,0x69,0x20,0x69,0x73,0x20,0x61,0x6C,0x69,0x76,0x65,0x21 };
        string ansi;
        for ( int i = 0, j = 0; i < ArraySize( ch ); i+=2, j++ )
                StringSetCharacter( ansi, j, ch[ i ] | ch[ i + 1 ] << 8 );
        printf( "%S", ansi );
}

Risultato: Ansi è vivo!

 
A100:

Non ci credo completamente! Tutto funziona.

Risultato: Ansi è vivo!

Impacchettare il binario in unicode e poi avere il rischio di esplodere su una chiamata tramite una funzione di sistema non è saggio.

Probabilmente filtrerà tali tentativi più tardi.

 
Renat Fatkhullin:

È irragionevole avere il rischio di esplodere su una chiamata di funzione di sistema.

Non esagerare perché la stringa è garantita per finire con zero. E inoltre, i caratteri a singolo byte insieme a quelli multibyte sono in realtà parte di Unicode e in MQL funziona tutto bene, il che rende possibile l'output in Experts tab con un font normale (e non con quell'orribile monospaziato).

Questo è come proibire la chiamata dalla funzione dll con argomento uchar[], temendo che l'utente lo riempia in modo errato (per esempio, non finirà con zero), mentre molte funzioni di sistema richiedono esattamente uchar[] e non ushort[] (che incidentalmente può anche essere riempito in modo errato)

 

La 2a linea è l'output in carattere umano (non monospaziale). Come potete vedere, è tecnicamente facile lasciare il font monospace solo per ::ArrayPrint()

 

Salve. Per favore, aiutatemi a trovare la causa di questo errore. Sto cercando di convertire un indicatore da mql4 a mql5. Sto usando la seguente "shell" per le funzioni di iHigh:

double iHigh(string symbol,ENUM_TIMEFRAMES tf,int index)
  {
   if(index < 0) return(-1);
   double Arr[1];
   if(CopyHigh(symbol,tf,index,1,Arr)>0)
      return(Arr[0]);
   else
     {
      Print(__FUNCTION__,GetLastError());
      return(-1);
     }
  }

Come risultato, ottengo l'errore 4301: "simbolo sconosciuto", anche se una stringa restituita dalla funzione Symbol() viene passata come parametro del simbolo. Ecco un pezzo di codice della funzione che chiama iHigh

ENUM_TIMEFRAMES tf=Period();
   string symbol = Symbol();
   if(filtr1==false) 
      return(true);  
   int i1,i2=0; 
   for(i1=i+1; i2<6; i1++)
     {
      
      if(iLow(symbol,tf,i1)<=iLow(symbol,tf,i1+1) && 
         iHigh(symbol,tf,i1)>=iHigh(symbol,tf,i1+1)) 
        {
         break; //выход из цикла
        }
      else
        {
         i2++;
        }
     }