Gemeinsam lernen und schreiben in MQL5 - Seite 32

 

Ich weiß es nicht :) in unserem Büro für geschriebenen Code wie

std::string s = "";

Sie werden zumindest gescholten werden, und das zu Recht, wie ich finde.

Auch hier handelt es sich um einen komplexen Typ, der eine korrekte Initialisierung bei der Erstellung erfordert. Wenn die Zeichenkette initialisiert werden muss, handelt es sich mit Sicherheit um einen Fehler von MT5(4).

Vielleicht sollte die Größe von Arrays sofort nach der Erstellung auf Null gesetzt werden?

Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5
 
TheXpert:

Ich weiß es nicht :) In unserer Firma bekommen sie eine Strafe für das Schreiben von Code wie

Zumindest werden Sie gemaßregelt, und das zu Recht, wie ich finde.

Bevor Sie eine Variable verwenden können, müssen Sie ihr einen Wert zuweisen (sie explizit initialisieren). Oder sind Sie nicht einverstanden?

Eine explizite Initialisierung bedeutet nicht, dass sie zum Zeitpunkt der Deklaration erforderlich ist. Wenn der Wert der nicht initialisierten Variablen dann aber in einigen Berechnungen verwendet wird, sind die Folgen unvorhersehbar.

 

Sie machen mir Angst, Rashid, bei allem Respekt.

Eine Klasse hat einen Konstruktor, der die anfängliche Initialisierung des Objekts durchführt und auch Standardwerte setzt, wenn dies logisch ist.

Wenn die anfängliche Initialisierung nicht stattfindet, muss es eine Möglichkeit geben, zu wissen, ob sich das Objekt in einem angemessenen Zustand befindet. Bei einer Zeichenkette ist es viel sinnvoller, einen Standardwert festzulegen.

std::string s = "";

Eine solche Schreibweise ist Paranoia, eine paranoide Person kann a priori keinen normalen Code schreiben.

Zeichenketten werden also nicht initialisiert?

 
TheXpert:
Die Zeichenketten sind also nicht initialisiert?
Natürlich werden sie initialisiert, aber nicht mit der leeren Zeichenkette "", sondern mit NULL.
 
TheXpert:

Sie machen mir Angst, Rashid, bei allem Respekt.

Eine Klasse hat einen Konstruktor, in dem die Initialisierung des Objekts stattfindet und der auch das Setzen eines Standardwerts beinhaltet, falls dies sinnvoll ist.

Wenn die anfängliche Initialisierung nicht stattfindet, muss es eine Möglichkeit geben, zu wissen, ob sich das Objekt in einem angemessenen Zustand befindet. Bei einer Zeichenkette ist es viel sinnvoller, einen Standardwert festzulegen.

Eine solche Schreibweise ist Paranoia, eine paranoide Person kann a priori keinen normalen Code schreiben.

Strings werden also nicht initialisiert?

Lesen Sie die Hilfe - https://www.mql5.com/ru/docs/basis/types/classes:

Wenn eine Struktur Variablen vom Typ String und/oder ein dynamisches Array-Objekt enthält, weist der Compiler einer solchen Struktur einen impliziten Konstruktor zu, in dem alle Mitglieder der Struktur vom TypStringauf Null gesetzt werden und eine korrekte Initialisierung für das dynamische Array-Objekt vorgenommen wird.

...

Konstrukteure und Destrukteure

Ein Konstruktor ist eine spezielle Funktion, die bei der Erstellung eines Strukturobjekts oder einer Klasse automatisch aufgerufen wird und in der Regel zur Initialisierung von Klassenmitgliedern verwendet wird. Im Folgenden wird nur von Klassen die Rede sein, das oben Gesagte gilt auch für Strukturen, sofern nicht anders angegeben. Der Konstruktorname muss mit dem Klassennamen übereinstimmen. Der Konstruktor hat keinen Rückgabetyp (Sie können den Typ void angeben).

Bestimmte Klassenmitglieder - Strings, dynamische Arrays und Objekte, die eine Initialisierung erfordern - werden ohnehin initialisiert, unabhängig vom Vorhandensein eines Konstruktors.

Документация по MQL5: Основы языка / Типы данных / Структуры и классы
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
  • www.mql5.com
Основы языка / Типы данных / Структуры и классы - Документация по MQL5
 

Das ist schade... Zumindest werde ich es wissen.

Wird es auch in Strukturen NULL sein?

 
TheXpert:

Das ist schade... Wenigstens weiß ich es dann.

Wird es auch in Strukturen NULL sein?

Vergleichen Sie einfach mit NULL und Sie werden alles selbst wissen - Typ void und Konstante NULL:

Die vordefinierte konstante Variable NULL ist vom Typ void und kann ohne Konvertierung Variablen anderer Grundtypen zugewiesen werden. Es ist auch erlaubt, Variablen von Grundtypen mitNULL zu vergleichen .

Beispiel:

//--- wenn eine Zeichenkette nicht initialisiert ist, weisen Sie ihr unseren vordefinierten Wert zu
if(some_string==NULL) some_string="leer";

NULL kannauch mit Zeigern auf Objekte verglichen werden, die mit dem Operator new erstellt wurden.

 
Rosh:

Bevor eine Variable verwendet werden kann, muss ihr ein Wert zugewiesen (explizit initialisiert) werden. Oder sind Sie nicht einverstanden?

Die explizite Initialisierung bedeutet nicht, dass sie direkt bei der Deklaration der Variablen erfolgen muss. Wenn jedoch der Wert einer nicht initialisierten Variablen in einigen Berechnungen verwendet wird, sind die Folgen unvorhersehbar.

Apropos Vögel.

//Struct StrMQL4_Deal
struct StrMQL4_Deal
{
//----------------------------------------------------------------------------//
double TP = 0;
double SL = 0;
//----------------------------------------------------------------------------//
};

Und wie wird der Compiler reagieren? Und sie wird folgende Fragen beantworten '=' - unzulässige Verwendung einer Zuweisung

//Class CMqlExpert
class CMqlExpert
//Purpose: Main class of trade system. 
{
//----------------------------------------------------------------------------//
protected:
//****************************************************************************//
//                    Protected declarations of the class                     //
//****************************************************************************//
bool TradeMonday    = true; //Trade in monday
bool TradeTuesday   = true; //Trade in tuesday
bool TradeWednesday = true; //Trade in wednesday
bool TradeThursday  = true; //Trade in thursday
bool TradeFriday    = true; //Trade in friday
//----------------------------------------------------------------------------//
public:

Der Compiler war nicht verbogen - '=' - unzulässige Verwendung einer Zuweisung.

Meine Frage ist: Was passiert, wenn der Programmierer (in diesem Fall ich) die Variablen nicht initialisiert, bevor er sie benutzt (er macht es so, wie es der Compiler verlangt und lässt diesen Moment im Konstruktor aus)?


 
Interesting:

Ich habe eine Frage - Was passiert, wenn der Programmierer (in diesem Fall ich) sich nicht um die Initialisierung der Variablen kümmert, bevor er sie verwendet (indem er dies wie vom Compiler gefordert tut und diesen Punkt im Konstruktor auslässt)?

Die Frage kommt von einer Anfängerin...
 
sergeev:
Klingt wie die Frage eines Neuankömmlings...

Nun, das habe ich damals gedacht (das ist schon lange her, ich erinnere mich), aber ich wollte in der Hitze des Gefechts eine Bewerbung schreiben. :)

Obwohl ich immer noch nicht verstehe, warum es verboten ist, Variablen auf Compiler-Ebene zu initialisieren.