Frage an #define-Experten - Seite 2

 
Oh, mein Gott, die Jungs können nicht ohne Binden leben.
 
Nikolai Karetnikov:

Ich danke Ihnen! )

Im Wesentlichen.

Das ist der Punkt, an dem ich mit der Option "Klasse" aufgehört habe. Selbst so elementare Dinge wie die #define-Parametrisierung werden ohne täglichen Gebrauch schnell vergessen.

Auf die Nerven gehen.

Gott, wie empfindlich sind doch alle hier; man kann eine Frage stellen, ohne eine Andeutung zu machen, ohne die Absicht, zu kränken oder zu beleidigen, aber nein, irgendwo in der Seele eines unerkannten Genies brennt der Wunsch, sich auf Kosten eines anderen Amateurs durchzusetzen. Im englischen Forum begegnet mir das nicht, obwohl ich dort regelmäßig schreibe. Da ich das weiß, versuche ich normalerweise nicht auf solche Bemerkungen zu reagieren, aber wenn Sie, Dmitry, sich in einer verbalen Schlacht austoben wollen, werde ich Ihnen das Vergnügen bereiten, Sie kopfüber in Ihre eigenen Emanationen zu stürzen.

Mach die Fliege, Baby.

 
Vladimir Simakov:

Warum haben Sie dem Mann diese Entscheidung nicht gleich mitgeteilt?)

UPD: bezgovna - ohne Sch..t geschrieben ))))

Nun, du genießt nur die Vorstellung, dass ich das nicht wusste. Also machen Sie weiter und verprügeln Sie sich in einem Orgasmus Ihrer eigenen Großartigkeit.

 
Dmitry Fedoseev:
Oh Mann, die Jungs können nicht mehr ohne Pads leben.

Über die Dichtungen.

Was ist gut an Singleton? Denn Sie können Zustände speichern, Protokolle mit komplexer Logik verarbeiten usw., während Sie alles im Hauptcode übersichtlich halten. Auf diese Weise wird eine angemessene Projektarchitektur geschaffen und der Code selbst wird besser lesbar.

PS. Ansonsten, ja, alles ist für einen Fan. Viele Leute hier in der Community mögen den Spaghetti-Code mit der ungarischen Notation, und der Masochismus, bei jedem Tick alle Orders und Positionen (alle) auszuprobieren, ist toll).

 

Vor langer Zeit (vor vielen Jahren) .... Es gab bereits einen Thread über die besten Logs, ob in einem separaten Thread oder in einem anderen Thread weiß ich nicht mehr.

Aber es wurde auf eine etwas andere Weise gemacht. Dort haben sie den Funktionsnamen entschlüsselt und alle möglichen Makrozeilen des Funktionsnamens hinzugefügt usw... und dann können Sie den Handler im laufenden Betrieb ändern

etwas wie "#defin PRINT prepare; Print"

und der Druck selbst im Stil von

void Print (string a; string a1="" ;string a2=""; ...... // 64 mal. Ich wünschte, wir könnten einfach schreiben ...a[]

{

Drucken (Unsere Vorbereitung, Argumente);

}

Das Define hätte wie ein normaler Druck behandelt werden können, und durch Änderung des Handlers hätten wir die Daten entweder in eine Datei schreiben oder auf dem Bildschirm anzeigen können. Die Anzahl der Argumente kann beliebig sein (bis zu 64) // für diejenigen, die es noch nicht gelernt haben.

Das ist übrigensauch die Frage des Autors))

 
Dmitry Fedoseev:
Aber leider werden Sie die Trottel nicht beeindrucken.

Möchten Sie das?

Entschuldigung, aber soweit ich mich aus der Zeit erinnere, als Assembler noch verwendet wurde, ist die Makroerweiterung (Makro ) ein Werkzeug, mit dem man seine Definition durch seinen Code kurz vor der Kompilierung ersetzen kann.

Es ist nur so, dass die Programmierung in Assembler etwas umständlich ist und es keine Unterprogramme gibt.

Die Programmierung in MQL ist ein wenig komfortabler.

Frage: Wäre es für Sie angenehmer, ein Unterprogramm zu schreiben, oder nur Print("Kein Blatt"); oder etwas, das im Präprozessor vordefiniert werden muss?

 
Алексей Тарабанов:

(1) Würden Sie gerne?

Entschuldigung, aber soweit ich mich aus der Zeit erinnere, als Assembler noch verwendet wurde, ist die Makroerweiterung (Makro ) ein Werkzeug, mit dem man seine Definition durch seinen Code kurz vor der Kompilierung ersetzen kann.

(2) Die Programmierung in Assembler ist einfach sehr umständlich und es gibt keine Unterprogramme.

Die Programmierung in MQL ist ein wenig komfortabler.

(3) Frage: Würden Sie sich wohler fühlen, wenn Sie ein Unterprogramm schreiben, oder nur Print("No sheet"); oder etwas im Präprozessor vordefinieren?

1) Die Frage ist nicht an mich gerichtet.

2) Es gibt Unterprogramme in Assembler.

3) Ich fühle mich wohler, wenn ich bei Fragen, die kein faules Ei wert sind, keinen Blödsinn mache.

 
Alexandr Andreev:

Vor langer Zeit (vor vielen Jahren) .... Es gab bereits einen Thread über die besten Logs, ob in einem separaten Thread oder in einem anderen Thread weiß ich nicht mehr.

Aber es wurde auf eine etwas andere Weise gemacht. Dort haben sie den Funktionsnamen entschärft und alle möglichen Makrozeilen von Funktionsnamen usw. hinzugefügt... und dann können Sie den Handler im laufenden Betrieb ändern

etwas wie "#defin PRINT prepare; Print"

und der Druck selbst im Stil von

void Print (string a; string a1="" ;string a2=""; ...... // 64 mal. Ich wünschte, wir könnten einfach schreiben ...a[]

{

Drucken (Unsere Vorbereitung, Argumente);

}

Das Define hätte wie ein normaler Druck behandelt werden können, und durch Änderung des Handlers hätten wir die Daten entweder in eine Datei schreiben oder auf dem Bildschirm anzeigen können. Die Anzahl der Argumente kann beliebig sein (bis zu 64) // für diejenigen, die es noch nicht gelernt haben.

Das ist übrigensgenau das, was der Autor wollte))

String aN="" und 63 Mal - das ist heftig.

Lassen Sie mich das erklären:

  1. Ein String ist ein Objekt, das einen wchar_t* umhüllt.
  2. Indem man string="" 63 Mal tun Sie Folgendes: Sie weisen Speicher für 63 String-Objekte zu (in diesem Fall auf dem Stack), rufen den parametrischen Konstruktor auf (63 Mal), weisen einen wchar_t*-Puffer einer bestimmten Größe im Heap zu (genau dort), dessen erste beiden Bytes mit 0x0000 initialisiert werden (ja, auch das passiert 63 Mal).

Wenn Sie es so machen, machen Sie string=NULL, in diesem Fall werden Sie große Kosten für die Zuweisung von unnötigem Speicher im Heap sparen.

UPD. Nein, ich habe mich geirrt, wenn es richtig gemacht wird, gibt es keine Speicherzuweisung im Heap.

 
Vladimir Simakov:

String aN="" und 63 Mal ist heftig.

Lassen Sie mich das erklären:

  1. string ist ein Objekt, das ein Wrapper über wchar_t* ist.
  2. Indem man string="" 63 Mal tun Sie Folgendes: Sie weisen Speicher für 63 String-Objekte zu (in diesem Fall auf dem Stack), rufen den parametrischen Konstruktor auf (63 Mal), weisen einen wchar_t*-Puffer einer bestimmten Größe im Heap zu (genau dort), dessen erste beiden Bytes mit 0x0000 initialisiert werden (ja, auch das geschieht 63 Mal).

Wenn Sie es so machen, machen Sie string=NULL, in diesem Fall werden Sie große Kosten für die Zuweisung von unnötigem Speicher im Heap sparen.

UPD. Nein, ich habe mich geirrt, wenn es richtig gemacht wird, gibt es keine Speicherzuweisung im Heap.

Wieder einmal verstehen Sie nicht, worüber wir reden. Alexander schreibt über das Ersetzen von Print() durch define (um zu vermeiden, dass man die gesamte Datei durchsucht und nach allen Ausdrucken sucht). Das Problem dabei ist, dass Print mehrere Parameter haben kann, obwohl niemand sie als Parameter kennzeichnet - nur eine durch Kommas verbundene Zeichenfolge. Um die Standardfunktion Print zu ersetzen, brauchen Sie also eine Funktion, die 64 optionale Parameter akzeptiert (um der Funktion Print() vollständig zu entsprechen). Und Sie brauchen es, um einige Daten vor dem Protokoll hinzuzufügen, vielleicht einen Streifen mit einem Pfeil (==>) zur besseren Sichtbarkeit, vielleicht eine Zeilennummer, ein Datum oder eine Ausgabe in eine Datei. Niemand kann sich um die Schnelligkeit dieses Vorgangs kümmern, denn er wird nur in besonders komplexen Fällen von Suchfehlern durchgeführt und dann entfernt.

 
string _info;
void _Print(string s,string s1="",string s2="",string s3="",string s4="",string s5="",string s6="",string s7="",string s8="")//.....
   {
   string ss;
   StringConcatenate(ss,s,s1,s2,s3,s4,s5,s6,s7,s8);//....
   //Comment(_info,ss);
   Print(_info,ss);
   }
#define Print _info=__FILE__+" line "+__LINE__ +" "+__FUNCSIG__+" Print: "; _Print

void OnStart()
  {
   
   Templ();
  }
  
void Templ()
   {
   Print("Error, a!=",5," and other....",3,4,5);
   Print("a=",5);
   Print("Hi");
   }


Jeder scheint zu verstehen.....

Dies ist also für diejenigen, die gerade ihren Weg beginnen....

Wir können alles in eine stat-Klasse verpacken und einen Verweis zurückgeben, der dann den Rest ausgleicht, da diese Methode ein Minus hat, wenn sie mit if (a!=5) Print(a) arbeitet; es wird nicht funktionieren, man sollte immer schreiben if (a!=5) {Print(a);}, in Klassen können wir diesen Moment korrigieren, aber ich bin zu faul)) und im Allgemeinen scheint es alles in der Geschichte Archive

den Weg mit Klassen, initialisieren unsere Daten über statische Methode und kombinieren den Operator-Aufruf unsere print.... dannif (a!=5) Print(a); es wird funktionieren