Errori, bug, domande - pagina 786

 

Qualcosa è stato incasinato nell'ultima build. Il .ex5 di uno degli indicatori è cresciuto in dimensioni di quasi 10 volte rispetto al .ex5 compilato dalla build precedente. Beh, non è un problema. Ma un errore è apparso quando si disegna l'indicatore (prima di inserire i suoi parametri):

2012.07.27 02:53:57     MP2012_GRI (EURUSD,M30) Access violation read to 0x000000003FF39D25

Ho già sistemato il codice 3\4. E se commento di nuovo un po', lo otterrò (insieme all'errore di cui sopra):

2012.07.27 02:56:42     Custom Indicator        'MP2012_GRI' may work incorrectly, as it requires more than 256Kb of stack memory
e non funziona davvero

E se commento di nuovo un po' il codice, i primi due errori scompaiono, ma li ottengo quando scarico l'indicatore:

2012.07.27 02:47:35     MP2012_GRI (EURUSD,M30) 9 leaked strings left
(I numeri possono essere diversi - dipende da quanto codice ho commentato)

Ho scoperto in anticipo che la mia funzione è troppo grande per il volume - la batterò su funzioni piccole.

...e tutto andava bene nell'ultima build

 
notused:

Qualcosa è stato incasinato nell'ultima build. Il .ex5 di uno degli indicatori è cresciuto in dimensioni di quasi 10 volte rispetto al .ex5 compilato dalla build precedente. Beh, non è un problema. Ma un errore è apparso quando si disegna l'indicatore (prima di inserire i suoi parametri):

Ho già sistemato il codice 3\4. E se lo cambio un po' di più, otterrò (insieme all'errore di cui sopra):

Abbiamo rafforzato il controllo sull'ambiente sandbox per una migliore sicurezza.

Il messaggio sullo stack vi dice che avete usato più di 256 kilobyte di stack in una delle vostre funzioni, il che è un problema serio nella programmazione. Per esempio, in C/C++ usare una funzione di stack locale anche per 16Kb è considerato un serio avvertimento.

Probabilmente allocate molti array statici nelle funzioni, per esempio:

void func(void)
  {
   double arr1[128000];
   double arr2[128000];
   double arr3[128000];

  }

Non dovete farlo.

Se avete bisogno di array grandi, usate meglio gli array dinamici. Per esempio:

double ExtArr[];

void func(void)
  {
   double arr1[];
   double arr2[];

   ArrayResize(ExtArr,128000,0);
   ArrayResize(arr1,128000,0);
   ArrayResize(arr2,128000,0);
  }
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
Renat:

Abbiamo rafforzato il controllo sull'ambiente sandbox per una maggiore sicurezza.

Il messaggio sullo stack vi dice che avete usato più di 256 kilobyte in una funzione dello stack, che è un problema serio nella programmazione. Per esempio, in C/C++ usare uno stack locale anche di 16 kb in una funzione è considerato un serio avvertimento.

Probabilmente allocate molti array statici nelle funzioni, per esempio:

Non dovreste farlo.

Se avete bisogno di array grandi, usate invece gli array dinamici. Per esempio:

Non uso affatto gli array statici in questo indicatore; non passo niente di più pesante di int nelle funzioni, ecc. Ma voi usate attivamente tutti i tipi di funzioni grafiche.

Per esempio,

   ObjectSetString(0, stmp, OBJPROP_TEXT, "HB");
   ObjectSetInteger(0, stmp, OBJPROP_COLOR, hbColor);

Se l'ultima linea è commentata, tutto va bene. Il problema è che ci sono molte chiamate di questo tipo e questa

ObjectSetInteger(0, stmp, OBJPROP_COLOR, hbColor);

è il 20° o il 30° di fila.

Penso che il problema stia nella dimensione della funzione, dato che commentare il codice evita il problema, mentre la maggior parte del codice consiste in ObjectSetXXX. Ho scoperto attraverso gli esperimenti che romperlo in parti più piccole è anche inutile - un inliner aggressivo accumulerà ancora tutto e genererà errori. Posso provare a mettere più codice, ma lo farò domani. Il service desk è anche domani, se non lo capiamo prima.

 
notused:

Non uso affatto gli array statici in questo indicatore; non passo niente di più pesante di int nelle funzioni, ecc. Ma tutti i tipi di funzioni grafiche sono utilizzate attivamente.

Ma c'è qualcosa di enorme, vero?

Per esempio, includere una copia locale di una classe che ha solo una tonnellata di array statici nei suoi membri. Di solito è lì che si nascondono i depositi dei consumatori di pile locali.


Per esempio,

Se l'ultima linea è commentata, tutto va bene. Il problema è che abbiamo molte chiamate di questo tipo e questa

è il 20° o il 30° di fila.

Penso che il problema sia nella dimensione della funzione, poiché commentare il codice evita il problema, e la maggior parte del codice consiste in ObjectSetXXX. Ho scoperto attraverso gli esperimenti che romperlo in parti più piccole è anche inutile - un inliner aggressivo accumulerà ancora tutto e genererà errori. Posso provare a mettere più codice, ma lo farò domani. Service Desk anche domani, se non lo capiamo prima.

Dividere le funzioni, impilare in classi.

Inliner molto probabilmente non ha niente a che fare con questo - non inserisce pezzi di codice troppo grandi. Specialmente se sono pesanti/molte variabili locali.

 
Renat:

Ma c'è qualcosa di enorme, vero?

Per esempio, includere una copia locale di una classe che ha solo una tonnellata di array statici nei suoi membri. Di solito è lì che si nascondono i depositi dei consumatori di pile locali.


Dividere le funzioni, impilare in classi.

Inliner probabilmente non ha niente a che fare con questo - non inserisce pezzi di codice troppo grandi. Specialmente se hanno un sacco di variabili locali.

Servizio di assistenza #444495
 

Perché è così? Pagamento sciatto o cosa! Solo 1 agente ha guadagnato 1 kr e 0,3 kr ha fatto un pagamento al giorno!


 

Assicuratevi di scrivere a servicedesk con queste intestazioni:

Versione del terminale e bit rate

...

Descrizione del problema

...

Sequenza di azioni ...

...

Risultato ottenuto ...

...

Risultato atteso ...

...

Informazioni aggiuntive ...

...

O puoi metterlo in parole tue?

 
Zeleniy:

o puoi mettere tutto in parole tue?

Una lista sarebbe meglio. Questo renderà la vita molto più facile a chi si occupa del bug.
 
Zeleniy:

Dovete scrivere a servicedesk con questi titoli?


o posso farlo con parole mie?

potete fare tutto con le vostre parole, ma

Versione del terminale e bit rate
Descrizione del problema

Sequenza d'azione
Risultato ottenuto
Risultato atteso

necessariamente.

------------

Non stai scrivendo un saggio su un argomento libero, stai scrivendo un testo per uno sviluppatore che dovrebbe capire rapidamente ciò che vuoi da lui senza alcun dettaglio.

 
sergeev:

potete fare tutto da soli, ma

Versione del terminale e bit rate
Descrizione del problema

Sequenza d'azione
Risultato ottenuto
Risultato atteso

necessariamente.

------------

Non stai scrivendo un saggio su un argomento libero, stai scrivendo un testo per uno sviluppatore che dovrebbe capire rapidamente ciò che vuoi da lui senza alcun dettaglio.

Ho scelto la sezione Sito mql5.com e la proposta e ora non capisco come attaccarla ai titoli.