Errori, bug, domande - pagina 2722

 
A100:

In linea di principio, non ci dovrebbe essere un caso del genere - il problema dovrebbe essere stato risolto a livello di compilatore (come in C++). E in questo caso è abbastanza possibile ed è per questo che la discussione dura diverse pagine

Sicuramente un bug... Ma deve essere così! )))

Imho, le espressioni costanti devono essere conosciute al momento della compilazione e le espressioni statiche devono essere conosciute durante l'inizializzazione dell'applicazione nella sequenza di descrizione.

e questo schema in MQL, dove c'è una specie di controllo costante, ma posso assegnare una costante io stesso a runtime, e posso usare una chiamata di funzione come inizializzazione:

struct A
{
   const double a;
   A():a(AccountInfoDouble(ACCOUNT_BALANCE))
   {
      Print("a = ", a); // a = 9999.290000000001
   }
};
//+------------------------------------------------------------------+
void OnStart()
{
   A a1;
}
//+------------------------------------------------------------------+

e questa "costante" può essere in visibilità locale.... a che punto diventa un'espressione costante e come aiuta.... Non lo so, non lo capisco senza manuali, non c'è descrizione del modello di memoria - non ha senso, beh, al massimo, usare come dovrebbe essere - inizializzare con costante in tutti i costruttori, poi il compilatore aiuterà l'avviso se si decide accidentalmente di modificare questo campo in futuro

 
Igor Makanu:
Ma questo schema in MQL, dove c'è una sorta di controllo sulle costanti, ma posso assegnare le costanti in modo casuale io stesso

Quante volte ci si può vergognare di ignorare le basi del C++?

 

questo esempio non è affatto confuso:

struct A
{
   const double a;
   A():a(SymbolInfoDouble(_Symbol,SYMBOL_ASK))
   {
      Print("a = ", a);
   }
};
void OnTick()
  {
   const A a;
  }
//+------------------------------------------------------------------+

2020.04.23 21:40:04.474 tst (EURUSD,H1) a = 1,07892

2020.04.23 21:40:04.546 tst (EURUSD,H1) a = 1,07893

2020.04.23 21:40:04.585 tst (EURUSD,H1) a = 1,07893

2020.04.23 21:40:05.254 tst (EURUSD,H1) a = 1,07893

2020.04.23 21:40:05.305 tst (EURUSD,H1) a = 1,07893

2020.04.23 21:40:05.306 tst (EURUSD,H1) a = 1,07892

 
Stanislav Korotky :

Ci sono due programmi che lavorano sullo stesso file allo stesso tempo. Quello che scrive usa i flag FILE_READ|FILE_WRITE|FILE_BIN|FILE_SHARE_READ. Quello che legge - FILE_READ|FILE_BIN|FILE_SHARE_WRITE|FILE_SHARE_READ. Anche se il primo programma salva periodicamente il file con FileFlush, il secondo programma vede solo la lunghezza del file quando viene aperto. Ho provato a fare FileSeek avanti e indietro - non aiuta.

Domanda: come faccio a far sì che il programma che legge il file raccolga i dati che vengono riscritti?

Questo sembra essere un bug, è stato segnalato qualche tempo fa sul forum inglese. Non ho avuto il tempo di segnalarlo qui.

Gli sviluppatori non leggono il forum inglese?

 
Stanislav Korotky:

Ci sono due programmi che lavorano sullo stesso file allo stesso tempo. Quello che scrive usa i flagFILE_READ|FILE_WRITE|FILE_BIN|FILE_SHARE_READ. Quello che legge - FILE_READ|FILE_BIN|FILE_SHARE_WRITE|FILE_SHARE_READ. Anche se il primo programma salva periodicamente il file usando FileFlush, il secondo programma vede solo la lunghezza del file quando viene aperto. Ho provato a fare FileSeek avanti e indietro - non aiuta.

Domanda: come faccio a far sì che il programma che legge il file raccolga i dati da sovrascrivere?

I due programmi sono nello stesso terminale o in due diversi?

 

I metodi di un oggetto da una matrice di oggetti passata per riferimento non funzionano.

Esempio:

//+------------------------------------------------------------------+
//| Пример: добавленный метод для расширения файла ..\Include\String\String.mqh
//|--
//| Получает из указанной строки подстроки по заданному разделителю 
//| и возвращает количество полученных объектов-подстрок
//|         НЕ РАБОТАЕТ !!!!!!!!!!
//+------------------------------------------------------------------+
int CString::Split(const string separator,      // разделитель
                   CString      &result[] )     // массив строковых объектов
  {
   string tmp_result[];               

   if(StringLen(separator)==0) return(0);

   ushort u_sep=StringGetCharacter(separator,0); 
   
   int count=StringSplit(m_string,u_sep,tmp_result);

   // временно для проверки
   result[0].Assign("Buy"); // НЕ РАБОТАЕТ !!!!!!
   Alert("ressult[0] = ",result[0].Str()); // <--- уже не отрабатывает
   // конец временно
   
   /*
   for(int i=0;i<count;i++)
     {
      result[i].Assign(tmp_result[i]); // НЕ РАБОТАЕТ !!!!!
     };
   */
   
   return(count);
  }
//+------------------------------------------------------------------+
 
Slava:

Questi due programmi sono nello stesso terminale o in due diversi?

In un terminale. L'esperto scrive i dati, l'indicatore legge i dati. Appesi a grafici diversi, ma ovviamente potrebbero essere sullo stesso (se questo conta). Costruire 2380.

 

VS2019

#include <iostream>

int x;

struct A 
{
    const int a;
    A() :a(x) {}
};
int main()
{
    std::cout << "x = ";
    std::cin >> x;
    const A a;
    std::cout << "a.a = " << a.a;
}

x = 12345

a.a = 12345

hmm, tutto funziona come in MQL5

Ok, mi rimangio tutto, non si compila in Sharp

 
Vict:

Avete anche un costruttore. Dipende da voi, naturalmente, ma le strutture sono entità C, il modello lì è diverso - entità passive con logica esterna (funzioni).

Non necessariamente. Perché C? E C#? - Tutti i discorsi sulle strutture passive sono nozioni arcaiche, imho. Credo che almeno ogni tipo debba avere un costruttore. I campi non inizializzati sono un male che deve essere evitato.

Nel tuo caso, devi fare un metodo factory per creare un array di strutture, cioè qualcosa come questo:

struct A
{
  const int a;
  A(int init_value) : a(init_value) { }

  static bool CreateArray(A &array[], int count, int init_value)
  {
    //...
  }
};

E c'è già uno dei modi suggeriti in precedenza per riempire gli elementi dell'array.

 

Mi sono imbattuto nel seguente problema. L'indicatore disegna le candele

È tracciato sul grafico. C'è anche un Expert Advisor che legge i buffer dell'indicatore

Così mi sono collegato e ho scremato le fasi e ho scoperto che l'indicatore spesso disegna le candele con un ritardo.

Significa che diversi tick fa (fino a un paio di minuti esatti) ha già calcolato e aggiornato i buffer e l'Expert Advisor sta leggendo i dati da essi

(sia i gufi che l'indicatore lo scrivono nel registro). Ma vediamo la vecchia immagine sul grafico. Per esempio, questo screenshot è fatto nel momento in cui la barra rossa ha rotto il minimo della precedente. Ma sul grafico vediamo solo il rosso precedente e il verde sotto disegnato (è infatti più grande di due barre).


Ed ecco l'immagine reale, è stata disegnata dopo. Vediamo la ripartizione, ha iniziato la cattura dello screenshot. Secondo i registri tutto è chiaro.



Chi mi dice qual è il problema e come accelerare l'aggiornamento del grafico? Chiamo la funzioneChartRedraw dall'EA ma ha ancora un paio di minuti di ritardo.

Due minuti sono un po' troppi, non riesco nemmeno a immaginare il motivo. I calcoli non sono così cosmici da rallentare così tanto.