Alle Fragen von einem PROFI an einen SUPER PROFI - 1. - Seite 3

 
Heilige Einfachheit (c) Jan Hus
 
Sorento:
Heilige Einfachheit (c) Jan Hus

Wie meinen Sie das?
 
drknn:

Wie meinen Sie das?

So einfach ist das nicht.

jetzt innerhalb der Funktion - mit der übergebenen Variablen arbeiten.

Wie uns die Mathematik lehrt - wenn man eine Pseudovariable per Adresse weitergibt, sind alle Wunder darin verschwunden.

Aber wenn der Adresspool mit Konstanten ausgekleidet ist, sieht alles anders aus.

0 wird zu 1 und umgekehrt.

;)

 
Wozu braucht man solche Komplikationen in einem EA/Indikator/Skript, wie z. B. die Übergabe einer Variablen per Adresse? Was verstehen Sie unter den Begriffen: Pseudovariable, Adresspool und konstante Ausrichtung?
 
drknn:
Wozu braucht man in einem EA/Indikator/Skript solche Komplexitäten, wie die Übergabe einer Variablen per Adresse? Was verstehen Sie unter den Begriffen: Pseudovariable, Adresspool und konstante Ausrichtung?

Compiler und Interpreter sind ähnlich.

Denken Sie also darüber nach.

Wie werden Parameter (Variablen) an eine Funktion übergeben, und wenn ein Ausdruck an eine Funktion übergeben wird...

;)

 
Sorento:

Auch ich habe meine Zweifel.

Ich gebe nicht vor, ein Superprofi zu sein, ich erreiche nicht das Niveau eines Profis - niemand liest Nachrichten... das ist für das Auge des Pferdes klar.

Aber je mehr ich Code schreibe (bisher nicht viel), desto mehr stellt sich eine Frage:

Wie werden Parameter in Funktionen übergeben?

(nach Namen oder nach Wert?)

Ich habe den Verdacht, dass String-Variablen bei der Übergabe zittrig werden...

;)


Ich halte mich zwar nicht für einen Profi oder einen Superprofi, aber ich werde versuchen, zu antworten :).

MT ist in C2C++ implementiert, und den Entwicklern wird empfohlen, bei Unklarheiten die Standards dieser Sprache zu Rate zu ziehen.

Gemäß dem C2C++-Standard werden alle Parameter mit Ausnahme von Arrays als Wert übergeben, auch Ausdrücke. Das heißt, es werden Kopien von Parametern übergeben: Die Änderung eines Parameters, der als Wert innerhalb einer aufgerufenen Funktion übergeben wird, führt nicht dazu, dass der Parameter in der externen aufrufenden Funktion geändert wird. Wenn die Änderung erforderlich ist, muss sie per Referenz (per Adresse) übergeben werden, d. h. es wird die Adresse übergeben, an der sich die als Parameter übergebene Variable befindet. Dann kann der Wert, der sich an dieser Adresse befindet, geändert werden, die Adresse kann nicht geändert werden. Alle Arrays werden per Referenz übergeben, d. h. die Adressen werden sofort übergeben: Andernfalls müsste eine riesige Datenmenge über den Stack kopiert werden.

Um zu verhindern, dass ein per Referenz übergebener Parameter innerhalb der aufgerufenen Funktion geändert wird, verwendet C/C++ den Modifikator const.

In C2C++ sind Strings Zeichenarrays, mit einem Unterschied: ein solches Array muss mit dem String-Terminator '\0' enden.

In MCL ist eine Zeichenkette eine Struktur, die die Größe und den Zeiger auf die Zeichenkette (d. h. das Zeichenketten-Array selbst) enthält, wenn man den Beispielen glauben kann.

Dieses Beispiel ist für C2C++ :

//----
struct MqlStr
  {
   int               len;
   char             *string;
  };

Hier ist char * ein Zeiger auf eine Variable vom Zeichentyp (char type). Der Zeigertyp selbst (char*, int*, double*.......) ist immer eine Ganzzahl - es ist eine Zelladresse. Das bedeutet, dass die Variable keine Zeichenkette, sondern eine Zelladresse speichert. Der Wert des Zeichens selbst kann wie folgt abgefragt werden: *String oder string[0]. Um zu funktionieren, sollten wir immer Speicher für ein Array zuweisen, es sei denn, es ist statisch angeordnet, d.h. seine Größe ist nicht in der Beschreibung angegeben, z.B:

char string[1025] ;

ist eine Reihe von Zeichen mit 1025 Elementen.... Wenn das letzte Zeichen (string[1024]='\0'), könnte das Array als eine Zeichenkette mit 1024 Zeichen behandelt werden.

String-Elemente können als Elemente des üblichen Arrays string[i] empfangen werden. Beim dynamischen Platzieren wird einem String + 1 Element zugewiesen und das letzte Zeichen am Ende des Strings ist......

Dementsprechend wird die Zeichenkette immer als Referenz übergeben. Ob es verboten ist, sie zu ändern, hängt von der ICL-Implementierung ab und kann anhand eines Beispiels überprüft werden: Übergeben Sie eine Zeichenkette an die Funktion, ändern Sie dort den Wert und lesen Sie ihn (diesen Wert) nach Beendigung der aufgerufenen Funktion.

Viel Glück!

 
VladislavVG:

Dementsprechend wird die Zeichenkette immer als Referenz übergeben. Ob sie geändert werden können, hängt von der MCL-Implementierung ab und kann anhand eines Beispiels überprüft werden: Übergeben Sie eine Zeichenkette an eine Funktion, ändern Sie dort den Wert und lesen Sie ihn (diesen Wert) nach Beendigung der aufgerufenen Funktion.

Änderungen sind nicht verboten. Geprüft.
 
drknn:

Ach, Quatsch. Es muss eine Frage für Entwickler sein, oder es ist nicht alles in Ordnung in der DLL. Ich bin kein C++-Programmierer - ich habe einmal versucht, ein paar Programme zu erstellen, und festgestellt, dass alles funktioniert, solange man eine C++-Shell installiert hat. Aber sobald Sie die ausführbare Datei auf einen anderen Computer übertragen, sobald Sie das Fehlen einiger DLL-Zyklen feststellen. Ich arbeite auch nicht gerne mit Strings. Ich habe diese Sprache aufgegeben und mich für Delphi entschieden. Vielleicht können Sie versuchen, Ihre dll auf sie zu machen - solche dlls sind ganz normal mit dem Terminal...

P.S.

Ich verstehe also nicht, warum alle C++ so sehr loben, wenn schon bei der Auswahl einer Shell für die Programmierung Probleme mit dieser Sprache auftreten...

Das Problem ist, dass alle Bibliotheken und Skripte mit diesen Bibliotheken gut funktionieren, wenn Sie sie manuell in ein Diagramm laden. Sie funktionieren auch, wenn Sie sie programmgesteuert aus dem aktuellen Prozess in das Diagramm laden.

Das Problem tritt auf, wenn Sie sie von einem entfernten Prozess laden.

=====================================

Bezüglich der Übertragung des Codes auf einen anderen Computer. Wahrscheinlich haben Sie eine Debugger-Version migriert. Es zieht die Debugging-Bibliotheken aus Studio. Sie sollten die Freigabe kompiliert haben. Dann hätte alles überall funktioniert.

 
Es war falsch, es als Analogie zu bezeichnen.
 
TheXpert:
Es war falsch, es als Analogie zu bezeichnen.

Richtig. Ich habe sogar bei den Begriffen im Titel dieses Threads geblinzelt - ich hatte nicht bemerkt, dass die Namen unterschiedlich waren - meine Aufmerksamkeit war bereits auf ein bestimmtes Muster eingestellt.