Errori, bug, domande - pagina 1576

 

Mi chiedo quale principio viene utilizzato per mettere i prodotti in questo banner

e ci vanno i prodotti dei venditori autorizzati? Voglio dire, posso vedere il mio prodotto in questo banner? Ho sfogliato 30 pagine e non ho visto il mio...

 
Renat Fatkhullin:

Non interferisco. Ho 26 anni di programmazione non-stop all'attivo.

Gli avvertimenti sono essenzialmente errori se parliamo del settore finanziario. E tutte le migliaia di rapporti di "perdita di segno, perdita di precisione, perdita sui fantasmi ecc." sono un verdetto sulla qualità del codice. A quanto pare non capite bene le implicazioni.

Si prega di fornire in forma sufficientemente completa il pezzo di codice che il compilatore ha indicato come errore.

Senza di essa tutta questa discussione appare sgradevole e ingiusta.

Ok, Renat, questi argomenti sulla "qualità del codice" sono irrilevanti per l'argomento della discussione, perché qui stiamo parlando solo di compilabilità, cioè la lavorabilità del codice. E la perdita di precisione, ecc. - questa è una questione personale del programmatore, quindi la sua responsabilità. La conversione implicita, per esempio da int a short, non è vietata dallo standard della lingua, giusto? Allora perché stiamo predicando ora?

OK, ho trovato uno di questi bug:

class CClass
{

};


class CArr
{
  CClass* data[];
 public: 
  CClass* operator[] (int i)  { return data[i]; }
};


template<typename T>
void Func (T* obj)      {  }
 

void OnStart()
{  
  CArr arr;
  Func(arr[0]);
}

che ottengo nel registro:

'CClass' - dichiarazione senza tipo TestScript.mq5 16 9
'CClass' - attesa virgola TestScript.mq5 16 9

Nelle build precedenti tutto andava bene.

 
Alexey Navoykov:

Ok, Renat, questi argomenti sulla "qualità del codice" sono irrilevanti per l'argomento della discussione, perché qui stiamo parlando solo di compilabilità, cioè la lavorabilità del codice. E la perdita di precisione, ecc. - questa è una questione personale del programmatore, quindi la sua responsabilità. La conversione implicita, per esempio da int a short, non è vietata dallo standard della lingua, giusto? Allora perché stiamo predicando ora?

2600 posti potenzialmente problematici, e anche nelle finanze - questa non è una morale, ma esattamente l'indicatore della qualità del codice.


OK, ho trovato uno di questi bug:

che ottengo nel registro:

Nelle build precedenti tutto andava bene.

Sì, questo bug è stato già discusso (probabilmente, con A100) e risolto il 4 maggio. Ha esagerato con il controllo dei tipi, a quanto pare.

Ho allegato l'ultima build 1329 di MetaEditor, che non ha questo errore. Per favore, controllate lì.

Il rilascio di MT5 avverrà il 12 maggio.

File:
 
Alexey Navoykov:

Andava bene nelle build precedenti.

Nel vostro codice, non state restituendo un puntatore const a un oggetto privato. Si scopre che le funzioni terze (in termini di visibilità delle variabili) possono cambiare apparentemente qualcosa che non dovrebbe essere architettonicamente accessibile a loro, poiché il programmatore ha specificato privato.

Ogni volta che voglio restituire un puntatore a un oggetto privato, devo necessariamente specificare un modificatore const. Nel tuo caso ci metterei una deformazione.

Non sono un uccello che vola alto, quindi chiedo. Dovete usare questo codice da qualche parte o è solo pigro impostare const?

 
A100:

Due giorni sprecati praticamente per tutto il tempo (alla mia età è già molto), e avevo pianificato di usarli in un modo leggermente diverso.

Avete citato più di cento bug. Ogni volta una tale quantità selvaggia del tuo tempo?! Dove hai trovato tanta generosità nei confronti degli sviluppatori?
Alexey Navoykov:

Quindi, ancora una volta, tanto di cappello ad A100 per la sua pazienza. Io stesso sono stanco di questo, è più facile per me sedermi sulla vecchia build, che funziona bene, che cercare le cause dei bug nella nuova build, lavorando sul service-desk. O qualcuno mi pagherà per questo lavoro?

Sì, il servicedesk è una cosa figa da fare gratis per i tester di terze parti. Ovviamente non è stato fatto per questo, ma di fatto è diventato esattamente il datore di lavoro per i tester di terze parti che lavorano gratuitamente. Se non fosse stato per queste segnalazioni di bug, il compilatore avrebbe impiegato molto più tempo a compilare.

Tutti sosterranno che ci dovrebbe essere una punizione per aver trovato un bug, come è la pratica nel mondo. A100 dovrebbe avere lo stipendio del tester statale. E apparentemente un anno di stipendio da tester.

 
Renat Fatkhullin:

Sì, questo errore è già stato discusso (forse con A100) e risolto già il 4 maggio. Hanno esagerato con il controllo dei tipi, a quanto pare.

Ho allegato l'ultima build 1329 di MetaEditor che non contiene questo errore. Per favore, controllate lì.

Il rilascio di MT5 avverrà il 12 maggio.

Controllato. Non ci sono quasi errori di compilazione ora, tranne alcune strane meraviglie che non posso riprodurre separatamente dal programma, ma che riesco a bypassare in qualche modo casuale.

Qui sotto c'è un esempio di codice dell'area problematica di cui vi parlerò. Di nuovo, si compila bene separatamente ma genera un errore nel mio programma.

class CBase
{
};


class CClass : public CBase
{
};

 

class CWork
{
 public:
 
  template<typename T>
  void Run(T& arr[])
  {
    struct Struct
    {
      template<typename T1> static void Set(T1& main,  T& arr[], CBase& obj)   { main.Set(arr); } 
    };
    
    Struct structobj;
    
    structobj.Set(this, arr, arr[0]);
  }

  
  template<typename T>
  void Set(T& arr[]) 
  {  
    for (int i=0; i<ArraySize(arr); i++) Set(arr[i]);  // Здесь возникает ошибка: 'arr' - parameter conversion not allowed
  }
  
  template<typename T>
  void Set(T& obj)    { } 
  
  template<typename T>
  void Set(T*& obj)    { } 

};
 
 

void Main()
{
  CWork work;
  CClass arr[];
  work.Run(arr);

  return;
}

Se aggiungete una linea nella funzione Main in qualsiasi punto (per esempio, dopo return):

work.Set(arr[0]);

si compila normalmente.

Il programmatore sembra essere andato troppo oltre nell'ottimizzazione.

E ci sono anche alcuni glitch nel runtime. Per esempio, assegno un valore a qualche membro della struttura ma poi si scopre che il valore lì è vecchio, cioè non è stato assegnato nulla. Se aggiungo una linea con qualche operazione arbitraria vicino, tutto diventa normale. Questi bug sono iniziati da quella build autunnale quando hai ottimizzato il compilatore. Tutto sommato, tutto è ancora grezzo.

Inoltre, la compilazione stessa richiede ancora 20 secondi, mentre la build 1159 ha richiesto solo 1-2 secondi. Allo stesso tempo non noto alcun aumento significativo della velocità dei miei programmi, il guadagno è entro il 10-20%. Quindi potete dimenticare quelle storie sull'aumento di velocità di 2-10x. Forse succede con campioni di prova appositamente selezionati, ma noi abbiamo applicazioni reali, non false.

Complessivamente una compilazione più lenta di 10-20 volte per il bene di una performance un po' più alta. Imho, non ne vale la pena. Il tempo perso dal programmatore è molto più prezioso.

Sono ancora costretto a rimanere sulla build 1159.

 
Anton Zverev:

Nel vostro codice, non state restituendo un puntatore const a un oggetto privato. Si scopre che le funzioni terze (in termini di visibilità delle variabili) possono cambiare apparentemente qualcosa che non dovrebbe essere architettonicamente accessibile a loro, poiché il programmatore ha specificato privato.

Ogni volta che voglio restituire un puntatore a un oggetto privato, devo necessariamente specificare un modificatore const. Nel tuo caso ci metterei una deformazione.

Non sono un uccello che vola alto, quindi chiedo. Dovete usare questo codice da qualche parte o è solo pigro impostare const?

Io nascondo solo un array in privato mentre gli stessi oggetti CClass sono disponibili ad un utente per l'accesso completo, questo è lo scopo. Se ne avessi bisogno solo per la lettura, metterei const.

 
Anton Zverev:
Tutti sosterranno che ci dovrebbe essere una punizione per aver trovato un bug, come è la pratica nel mondo. A100 dovrebbe avere uno stipendio da tester statale. E apparentemente un anno di stipendio da tester.
Sono d'accordo, ma temo che si limiterà a una targa e a una lettera di encomio :)
 

Non so se questo è un bug o solo una descrizione sbagliata dei metodi CDealInfoPositionId() eTicket(). Ho scritto il seguente codice

//+------------------------------------------------------------------+
//|                                                      test_01.mq5 |
//|                                                   Sergey Gritsay |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Trade\Trade.mqh>
//#include <Trade\DealInfo.mqh>
CTrade trade;
CDealInfo deal;
ulong  ticket_deal;      // тикет сделки
ulong  ticket_position;     // тикет позиции
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   trade.Buy(0.1,_Symbol);
   ticket_deal=trade.ResultDeal();
   deal.Ticket(ticket_deal);
   ticket_position=deal.PositionId();

   Print("ResultDeal() = ",ticket_deal);
   Print("deal.PositionId() = ",ticket_position);
  }
//+------------------------------------------------------------------+

risultato

NM      0       14:06:49.083    test_01 (EURUSD,H1)     ResultDeal() = 69380150
QE      0       14:06:49.083    test_01 (EURUSD,H1)     deal.PositionId() = 0

Ho aggiunto una richiesta per la storia delle offerte usando la funzioneHistorySelect().

//+------------------------------------------------------------------+
//|                                                      test_01.mq5 |
//|                                                   Sergey Gritsay |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Trade\Trade.mqh>
//#include <Trade\DealInfo.mqh>
CTrade trade;
CDealInfo deal;
ulong  ticket_deal;      // тикет сделки
ulong  ticket_position;     // тикет позиции
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   trade.Buy(0.1,_Symbol);
   ticket_deal=trade.ResultDeal();
   HistorySelect(0,TimeCurrent());
   deal.Ticket(ticket_deal);
   ticket_position=deal.PositionId();

   Print("ResultDeal() = ",ticket_deal);
   Print("deal.PositionId() = ",ticket_position);
  }
//+------------------------------------------------------------------+

risultato

JM      0       14:16:33.055    test_01 (EURUSD,H1)     ResultDeal() = 69381116
EF      0       14:16:33.055    test_01 (EURUSD,H1)     deal.PositionId() = 83654708
 
Alexey Navoykov:

In privato nascondo solo l'array, e gli stessi oggetti CClass sono disponibili all'utente per un accesso completo, questo è lo scopo. Se avessi bisogno che sia di sola lettura, metterei const.

Capisco, può dirmi in quali costrutti può essere utile? Capisco che con questo approccio, non si può fare nulla con l'array stesso (ridimensionare, scambiare elementi, ecc.). cancellare, tuttavia, può essere applicato...

Suppongo che lo facciate da qualche parte con un template, in modo che ci sia la stessa sintassi dell'operatore [] per diversi tipi di oggetti. In generale, potresti mostrare l'uso di questo costrutto quando è conveniente.