Errori, bug, domande - pagina 2564

 
Igor Makanu:

?

è una situazione strana, tutto al di fuori della classe ha funzionato per molto tempo con gli staichiq. e io sto solo facendo un gran casino per questo.... Solo per divertimento, riproducete voi stessi il codice:

Vedete un'istanza dell'oggetto? ed esiste in MQL ;)

SZZ: Ed esiste a livello di aiuto... qual è il tuo problema con me?

https://www.mql5.com/ru/docs/basis/oop/staticmembers

pr


imp

 
Andrey Barinov:

Tutte le stesse regole si applicano alle statiche (private, protected, public), solo che non richiedono la creazione di un oggetto.

Non in generale: per esempio, uno statik pubblico non può essere limitato in una classe derivata

 
Andrey Barinov:



hmmm... Come spiegare l'assurdità della situazione... Ti ho suggerito di leggere i post degli amministratori (sviluppatori), ti ho mostrato l'aiuto che hanno scritto, cosa vuoi da me con le tue foto?

Non penso perché sia così, leggo il forum e l'aiuto, e faccio come raccomandato dagli sviluppatori. Se pensate che sia necessario, scrivete al "comitato per la protezione degli standard C++", all'ONU... Beh, almeno l'amministratore nel PM, se debole, ma poi bloccare i messaggi degli sviluppatori e ottenere il vostro modo!

ZSY: io in qualche modo riesco a inserire il codice sorgente e non le immagini, perché il tuo non l'ha fatto?

int print(int value)
{  Print(value,":",__FUNCTION__); 
 return(value);
}
class A
{
private:
   static int        a1;
   static void       inc_a1(){a1++; Print("a1 = ", a1);}
protected:
   static int        a2;
public:
   static int        a3;

};
//+------------------------------------------------------------------+
static int A::a1 = print(1);
static int A::a2 = print(2);
static int A::a3 = print(3);

//+------------------------------------------------------------------+
void OnStart()
{

A::inc_a1();
A::inc_a1();
A::inc_a1();

}

2019.09.17 22:11:49.534 tst (EURUSD,H1) 1:print

2019.09.17 22:11:49.535 tst (EURUSD,H1) 2:print

2019.09.17 22:11:49.535 tst (EURUSD,H1) 3:print

2019.09.17 22:11:49.535 tst (EURUSD,H1) a1 = 2

2019.09.17 22:11:49.535 tst (EURUSD,H1) a1 = 3

2019.09.17 22:11:49.535 tst (EURUSD,H1) a1 = 4

ZS: la situazione è abbastanza comica, volevo aiutare, ora sto facendo scuse.... Perché? - bene, colpisci la rotaia per la verità...passo sulla rastrelliera....
 
Igor Makanu:

L'unico bug nel codice è nell'accesso al metodo privato. Questo bug è apparso di recente.

 

La funzione ChartOpen restituisce sempre 0 nel servizio. Anche se il grafico stesso si apre.

#property service

//int OnInit()
void OnStart()
  {
   long Otvet= ChartOpen(Symbol(),PERIOD_D1);
   Print("Otvet=",Otvet);

  // return(INIT_SUCCEEDED);
  }
 
fxsaber:

L'unico bug nel codice è nell'accesso al metodo privato. Questo bug è apparso di recente.

Pensavo di aver dimenticato qualcosa, così ho riletto come si comporta la statica in C#https://metanit.com/sharp/tutorial/3.6.php

I membri statici della classe sono comuni a tutti gli oggetti della classe, quindi dovete riferirvi ad essi con il loro nome di classe:

Si noti che i metodi statici possono fare riferimento solo a membri statici della classe. Non possiamo indirizzare metodi non statici, campi, proprietà all'interno di un metodo statico.


In MQL, la statica è inizializzata prima di eseguire OnInit(), ora discutiamo la visibilità globale dei metodi privati per la statica.... questo comportamento della statica in MQL - se si usa la statica, significa che non usiamo le caratteristiche di protezione dei dati di una classe, imho

quanto è grande l'insetto? - il modo in cui gli sviluppatori lo faranno, ho detto che il comportamento nelle operazioni di contesto è determinato dal programmatore (l'operatore di risoluzione del contesto è l'operatore con la massima priorità nel linguaggio! ), e il compilatore aiuterà correttamente - beh, come succede))

funziona così?

class A
  {
private:
   static void              My_function()
     {
      Print("^_^");
     }
  };
  
A a;
void OnStart()
  {
   A::My_function();
   a.My_function();  // 'A::My_function' - cannot access private member function        
  }

nel complesso, fa il lavoro


PS: aggiornato a 2145 - il codice con la statica si comporta allo stesso modo, se rimarrà così per mezzo anno, si scoprirà che questo è il comportamento previsto della statica ;)

UPD: ricordate, come si dice in gergo tutto questo - dirty tricks! ))) - Cercate molti esempi sul web, dove questo comportamento è accettato come standard del linguaggio, e dove è legato a un compilatore specifico del produttore. In Python, eval() non interrompe effettivamente l'esecuzione lineare del codice? - Beh, alcuni lo fanno e altri no perché il comportamento è imprevedibile.


UPD: controllare su 2145 la mia domanda di un mese fahttps://www.mql5.com/ru/forum/320733#comment_12989063

https://www.mql5.com/ru/forum/320733#comment_12958594

void OnStart()
  {
   double x=100.0;
   f(x);
  }
//_______________________________________________________________________
void f(bool v)
  {
  }
//_______________________________________________________________________

non è cambiato nulla, su un controllo di tipo bool il compilatore non ha imparato a scrivere avvertimenti - questo è molto spiacevole, stavo cercando un errore nel mio codice, anche se ero sicuro che il compilatore MQL controlla sempre la corrispondenza dei tipi

 
Igor Makanu:

Quanto è un bug? - Qualunque cosa gli sviluppatori facciano, è così che sarà.

È ovvio che il bug sarà risolto.

Non è cambiato nulla, il compilatore non ha imparato a scrivere avvertimenti su bool quando controlla i tipi

Il casting automatico dei puntatori e dei tipi numerici in bool è molto comodo.

 
Igor Makanu:

non è cambiato nulla, su bool quando controlla i tipi il compilatore non ha imparato a scrivere avvertimenti - questo è molto spiacevole, stavo già cercando un errore nel mio codice, anche se ero sicuro che il compilatore MQL controlla sempre strettamente la corrispondenza dei tipi

Non c'è perdita di dati durante questa fusione. O 0 o non 0.

Un altro caso è quando double -> qualsiasi tipo intero (fino a int32 incluso)

 
Slava:

Con questa fusione, non c'è perdita di dati. O 0 o non 0.

Un'altra cosa è quando si fa il casting di double -> qualsiasi tipo intero (fino a int32 incluso)

ma il contrario?

Stavo cercando un bug nel mio codice

All'inizio ho scritto un test, ma ho usato prima int , poi ho rinunciato ad usare bool, ma non ho sistemato tutto il codice, non ricordo, ma era così:

void OnStart()
{  int x=100.0;
   f(x); }
//_______________________________________________________________________
void f(int  v)  //так тестил
{
   if(v>0) v++;

}

//_______________________________________________________________________
void f(bool  v)  // потом решил, что мне нужен флаг, а ниже забыл исправить код
{
   if(v>0) v++;

}
//_______________________________________________________________________


Sono abbastanza pronto per tale comportamento ora, ma perché sto scrivendo su di esso ... beh, nel controllo delle condizioni MQL in if() - controlla strettamente i tipi? qualsiasi uso di operazioni non booleane emette un avviso? - E nello stesso modo in cui ho scritto in C# in VS2017 - il mio codice di esempio non si compila e MQL non lancia un avvertimento. A mio parere, per coloro che sono nuovi alla programmazione in MQL, tale comportamento implica alcune sorprese.

 
fxsaber:

È ovvio che il bug sarà risolto.

Non voglio discutere, ma la mia opinione è che non si dovrebbe fare affidamento sul controllo da parte del compilatore quando si lascia la classe tramite la statica così come l'uso dell'operatore di risoluzione del contesto,

cioè se scrivete un metodo/campo statico o usate ::: - non fate affidamento sul compilatore