Errori, bug, domande - pagina 1593

 
il messaggio di richiamo del prodotto viene sullo smartphone, nel LC e in cima al sito web μl non lo fa.
 


Lo script magico inverte il tempo ;-)

Lo script magico inverte il tempo ;-)

 
Vladimir Pastushak:
Lo smartphone riceve un messaggio su una recensione di un prodotto, ma non sulla LC o sulla parte superiore del sito mcl.
È sempre stato così, mi ricordo che hanno anche chiesto di metterlo sul sito web perché è strano quando lasciano un feedback, e anche se ti fanno domande subito e lo scopri solo dopo 2 mesi. :-)
 

Non è un bug, ma non posso fare a meno di condividere

Scrivere

if((!IsRunOnTester() && TimeCurrent() >= D'2016.06.31 23:59'))// для тестировщиков, ограничение работы по времени

Il compilatore dà un avvertimento

data non valida *****.mq4 115 46

Controlla anche le date delle stringhe valide, sono scioccato ) (30 giorni di giugno)

 

Apparentemente non interessa a nessuno, ma scriverò di nuovo.

Il vero compito è quello di creare array con una dimensione totale di circa il 100% della memoria libera, riempirli rapidamente di numeri, eseguire i calcoli e rilasciarli.

Cerco di ottenere la dimensione della memoria libera con

int mem_free_mb=(int)TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE);

risultato: 23987 MB, la mia memoria fisica è 12141 MB, cioè la metà.

Capisco che questa cifra è per i marziani, ma ci credo ancora e scrivo uno script per testarla:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
#define  PARTS 5

   srand(GetTickCount());
//---
   int mem_free_mb=(int)TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE);
   //mem_free_mb=5300;//<--- Столько показывает 'Доступной' в диспетчере задач.
   long mem_for_calc=(long)((double)mem_free_mb*1024*1024);
   long mem_one_part=(long)floor((double)mem_for_calc/PARTS);
   if(mem_one_part>=INT_MAX-1)
      mem_one_part=INT_MAX-1;
//---
   printf("Memory for calc: %0.f MB, parts: %d, part: %0.f MB",mem_for_calc/1024/1024,PARTS,mem_one_part/1024/1024);
   char array1[];
   char array2[];
   char array3[];
   char array4[];
   char array5[];

   int res=ArrayResize(array1,(int)mem_one_part);
   Print("Array1 Resize: ",res);
   if(res<1)return;
   printf("Reserved: %0.f MB",1.0*mem_one_part/1024/1024);

   res=ArrayResize(array2,(int)mem_one_part);
   Print("Array2 Resize: ",res);
   if(res<1)return;
   printf("Reserved: %0.f MB",2.0*mem_one_part/1024/1024);

   res=ArrayResize(array3,(int)mem_one_part);
   Print("Array3 Resize: ",res);
   if(res<1)return;
   printf("Reserved: %0.f MB",3.0*mem_one_part/1024/1024);

   res=ArrayResize(array4,(int)mem_one_part);
   Print("Array4 Resize: ",res);
   if(res<1)return;
   printf("Reserved: %0.f MB",4.0*mem_one_part/1024/1024);

   res=ArrayResize(array5,(int)mem_one_part);
   Print("Array5 Resize: ",res);
   if(res<1)return;
   printf("Reserved: %0.f MB",5.0*mem_one_part/1024/1024);

   uint gtc=GetTickCount();
   for(int i=0;i<mem_one_part;i++)
     {
      char ch=(char)rand();
      array1[i]=ch;
      array2[i]=ch;
      array3[i]=ch;
      array4[i]=ch;
      array5[i]=ch;
     }
//---
   printf("Spent time: %d ms",GetTickCount()-gtc);
  }

Ottengo un risultato logico - è impossibile allocare l'array3 perché la memoria si è esaurita.

Poi decommento la linea, dove specifico quanta memoria è disponibile ora:

mem_free_mb=5300;//<--- Столько показывает 'Доступной' в диспетчере задач.

Dopo di che lo script viene eseguito con successo.

Non voglio essere un fastidio per gli sviluppatori, ma è importante sapere quanta memoria è disponibile.

Per favore, rendete possibile conoscerlo attraverso TerminalInfoInteger.

 

Siete consapevoli che nella maggior parte dei casi non sarete in grado di recuperare tutta la memoria disponibile?

Esiste una cosa come la frammentazione della memoria. Avete deciso di dividere tutta la memoria in 5 frammenti - e il sistema non ha un singolo frammento ininterrotto di memoria della dimensione che vi serve.

 
Slawa:

Siete consapevoli che nella maggior parte dei casi non sarete in grado di recuperare tutta la memoria disponibile?

Esiste una tale nozione - la frammentazione della memoria. Avete deciso di dividere tutta la memoria in 5 frammenti - ma il sistema non ha un singolo pezzo continuo di memoria della dimensione che vi serve.

1. Puoi prima scoprire cosa significa fisicamente il parametro TERMINAL_MEMORY_AVAILABLE?

2. Per quanto riguarda i frammenti, penso che questo dovrebbe essere gestito dal gestore della memoria di Windows, non dal programmatore.

Ho bisogno di sapere quanto posso usare in un dato momento, per esempio, voglio usare il 50% della memoria disponibile.

Un altro compito reale è la richiesta di CopyTicks. Se si richiedono più zecche della memoria disponibile si ottiene 'out of memory'.

 
Andrey Voytenko:

Un'altra vera sfida è la richiesta di CopyTicks. Se si richiedono più zecche della memoria disponibile si ottiene 'out of memory'.

In alternativa, scaricate i dati in un file e prendeteli da lì nei segmenti richiesti
 
coderex:
In alternativa, caricare i dati in un file e prendere i segmenti richiesti da lì

Questo è lento per me. Voglio fare tutto attraverso la memoria. In realtà viene fatto ora, ma devo chiamare GlobalMemoryStatusEx per scoprire la dimensione della memoria disponibile.


	          
 
Andrey Voytenko:

Questo problema è particolarmente acuto quando si ottimizza su agenti cloud, le cui capacità non si conoscono dall'inizio: è impossibile determinare la quantità reale di memoria disponibile, né attraverso MQL, né attraverso WinApi (perché le chiamate dll sono vietate).

Non si capisce bene che senso pratico abbia allora TERMINAL_MEMORY_AVAILABLE: perché introdurlo se non ci rende né felici né infelici?