Bibliotheken: Abbildungsdateien ohne DLL - Seite 5

 
baramantan:

Ich bin kein Megaprogrammierer. Aber ich verstehe nicht, wo die Universalität ist? uchar kann nicht universell sein, weil es den Benutzer einschränkt, nämlich: uchar ist nur für positive Werte. Der Minimalwert ist Null, der Maximalwert ist 255.

Alle Daten, die über den Wert von uchar hinausgehen, werden gleich dem Höchst- oder Mindestwert von uchar.

Ausgehend von dem, was ich gesagt habe, habe ich von Anfang an gefragt, "wie man int oder double übergibt". Ich kann Ihnen nicht folgen, Chef.

OK. Machen wir einen kleinen Rundgang.

1. nehmen wir das Beispiel von char und uchar. Beide Variablen sind 1 Byte groß.

Das bedeutet, dass wir bei der Zuweisung aneinander keine Bytes verlieren und somit auch nicht den Wert der ursprünglichen Daten.

Betrachten Sie diese Ausdrücke

uchar u=200; char c=u; u=c; Print(u);
c=-100; u=c; c=u; Print(c);

Das Gleiche gilt für long/ulong, int/uint.

Das heißt, Variablen vom Typ Integer, die die gleiche Größe in Bytes haben, können aneinander übergeben werden, ohne dass Bytes an Informationen verloren gehen.

Das bedeutet übrigens, dass der Expert Advisor zwar MAGIC-Zahlen vom Typ ulong akzeptiert, Sie können sie in Ihren Programmen aber immer im long, also im vorzeichenbehafteten Format, setzen und lesen


2. Schauen Sie sich nun <some_type> und uchar an.
Zum Beispiel int. Wie Sie von sizeof(int) wissen, hat es eine Größe von 4 Bytes. Das bedeutet, dass diese 4 Bytes im Speicher einfach als uchar[4] array
dargestellt werden können. Wenn es ein double gibt (es ist 8 Bytes groß), kann es als uchar[8] array
dargestellt werden. Dies gilt auch für Bytes von Strings - in MQL ist es ushort array.
gut und dementsprechend können Sie, wenn Sie eine Struktur eines beliebigen Typs haben, einfach alle Daten als uchar array bereitstellen.

Es sind diese grundlegenden Konzepte über Bytes, die in der MQL5-Version verwendet werden - virtuelle Dateien im Speicher CFastFile. Es speichert alle Daten in der uchar-Array-Speicher.

Das heißt, wenn Sie nicht brauchen, um Daten mit externen Programmen auszutauschen. Oder Sie erhalten Daten von einem anderen Programm in Form eines Datenstroms - zum Beispiel, das Lesen von Internet-Seiten, und diese Daten nicht brauchen, um alle auf der Festplatte zu speichern, dann ist es besser, CFastFile anstelle der Windows-Mapping verwenden.

und schließlich, um https://www.mql5.com/de/articles/364 vollständig zu konsolidieren .

 
BoraBo:

MT5 642 Win7 64 funktioniert nicht, soweit ich es verstehe, nach

hmem=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,size+HEAD_MEM,path); // Speicherobjekt erstellen

Ich erhalte Fehler 1400,

aber Vista 32 funktioniert.


es liegt an den unterschiedlichen Zeigergrößen in 32 und 64 Systemen

Diese Bibliotheksdatei ist für ein 32-Bit-Terminal gedacht.

aber wenn Sie ein 64-Bit-Terminal verwenden, sollten Sie 8-Byte-Long-Typ an allen Stellen, wo ein Zeiger impliziert ist (z. B. PBYTE, LPVOID, etc., und in allen memcpy-Typen) setzen.

 

aber wie stelle ich die Verbindung her?

#include <MemMapLib.mqh>
#include <Trade\Trade.mqh> 

Es kommt raus.

'GetLastError' - ambiguous call to overloaded function with the same parameters SymbolInfo.mqh  718     10
'GetLastError' - ambiguous call to overloaded function with the same parameters	SymbolInfo.mqh	725	57

und diese beiden Einlagen funktionieren auch ohne einander.

 
olyakish:

aber wie stelle ich die Verbindung her?

Es kommt heraus.

und diese beiden Einschlüsse funktionieren auch ohne einander.

versuchen, die Kontextauflösung zu verwenden ::
 
sergeev:
versuchen, die Kontextauflösung zu verwenden ::

Danke

Ich musste nur die Standardbibliothek ändern .

//+------------------------------------------------------------------+
bool CSymbolInfo::CheckMarketWatch(void)
  {
//--- prüfen, ob das Symbol im MarketWatch ausgewählt ist
   if(!Select())
     {
      if(::GetLastError()==ERR_MARKET_UNKNOWN_SYMBOL)
        {
         printf(__FUNCTION__+": Unknown symbol '%s'",m_name);
         return(false);
        }
      if(!Select(true))
        {
         printf(__FUNCTION__+": Error adding symbol %d",::GetLastError());
         return(false);
        }
     }
//--- erfolgreich
   return(true);
  }
//+------------------------------------------------------------------+
Ich glaube nicht, dass das eine gute Sache ist....
 
olyakish:

Ich danke Ihnen.

Ich musste nur die Standardbibliothek ändern .

Ich denke nicht, dass das eine gute Sache ist.

Sie verstehen das nicht.

Ich habe Ihnen von kernel32::GetLastError erzählt . Schauen Sie, wie es in meinem Code implementiert ist.

Wenn Sie mit dieser Option nicht zufrieden sind, dann deklarieren Sie den Import von kernel32 GetLastError zum Beispiel mit dem Parameter int.

 
sergeev:

Sie verstehen das nicht.

Ich habe Ihnen von kernel32::GetLastError erzählt . Schauen Sie, wie es in meinem Code implementiert ist.

Wenn Ihnen diese Option nicht zusagt, dann deklarieren Sie den Import von kernel32 ::GetLastError zum Beispiel mit dem Parameter int. Es wird keinen Unterschied beim Aufruf geben, aber Sie vermeiden einen Konflikt.

Vielleicht habe ich es nicht richtig ausgedrückt.

aber wir müssen

denn hier ist ein Beispiel für Ihren Code mit der Standardbibliothek angehängt.

//+------------------------------------------------------------------+
//|MemMap |
//| Copyright © 2006-2013, FINEXWARE Technologies GmbH |
//| www.FINEXWARE.com |
//| Programmierung & Entwicklung - Alexey Sergeev, Boris Gershanov |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006-2013, FINEXWARE Technologies GmbH"
#property link      "www.FINEXWARE.com"
#property version   "1.00"
#include <MemMapLib.mqh>
#include <Trade\Trade.mqh> 


//------------------------------------------------------------------ OnStart
void OnStart()
{
        CMemMapFile hmem;
        long err=hmem.Open("Local\\test",111,modeCreate);
        
        uchar data[];
        StringToCharArray("Hello from MQL5!",data);
        err=hmem.Write(data,ArraySize(data));
        
        ArrayInitialize(data,0);
        hmem.Seek(0,SEEK_SET);
        err=hmem.Read(data,ArraySize(data));
        Print(CharArrayToString(data));
        
        hmem.Close();
}

Beim Kompilieren gibt es die gleichen Fehler.

 

olyakish, lesen Sie noch einmal genau, was ich Ihnen geschrieben habe.

Wenn Sie mit dem Kontext nicht zufrieden sind, sage ich Ihnen genau, was ich meine.

  • "oder was Sie für Ihre Bibliothek ändern müssen".
 
sergeev:

Sie verstehen das nicht.

Ich habe Ihnen von kernel32::GetLastError erzählt . Schauen Sie, wie es in meinem Code implementiert ist.

Wenn Ihnen diese Option nicht zusagt, dann deklarieren Sie den Import von kernel32 ::GetLastError zum Beispiel mit dem Parameter int.

Wenn Sie kernel32::GetLastError mit seinem Kontext im Code aufrufen , wird der Compiler GetLastError ohne Kontextaufrufen.

Programmierer müssen es nur zur Regel machen, MQL-Analoga von Standard-WinAPI-Funktionen mit Kontext aufzurufen. Dann gibt es bei späteren Änderungen keine Probleme mehr.

Wenn Sie also die Standardbibel korrigieren, wird sie aktualisiert, so dass Sie sie erneut bearbeiten müssen.

 
Urain:

Wenn Sie also die Standardbibel korrigieren, wird sie aktualisiert, und Sie müssen sie erneut bearbeiten.

Die Standardbibel ist die Standardbibel, also gibt es da nichts zu tun, auf keinen Fall. Es gibt einen Fehler - melden Sie ihn den Entwicklern. Es gibt keinen anderen Weg.