Fehler, Irrtümer, Fragen - Seite 1576

 

Ich frage mich, nach welchem Prinzip die Produkte in diesen Bannern platziert werden

und werden dort auch Produkte von zugelassenen Verkäufern angeboten? Ich meine, kann ich mein Produkt in diesem Banner sehen? Ich habe 30 Seiten durchgeblättert und habe meins nicht gesehen...

 
Renat Fatkhullin:

Ich mische mich nicht ein. Ich habe 26 Jahre lang ununterbrochen programmiert.

Warnungen sind im Grunde genommen Fehler, wenn es sich um den Finanzsektor handelt. Und all die Tausenden von Berichten über "Verlust von Zeichen, Verlust von Genauigkeit, Verlust von Geistern usw." sind ein Urteil über die Codequalität. Offenbar verstehen Sie die Tragweite nicht ganz.

Bitte geben Sie in hinreichend ausführlicher Form das Codestück an, das der Compiler als Fehler angezeigt hat.

Ohne sie wirkt diese ganze Diskussion unschön und unfair.

Ok, Renat, diese Argumente über "Codequalität" sind für das Thema der Diskussion irrelevant, denn es geht hier nur um die Kompilierbarkeit, d.h. die Verwendbarkeit des Codes. Und der Verlust an Genauigkeit, etc. - dies ist eine persönliche Angelegenheit des Programmierers, sozusagen seine Verantwortung. Die implizite Umwandlung von z.B. int in short ist doch nicht durch den Sprachstandard verboten, oder? Warum predigen wir also jetzt?

OK, ich habe einen dieser Fehler gefunden:

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

die ich im Protokoll erhalte:

'CClass' - Deklaration ohne Typ TestScript.mq5 16 9
'CClass' - Komma erwartet TestScript.mq5 16 9

Bei früheren Builds war alles in Ordnung.

 
Alexey Navoykov:

OK, Renat, diese Argumente über "Codequalität" sind für das Thema der Diskussion irrelevant, denn es geht hier nur um die Kompilierbarkeit, d.h. die Funktionsfähigkeit des Codes. Und der Verlust an Genauigkeit, etc. - dies ist eine persönliche Angelegenheit des Programmierers, sozusagen seine Verantwortung. Die implizite Umwandlung von z.B. int in short ist doch nicht durch den Sprachstandard verboten, oder? Warum predigen wir also jetzt?

2600 potenziell problematische Stellen, und sogar in den Finanzen - das ist keine Moral, sondern genau der Indikator für die Codequalität.


OK, ich habe einen dieser Fehler gefunden:

die ich im Protokoll erhalte:

Bei früheren Builds war alles in Ordnung.

Ja, dieser Fehler wurde bereits diskutiert (wahrscheinlich mit A100) und am 4. Mai behoben. Offenbar hat er es mit der Typkontrolle übertrieben.

Ich habe den neuesten MetaEditor Build 1329 beigefügt, bei dem dieser Fehler nicht auftritt. Bitte überprüfen Sie es dort.

Die Veröffentlichung von MT5 erfolgt am 12. Mai.

Dateien:
 
Alexey Navoykov:

In früheren Versionen war das kein Problem.

In Ihrem Code geben Sie keinen Konst-Zeiger auf ein privates Objekt zurück. Es stellt sich heraus, dass Funktionen von Drittanbietern (in Bezug auf die Sichtbarkeit von Variablen) scheinbar etwas ändern können, das für sie architektonisch nicht zugänglich sein sollte, da der Programmierer private angegeben hat.

Wenn ich einen Zeiger auf ein privates Objekt zurückgeben möchte, muss ich unbedingt einen Const-Modifikator angeben. In Ihrem Fall würde ich eine Verwerfung anbringen.

Ich bin kein hochfliegender Vogel, deshalb frage ich. Müssen Sie diesen Code irgendwo verwenden oder ist es einfach nur faul, const zu setzen?

 
A100:

Zwei Tage sind praktisch die ganze Zeit vergeudet (in meinem Alter ist das schon viel), und ich hatte geplant, sie auf eine etwas andere Weise zu nutzen.

Sie haben mehr als hundert Fehler genannt. Jedes Mal so ein wahnsinniger Aufwand an Zeit?! Woher haben Sie diese Großzügigkeit gegenüber den Entwicklern?
Alexey Navoykov:

Ich ziehe also wieder einmal meinen Hut vor A100 für seine Geduld. Ich bin es selbst leid, es ist einfacher für mich, auf dem alten Build zu sitzen, das gut funktioniert, als im neuen Build nach Fehlerursachen zu suchen und am Service-Desk zu arbeiten. Oder wird mich jemand für diese Arbeit bezahlen?

Ja, Servicedesk ist eine coole Sache für Dritttester, die kostenlos arbeiten. Offensichtlich war sie nicht dafür gedacht, aber sie ist genau der richtige Arbeitgeber für Tester von Dritten, die kostenlos arbeiten. Ohne diese Fehlerberichte hätte die Kompilierung des Compilers viel länger gedauert.

Jeder wird argumentieren, dass das Auffinden eines Fehlers bestraft werden sollte, wie es in der Welt üblich ist. A100 sollte das Gehalt des Staatsprüfers erhalten. Und scheinbar ein Jahresgehalt eines Testers.

 
Renat Fatkhullin:

Ja, dieser Fehler wurde bereits diskutiert (vielleicht mit A100) und bereits am 4. Mai behoben. Sie haben es mit der Schriftkontrolle offenbar übertrieben.

Ich habe den neuesten MetaEditor Build 1329 beigefügt, der diesen Fehler nicht enthält. Bitte überprüfen Sie es dort.

Der MT5 wird am 12. Mai veröffentlicht.

Geprüft. Es gibt jetzt fast keine Kompilierungsfehler mehr, abgesehen von einigen merkwürdigen Wundern, die ich nicht separat vom Programm reproduzieren kann, aber mit einigen zufälligen Mitteln zu umgehen weiß.

Nachfolgend finden Sie ein Codebeispiel für den Problembereich, über den ich Sie informieren werde. Auch hier wird er separat kompiliert, erzeugt aber einen Fehler in meinem Programm.

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

Wenn Sie in der Funktion Main an einer beliebigen Stelle (z. B. nach dem Return) eine Zeile hinzufügen:

work.Set(arr[0]);

kompiliert er normal.

Der Programmierer scheint bei der Optimierung zu weit gegangen zu sein.

Außerdem gibt es einige Pannen in der Laufzeit. Zum Beispiel weise ich einem Member einer Struktur einen Wert zu, aber später stellt sich heraus, dass der Wert dort alt ist, d.h. nichts zugewiesen wurde. Wenn ich eine Zeile mit einer beliebigen Operation in der Nähe hinzufüge, wird alles normal. Diese Fehler sind seit dem Herbst-Build aufgetreten, als Sie den Compiler optimiert haben. Alles in allem ist alles noch roh.

Außerdem dauert die Kompilierung selbst immer noch 20 Sekunden, während der Build 1159 nur 1-2 Sekunden benötigte. Gleichzeitig bemerke ich keine signifikante Beschleunigung meiner Programme, der Gewinn liegt bei 10-20%. Sie können also die Geschichten über eine 2-10fache Beschleunigung vergessen. Das mag bei speziell ausgewählten Testmustern der Fall sein, aber wir haben echte Anwendungen, keine gefälschten.

Insgesamt 10-20 mal langsamer kompilieren für ein bisschen mehr Leistung. Imho ist es das nicht wert. Die verlorene Zeit des Programmierers ist viel mehr wert.

Ich bin immer noch gezwungen, auf dem 1159er Build zu bleiben.

 
Anton Zverev:

In Ihrem Code geben Sie keinen Konst-Zeiger auf ein privates Objekt zurück. Es stellt sich heraus, dass Funktionen von Drittanbietern (in Bezug auf die Sichtbarkeit von Variablen) scheinbar etwas ändern können, das für sie architektonisch nicht zugänglich sein sollte, da der Programmierer private angegeben hat.

Wenn ich einen Zeiger auf ein privates Objekt zurückgeben möchte, muss ich unbedingt einen Const-Modifikator angeben. In Ihrem Fall würde ich eine Verwerfung anbringen.

Ich bin kein Überflieger, deshalb frage ich. Müssen Sie diesen Code irgendwo verwenden oder ist es einfach nur faul, const zu setzen?

Ich verstecke nur ein Array in private, während die CClass-Objekte selbst für einen Benutzer für den vollen Zugriff verfügbar sind, das ist der Zweck. Wenn ich es nur zum Lesen benötigt, würde ich const.

 
Anton Zverev:
Alle werden sich dafür aussprechen, dass das Auffinden eines Fehlers bestraft werden sollte, wie es in der Welt üblich ist. A100 sollte das Gehalt eines Staatsprüfers erhalten. Und scheinbar ein Jahresgehalt eines Testers.
Ich unterstütze das, aber ich fürchte, es wird sich auf eine Plakette und ein Anerkennungsschreiben beschränken :)
 

Ich weiß nicht, ob dies ein Fehler ist oder nur eine falsche Beschreibung der Methoden CDealInfoPositionId() undTicket(). Ich habe den folgenden Code geschrieben

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

Ergebnis

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

Ich habe eine Anfrage für die Historie von Geschäften mit der FunktionHistorySelect() hinzugefügt.

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

Ergebnis

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 private verstecke ich nur das Array, und die CClass-Objekte selbst stehen dem Benutzer für den vollen Zugriff zur Verfügung, das ist der Zweck. Wenn ich es nur zum Lesen bräuchte, würde ich const setzen.

Verstehe. Können Sie mir sagen, bei welchen Konstrukten dies nützlich sein könnte? Ich verstehe, dass man mit diesem Ansatz nichts mit dem Array selbst machen kann (Größe ändern, Elemente austauschen usw.). löschen, kann jedoch angewendet werden...

Ich gehe davon aus, dass Sie das irgendwo mit einer Vorlage machen, so dass es die gleiche Syntax des []-Operators für verschiedene Objekttypen gibt. Könnten Sie im Allgemeinen die Verwendung dieses Konstrukts aufzeigen, wenn es sinnvoll ist?