Hilfe bei der Lösung eines Problems beim Importieren einer Funktion aus einer DLL - Seite 3
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Danken Sie nicht :-). Sie werden alles selbst machen :-).
Er hat die Schritte Schritt für Schritt beschrieben:
.
#1 (Testen Sie einen, Sie müssen es nicht tun ;-) :
Erstellen Sie in C++ eine Matrix mit der Anzahl der Zeilen MAX_ROW = 5...10, der Spalten MAX_COL = 5...10 (Zahlen zufällig).
Zufällig mit Daten gefüllt werden.
.
#2 (Test eins, den du nicht machen musst ;-) : Löse die folgende Aufgabe:
Die Matrix aus Schritt 1 muss in eindimensionaler Form dargestellt werden.
Erstellung eines eindimensionalen Arrays double mit der Größe = MAX_ROW*MAX_COL, in dem die Daten nach der folgenden Formel gespeichert werden
for(Zeile = 0 ... MAX_COL-1)
for(Spalte = 0 ... MAX_COL-1)
array[line*MAX_COL + column] = data[line][column];
.
#3: Lösen Sie die folgende Aufgabe / als Funktion
Sie erhalten ein eindimensionales Array double aus Schritt (2), die Anzahl der Zeilen und Spalten.
Sie müssen die Daten aus diesem Array in ein ap::real_2d_array-Objekt einfügen
.
#4: Sie erhalten das ap::real_2d_array / Objekt als Funktion
Sie müssen es in ein eindimensionales Array double umwandeln und die Anzahl der Zeilen und Spalten ermitteln.
.
#5 (einen Test müssen Sie nicht machen ;-) :
Sie müssen das eindimensionale Feld in eine zweidimensionale Matrix umwandeln (wie in Schritt 1).
Vergleichen Sie die resultierende Matrix mit der ursprünglichen Matrix aus Schritt 1.
Im Falle einer Unstimmigkeit, finden Sie es heraus.
.
Die wichtigsten Funktionen, die benötigt werden, sind die Funktionen 3 und 4.
Schritte 1,2 = Training, Sie müssen die Daten auf diese Weise in Mql packen, Schritt 5 = Test.
.
Im Allgemeinen würde ich für jeden der 5 Schritte Funktionen erstellen.
.
Singuläre Transformation in Mql.
https://www.mql5.com/ru/code/7359
Vielen Dank für die detaillierte Aufschlüsselung der Funktionsweise dieses singulären Zerlegungsalgorithmus. Die Punkte 1-3 werden umgesetzt. Das Problem bleibt bei Punkt 4, denn ich bin noch nicht in der Lage, eine funktionierende DLL mit der Exportfunktion rmatrixsvd(...) zu erstellen, wie ich zuvor geschrieben habe,
wegen des Hinzufügens von extern "C" bool __declspec(dllexport) __stdcall rmatrixsvd(...) zum ursprünglichen C++-Code, erhalte ich Fehler... Obwohl, wenn Sie nur bool rmatrixsvd(...) kompilieren, gibt es keine Fehler... aber ich brauche eine exportierbare Funktion... Das ist der Punkt, an dem es verwirrend wird...
Vielen Dank für die Hilfe.
Zu Punkt 4 (und allen anderen). rmatrixsvd hat damit nichts zu tun.
Auch der Algorithmus zur singulären Zerlegung tut dies nicht. Diese Punkte beziehen sich auf
zum Senden/Empfangen von Daten von/zu Dll.
.
Die Prototyp-Funktion, die für item geschrieben werden soll. 4:
void Convert_real_2d_array_to_double(
const ap::real_2d_array & arr,
double * Daten,
int & Zeilen,
int & Spalten
);
.
Das heißt, Sie müssen lernen, wie Sie die Anzahl der Zeilen, Spalten und Daten von ap::real_2d_array erhalten.
.
Hiervon:
const ap::real_2d_array & arr
---->>>
besorgen:
double * Daten,
int & Zeilen,
int & Spalten
Nochmals herzlichen Dank für Ihre Zeit.
Ich habe wieder einmal alle Beiträge sehr aufmerksam gelesen und es sieht so aus, als ob ich endlich herausgefunden habe, was zu tun ist :-).
In der Tat ist die Funktion rmatrixsvd selbst eine Art "Arbeitspferd" in diesem Bereich, und Sie müssen nicht versuchen, sie zu exportieren,
Sie müssen die Ladung nur rechtzeitig auf den Wagen legen und sie dann bei der Lieferung ordentlich an der richtigen Stelle abladen.
zu seinem Ziel, bildlich gesprochen. Verstehe ich Sie jetzt richtig?
Mit anderen Worten, ich muss diese Datenkonverter (3 und 4) in C++ machen und mit ihnen in MQL arbeiten, d. h. sie sollten in MQL deklariert werden, und in DLL sie
als exportierbar deklariert werden, so dass Metatrader sie verwenden kann. Verstehe ich mein Problem richtig?
Wenn ja, und ich glaube, ich verstehe Sie jetzt, ist das sogar noch besser, denn ich war mir nicht sicher, wie man 2D- und 1D-Arrays miteinander verknüpft.
Außerdem können Sie Array nicht als[ ][ ] in MQL deklarieren, oder? D.h. das Array sollte zumindest als a[ ][100] deklariert werden. Ist das so? Oder irre ich mich?
Und das ist nicht sehr praktisch, weil man vorher nicht weiß, welche Dimension ein zweidimensionales Array haben wird, und es ist nicht der beste Weg, Speicher für ein Array im Voraus zu reservieren,
Aber in C++ gibt es dieses Problem nicht... Ein zweidimensionales Array kann also im übertragenen Sinne als "Gummi" bezeichnet werden. Ist das so? Oder gibt es auch in C++ einige Feinheiten?
Ich würde Sie auch gerne zu Borland Builder 2009 befragen. Vielleicht ist sie nicht so fehlerhaft wie die 6. Ist es überhaupt möglich, damit zu arbeiten?
Weil alsu gesagt hat, dass er ein Zurückgebliebener ist, soweit ich weiß. :-) Aber soweit ich verstanden habe, programmieren Sie mit Visual Studio? Ist es cooler? Und das ohne Pannen? Was ist die aktuellste Version im Moment?
Ich bin froh, dass ich mit Ihrer Hilfe meinem Problem auf den Grund gegangen bin. Jetzt werde ich versuchen, das alles umzusetzen...
Vor allem, da Sie nicht deklarieren können Array als a[ ][ ] in MQL, können Sie? Das heißt, Sie sollten es zumindest als[ ][100] deklarieren. Ist das so, oder irre ich mich?
Und das ist nicht sehr praktisch, weil man vorher nicht weiß, welche Dimension ein zweidimensionales Array haben wird, und es ist nicht der beste Weg, Speicher für ein Array im Voraus zu reservieren,
Großartig! :-) Ich bin sehr froh, dass der Prozess vorankommt :-).
.
Natürlich können Sie in Mql4 auch zweidimensionale Arrays deklarieren.
Und auf die gleiche Weise können Sie Funktionen aus einer DLL importieren
#import myLib
void showMatrix(double & array[][], int rows, int cols);
#import
.
Aber es gibt hier eine Nuance: In C deklarieren wir eine Funktion, die ein eindimensionales Array akzeptiert,
die Anzahl der Zeilen und Spalten void showMatrix(double *array, int rows, int cols);
Und das Array funktioniert als eindimensionales Array, dessen Adressierung in einer Schleife angeordnet ist:
for(Zeile = 0 ... MAX_COL-1)
for(Spalte = 0 ... MAX_COL-1)
array[line*MAX_COL + column] = data[line][column];
.
Das heißt, Mql wirft ein zweidimensionales Array mit einem kontinuierlichen Puffer.
.
Treten Sie nur nicht auf dieselbe Harke - die Funktionen aus Schritt 3 und 4 werden innerhalb Ihrer Dll verwendet,
innerhalb der Schnittstellenfunktion des Dll-ins, die die eindimensionalen Arrays mit der Anzahl der Zeilen/Spalten von Mql übernimmt.
Es konvertiert sie in ap::real_2d_array und übergibt sie an rmatrixsvd
und legt das Ergebnis in den Ausgabepuffer, der die richtige Zeile und Spalte haben muss
muss korrekt sein.
.
Der Ausgabepuffer sollte natürlich im Voraus reserviert werden - dies sollte in Mql geschehen.
Und wenn die Abmessungen nicht bekannt sind, dann sollten Sie meiner Meinung nach die
ein eindimensionales Feld mit hoher Dimensionalität, zum Beispiel
double out[2500];
und ein Ein-Element-Array für Ausgabewerte - Anzahl der Zeilen/Spalten
double raws[1];
double cols[1];
.
Visual Studio ist cooler. Vor allem mit Visual Assist. Ich weiß nicht, wie STL in Debuilder funktioniert. Es gibt fast 100%ige Probleme mit Unicode.
Die Hilfe des Win SDK ist nicht mit MSDN vergleichbar. Gerüchten zufolge soll der Borland-Compiler zur Integration mit Delphi
für die Pluspunkte hat keine positiven Veränderungen erfahren.
.
Und die Arbeit mit dem Gedächtnis ist ein Thema für einen Kurs.
Theoretisch scheint alles klar zu sein, ich werde mich an die Umsetzung machen, und dann werden wir sehen :-). "Die Augen haben Angst, aber die Hände machen die Arbeit..."
Nochmals vielen Dank für die wertvollen Hinweise. Ich würde diesen Algorithmus wirklich gerne implementieren... Wie üblich ist die Idee strategisch bereits weit fortgeschritten, aber taktisch und praktisch
Das muss ich noch nachholen. Ich hoffe, ich werde es schaffen. Wenn ich irgendwelche Fragen habe, zögern Sie bitte nicht, mir mit Ratschlägen zu helfen. Ich danke Ihnen!
Ich möchte noch einmal auf die Dimensionalität von dynamischen Arrays hinweisen.
In MQL kann ein eindimensionales Array als array[ ] definiert werden, und dann, wenn das Programm die Dimension N des Arrays kennt,
können Sie die Funktion ArrayResize(array, N) verwenden. Ein zweidimensionales Feld kann nur als array[ ][100] definiert werden, d. h. die zweite Dimensionalität
sollte trotzdem bekannt sein, und wenn man es nicht weiß, sollte man das Maximum nehmen, damit es auf jeden Fall ausreicht. Sie können in MQL definieren
Der Compiler wird sich nicht darüber beschweren, aber die Funktion ArrayResize setzt eine neue Größe in der ersten Array-Dimension ,
Für die zweite Dimension gibt es in MQL keine solche Funktion. Wenn Sie ein zweidimensionales Array array array[N][M] definieren, gibt der Compiler eine Fehlermeldung aus
eine ganze Zahl, d.h. die Dimensionalität sollte vorher festgelegt werden, zumindest die zweite Array-Dimension.
Ist es in C++ dasselbe? Es gibt keine Möglichkeit, dem zu entkommen, nicht wahr? Ich möchte das noch einmal klarstellen.
Die singuläre Zerlegung verwendet die AP-Bibliothek für C++ (Beschreibung in der beigefügten Datei). Es gibt darin einige Funktionen, die, soweit ich es verstanden habe, folgende Probleme lösen
Probleme der dynamischen ersten und zweiten Dimension von Arrays. Kann ich sie in meinem Fall innerhalb der DLL beim Schreiben von Datenkonvertern verwenden?
void setbounds(int iLow1, int iHigh1, int iLow2, int iHigh2)
Weisen Sie dem Array Speicher zu. Dies löscht den alten Array-Inhalt und gibt den dafür zugewiesenen Speicher frei, dann wird ein neuer separater Speicherbereich mit der Größe von (iHigh1-iLow1+1)*(iHigh2-iLow2+1) Elementen zugewiesen.
Die Nummerierung der Elemente in einem neuen Array durch die erste Dimension beginnt mit iLow1 und endet mit iHigh1, dasselbe gilt für die zweite Dimension.
Der Inhalt des neuen Arrays ist nicht definiert.
Außerdem gibt es die folgende Funktion:
void setcontent(int iLow1, int iHigh1, int iLow2, int iHigh2, const T *pContent)
Die Methode ähnelt der setbounds()-Methode, mit dem Unterschied, dass der Inhalt des Arrays pContent[] nach der Speicherzuweisung dorthin kopiert wird.
Das Array pContent enthält ein zweidimensionales Array, das zeilenweise geschrieben wird, d.h. das Element [iLow1, iLow2] kommt zuerst, dann [iLow1, iLow2+1] usw.
Wenn ich richtig verstanden habe, ist dies genau die Funktion, die ich brauche, d.h. sie wandelt ein eindimensionales Array in ein zweidimensionales um, d.h. sie ist im Wesentlichen ein Konverter.
Habe ich es richtig verstanden?
AP-Bibliothek für C++
MQL: Bei eindimensionalen Systemen können wir die Dimensionen nach Belieben ändern, ja. Dann erhalten wir alles durch Indizes (line * MAX_COL + col).
Bei zweidimensionalen Bildern ist die 2. Dimension fest. Das heißt, wir können die Matrixelemente [15][32] nicht aus dem Feld a[100][100] lesen.
.
Und ich schlage vor, dass Sie prüfen, wie die Funktionen der AP-Bibliothek funktionieren.
Bleiben Sie nicht bei der Dll stehen. Schreiben Sie eine Exe-Datei, sie ist einfacher auszuführen und zu debuggen.
Fügen Sie den Debug-Druck ein.
Ratschläge kann ich sicherlich geben - aber um Ratschläge zu geben, muss man sie testen.
Testcode schreiben.
.
Was den Inhalt des Arrays und der Variablen betrifft, so spielt es keine Rolle, wo -
machen Sie es besser zur Regel, sie zwangsweise und rigide zu initialisieren.