Fragen von einem "Dummy" - Seite 125

 
MetaDriver:

Oh, jetzt verstehe ich.

Renat, ich habe schon seit langem einen Vorschlag, der genau auf das Thema zielt: Bitte machen Sie eine benannte Typisierung für Arrays, zumindest für statische (alle anderen Typen haben sie bereits).

D.h. man kann z.B. deklarieren: typedef Int8 = int[8];.

Dies kann leicht durch Strukturen erreicht werden. Wir werden die Sache nicht verkomplizieren.

struct Int8 { int arr[8]; };
 
Renat:

Dies lässt sich leicht durch Strukturen erreichen. Wir wollen es nicht zu kompliziert machen.

Toll, einfach, das machen wir! Aber was brauche ich? Eine einfache Sache?

Glauben Sie nicht, dass Ihr Rasiermesser Occam und unser (Benutzer) Occams Rasiermesser zwei sehr unterschiedliche Rasiermesser sind. Sie mit Ihrem Minimalismus neigen dazu, einen solchen Überschuss an Benutzern zu schaffen, dass es an der Zeit ist, Occam an den nächsten Zaun zu hängen.

Wenn Sie so viel Wert auf Einfachheit legen, dann machen Sie es möglich, gewöhnliche Subarrays an Funktionen zu übergeben! Jeder wird glücklich sein, und Minimalisten sind glücklich.

// Übrigens funktioniert es auch in F4 - auch für dynamische. :)

 
Renat:
Statisch, versteht sich.
Nun, da haben Sie es. Zu spät, um nachzusehen :/
 
MetaDriver:

Oh, toll, das ist einfach, das machen wir! Aber was brauche ich? In der Ebene ?

Die von mir vorgeschlagenen Strukturen sind eine Standardmethode zur Schaffung neuer Einheiten.

Es gibt keinen Grund, sich wegen nichts aufzuregen.

 
MetaDriver:

Derzeit müssen wir in mql5 eine Menge zusätzlicher Schritte machen und eine Menge krummen Code schreiben, weil es nicht möglich ist, Subarrays an Funktionen zu übergeben.

Sie sprechen von Zeigern auf unkontrollierte Teile des Speichers, was in MQL5 völlig verboten ist.

In MQL5 muss jedes Objekt/jeder Typ kontrollierbar sein - dies ist eine direkte Voraussetzung für die Sicherheit der Sprache.

Wenn Sie einen Teil eines Arrays übergeben müssen, sollten Sie die Übergabe einer Referenz auf das Array selbst und seine Position verwenden. Damit haben Sie die volle Kontrolle über das Array selbst.

 
Renat:

Sie sprechen von Zeigern auf unkontrollierbare Speicherabschnitte, was in MQL5 völlig verboten ist.

In MQL5 muss jedes Objekt/jeder Typ kontrollierbar sein - dies ist eine direkte Voraussetzung für die Sicherheit der Sprache.

2. wenn Sie einen Teil eines Arrays übergeben wollen, verwenden Sie die Übergabe einer Referenz auf das Array selbst und die Position im Array. Dies ermöglicht die vollständige Kontrolle über das Array selbst.

Darüber hinaus ist dies die einzige Stelle, an der keine Namensgebung erfolgt, so dass sie sich gut in die Ideologie der Universalisierung von Spracheinheiten einfügt.

2. Trotzdem: Erstens ist es schief, und zweitens ist es überhaupt nicht universell. Schlagen Sie einen Weg vor,(1) ein zweidimensionales mql-Array in einen OpenCL-Puffer zu kopieren, ohne es unnötig umzuschreiben und in Strukturen zu wickeln, oder(2) Ihre eigene Funktion ArrayCopy(...) für nicht-uniforme Arrays zu verwenden (für Geschwindigkeit).

// Entschuldigen Sie die Abruptheit des letzten Beitrags. Wirklich unnötig. Ich habe mich aufgeregt, als es hieß: "Wir wollen die Dinge nicht komplizieren". Denn das führt nur zu Komplikationen.

2a: Ich denke, Ihre "Eindimensionalitätsbeschränkung" für Funktionen wie ArrayCopy() kann in vielen Fällen mit einer elementaren Klausel in den Kommentaren schmerzlos aufgeweicht werden: "Die Funktion funktioniert auch mit mehrdimensionalen Arrays, solange das mehrdimensionale Array vollständig kopiert wird. "

Eine Menge Probleme würden verschwinden. // Aber natürlich nicht alle.

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

Das war mein Vorschlag, eine Benennung und damit eine starre Typisierung einzuführen, zumal dies die einzige Stelle ist, die nicht durch eine Benennung abgedeckt ist und daher gut zur Ideologie der Universalisierung von Spracheinheiten passt.

Ich fürchte, Sie wollten die Zufälligkeit der Beschreibung nicht bemerken:

typedef Int8 = int[8];
struct   Int8 { int arr[8]; };

Der zweite Weg ist viel sauberer, leistungsfähiger und kontrollierbarer. Es gibt keinen Grund, mit der bestehenden Methode eine weitere, schwächere zu erfinden.

2. das Gleiche zu tun. Trotzdem: Erstens ist es schief, und zweitens ist es überhaupt nicht universell. Schlagen Sie einen Weg vor,(1) ein zweidimensionales mql-Array in einen OpenCL-Puffer zu kopieren, ohne es unnötig umzuschreiben und in Strukturen zu wickeln, oder(2) Ihre eigene Funktion ArrayCopy(...) für nicht-dimensionale Arrays zu verwenden (für Geschwindigkeit).

Erstens: Sie ist nicht krumm. Zweitens ist die Sicherheit höher als bei allen Optimierungsmethoden im Stil des direkten unkontrollierten Speicherzugriffs. Das heißt, die Frage "wie kann ich einen binären Block direkt in eine überwachte Entität gießen" ist eine allgemeine und grundlegende (schlecht lösbare) Frage für alle Sprachen.

Wenn Sie mit Array-Transfers zwischen verschiedenen Systemen (in OpenCL) umgehen müssen, ist es wichtig, über eine einfache und direkt kompatible Datenstruktur nachzudenken.

Sehen Sie sich die einfachste Klasse CLBufferWrite an, die durch mehrere Typen von Funktionen gebunden ist und eine einfache Datenübertragung ermöglicht.

Dateien:
 
Renat:

Sie sprechen von Zeigern auf unkontrollierte Teile des Speichers, was in MQL5 völlig verboten ist.

Und nebenbei bemerkt, Sie verdichten. Der Compiler kennt die Größe des übergebenen Arrays an der Stelle, an der der Parameter übergeben wird.

Es wird sogar eine Fehlermeldung ausgegeben, wenn dies versucht wird. :) Eine andere Sache ist, dass man bei jedem Funktionsaufruf eine zusätzliche implizite Parametrisierung einführen müsste (ungefähr so, wie Sie mir raten, es explizit zu tun). Aber die Lösung auf Ihrer Seite wäre viel universeller - zum Beispiel durch die Verwendung Ihrer eigenen Standardbibliothek von Funktionen und Objekten. Das gleiche ArrayCopy() und FileWriteArray() würde ohne Probleme funktionieren.

Документация по MQL5: Основы языка / Функции / Передача параметров
Документация по MQL5: Основы языка / Функции / Передача параметров
  • www.mql5.com
Основы языка / Функции / Передача параметров - Документация по MQL5
 
papaklass:
Sie können Ihre Aussagen mit einfachen Beispielen untermauern, für Leute wie mich. MetaDriver versteht Sie, aber Leute wie ich verstehen ohne Beispiele nicht, worüber wir reden? Und Sie wollen wissen, was vor sich geht.

Ich fürchte, dies wird ein Ersatz für die Dokumentation sein. Schauen Sie in einer Suchmaschine nach - es gibt einfach eine Menge Informationen.

Sicherer Zugang zu einigen Array-Mitgliedern:

void MyFunc(double& array[],uint pos,uint size)
  {
   while(size>0)
     {
      Print("[",pos,"] = ",array[pos]);
      pos++;
      size--;
     }
  }

Da der Compiler für Inline-Funktionen sehr geschärft ist, kann die Funktion vollständig in die Aufrufstelle eingebaut werden und der gesamte Overhead wird auf Null reduziert.

Das bedeutet, dass Sie in MQL5 keine Angst haben müssen, kleine "korrekte" Funktionen zu schreiben - sie haben ein standardmäßiges volles Inline-Schicksal mit der entsprechenden Optimierung.

Dies bedeutet, dass die Kosten für die Parameterübertragung und die Indizierung reduziert werden.

 
MetaDriver:

Und nebenbei bemerkt, Sie verdichten. Der Compiler kennt die Größe des übergebenen Arrays zum Zeitpunkt der Parameterübergabe.

Seit wann sind alle Arrays statisch, ebenso wie alle Indizes und Größen?

Da Arrays fast immer dynamisch sind und Indizes Variablen sind, können wir zum Zeitpunkt des Aufrufs keine ernsthaften statischen Prüfungen durchführen. Sie müssen nur Meta-/Rtti-Prüfungen durchführen, und deshalb ist es so wichtig, dass Sie Zugriff auf das gesamte Objekt/die gesamte Beschreibung haben und nicht willkürlich mit einem Teil des Speichers arbeiten.


Die gleichen ArrayCopy() und FileWriteArray() würden ohne Probleme funktionieren.

Machen Sie sich keine Sorgen, alles ist von langer Hand geplant worden.

Die Folgen eines Verstoßes gegen die Sicherheitsgrundsätze, die wir sehr gut kennen, sind die "im April haben wir 12 weitere kritische Fehler behoben, um aus der virtuellen Maschine auszubrechen und die Kontrolle über das System zu erlangen".