Il mio approccio. Il nucleo è il motore. - pagina 94

 
Vitaly Muzichenko:

Bellissimo monologo)

Amleto si riposa).

 
Реter Konow:

Allora, cosa c'è che non va?

l'errore -

ERRARE_RISORSA_NON_TROVATA

https://www.mql5.com/ru/docs/runtime/resources

Leggi l'aiuto .

Citazione:

 Напомним, что для использования ресурса из mql5-программы его необходимо 
указывать в виде: <путь_имя_файла_EX5>::<имя_ресурса>.
 
Nikolai Semko:

https://www.mql5.com/ru/docs/runtime/resources

Leggi il riferimento .

Citazione:

Sì, l'ho capito. L'ho inserito male.

 
Реter Konow:
Ecco cosa pensavo. C'è un modo per usare risorse di altri programmi. Credo che la soluzione sia lì. Dovrò guardare nella documentazione.

Collegamento errato della risorsa.

È necessario specificare il percorso del programma di cui vogliamo leggere la risorsa.

Nell'Inite del programma di lettura, dovete impostare la connessione al file di risorse in un altro programma:

if(!ObjectSetString(0,"Resource",OBJPROP_BMPFILE,"\\Experts\\Tester EA.ex4::Resource"))Print("Resource is not connected!");

E quando leggete la risorsa, specificate anche il percorso completo:

if(!ResourceReadImage("\\Experts\\Tester EA.ex4::Resource",Data,width,height))Print("Failed to read resource!  ",GetLastError());

//--------------------------------------------

Ma c'è una nuova assurdità:

Quando si legge la risorsa, appaiono delle macchioline nella linea. Ecco il codice:

void OnTimer()
  {
//---
   uchar Arr[];
   uint Data[],width,height;
   //-----------------------------
   if(!ResourceReadImage("\\Experts\\Tester EA.ex4::Resource",Data,width,height))Print("Failed to read resource!  ",GetLastError());
   //-----------------------------
   ArrayCopy(Arr,Data);
   //-----------------------------
   string Message = CharArrayToString(Arr);
   //-----------------------------
   Print(Message);
  }

E la cosa strana è che se rimuoviamo l'Expert Advisor con la risorsa dal grafico, il programma di lettura continuerà a ricevere la risorsa. Questa risorsa avrà lo stesso testo rosso e la stessa spazzatura. La spazzatura è sempre diversa.

E come si dovrebbe affrontare?

ZS. Proverò a specificare diverse codifiche di pagina inCharArrayToString().

 

È interessante notare che la dimensione della linea di caratteri corsivi è la stessa della dimensione dell'array con il messaggio.

Ma, nel flusso di frange ci sono a volte lampi di valori Bid quasi esatti che sono scritti sul secondo lato. Sfarfallano una volta, e ci sono anche una o due frange al loro interno. Ma sono leggibili. E poi, di nuovo, un flusso di macchie.

Si scopre che sul lato mittente dell'evento di riempimento delle risorse, tutto è fatto correttamente. Poi, il lato di lettura accetta la risorsa, che è stata corrotta internamente e disseminata. Più velocemente chi legge legge il messaggio nella risorsa, più intatto sarà il messaggio.

Quindi avete bisogno di un'accurata sincronizzazione lettura/scrittura?


Caro fxsaber puoi chiarire cosa c'è di sbagliato qui?

Sto allegando i file:

File:
 
Реter Konow:

Caro fxsaber, puoi spiegare cosa c'è di sbagliato qui?

Molte persone qui vedono subito i vostri errori, ma preferiscono tacere perché è pieno di pericoli. E li capisco molto bene. Dico in anticipo che non risponderò dopo. Imparare a cercare i propri errori e costruire correttamente l'atteggiamento degli altri.


Al codice.

Si copia uint in uchar attraverso ArrayCopy - un errore.

CharArrayToString - questo funzionerà se le stringhe sono ANSI.


Risolvere le peculiarità della rappresentazione in byte dei tipi.

 
fxsaber:

Molte persone qui vedono subito i tuoi errori, ma preferiscono tacere perché è pieno di pericoli. E li capisco molto bene. Non risponderò dopo. Imparare a cercare i propri errori e costruire correttamente l'atteggiamento degli altri.


Al codice.

Si copia uint in uchar attraverso ArrayCopy - un errore.

CharArrayToString - questo funzionerà se le stringhe sono ANSI.


Cercate di capire le peculiarità della rappresentazione in byte dei tipi.

Quando le persone intorno a me rispettano le mie soluzioni, io rispetto le loro. Beh, non si può fare diversamente. Rispetto reciproco.

Secondo il codice. Grazie. Vedrò cosa posso fare.

 

Merda, non ne posso più. Ci ho messo mezza giornata per capirlo.

Ho già capito i sindacati. Ma questa soluzione è una stampella in un cubo. Lì hai ancora bisogno di operazioni in byte. Ma per i miei compiti, è completamente irrilevante.

È molto più facile lavorare con le descrizioni degli oggetti. È garantito e semplice. Ma non so se le risorse funzioneranno attraverso il tester. Non ne vale la pena.

Ecco una soluzione tramite i sindacati:

//+------------------------------------------------------------------+
//|                                                    Tester EA.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
union Char_Uint
  {
   uchar   Char[8];
   uint    Uint[2];  
   double  Double; 
  };
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   //----------------------------------------------
   if(!ObjectCreate(0,"Resource",OBJ_BITMAP_LABEL,0,0,0))Print("Object is not created!  ",GetLastError());
   else Print("Object created!");
   //-------------------------------
   if(!ObjectSetString(0,"Resource",OBJPROP_BMPFILE,"::Resource"))Print("BMPFILE is not created!");
   else Print("BMPFILE created!");
   //----------------------------------------------
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   
      
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //---------------------------
   Char_Uint u;
   //---------------------------
   u.Double = Bid;
   //---------------------------
   if(!ResourceCreate("::Resource",u.Uint,2,1,0,0,0,COLOR_FORMAT_XRGB_NOALPHA))Print("Resource is not created!");
   //---------------------------   
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   
  }
//+------------------------------------------------------------------+

E un indicatore di lettura:

//+------------------------------------------------------------------+
//|                                              Resource reader.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
union Char_Uint
  {
   uchar Char[8]; 
   uint  Uint[2]; 
  };
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   EventSetMillisecondTimer(5250); 
   
   if(!ObjectSetString(0,"Resource",OBJPROP_BMPFILE,"\\Experts\\Tester EA.ex4::Resource"))Print("Resource is not connected!");
   else Print("Resource connected!");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   Char_Uint u;
   uint width,height;
   string Message; 
   //-----------------------------
   if(!ResourceReadImage("\\Experts\\Tester EA.ex4::Resource",u.Uint,width,height))Print("Failed to read resource!  ",GetLastError());
   //-----------------------------
   Message = CharArrayToString(u.Char);
   //-----------------------------
   Print(Message);
   //-----------------------------
  }
//+------------------------------------------------------------------+
 

Continuo a ricevere coccodrilli. È sempre diverso. Quindi c'è ogni sorta di spazzatura nella risorsa. Se il suo contenuto fosse lo stesso, allora non cambierebbe molto.

In generale, non è chiaro come tutto questo dovrebbe funzionare...

Forse troverò una soluzione più tardi....

 

I sindacati sono certamente una cosa interessante. Tuttavia, non mi viene in mente per quali scopi (a parte la conservazione in una risorsa) potrebbe essere utile.