Errori, bug, domande - pagina 1440

 

MT 4. Generatore di numeri casuali MathRand() all'interno di OnTick(). Quando si testa il gufo, si ottengono risultati diversi quando viene eseguito nuovamente con le stesse impostazioni. Questo è naturale se il numero generato influenza l'algoritmo.

Durante l'ottimizzazione, ottengo per qualche motivo risultati identici su una seconda esecuzione con le stesse impostazioni. Quindi MathRand() non funziona in modalità di ottimizzazione?

 
Сергей Таболин:

In secondo luogo (ho paura di fare un errore qui, spero cheAlexander Puzanov possa correggermi semmai), se il programmatore per qualche motivo decide di aggiungere un elemento con indice 20 a un array dinamico, non accadrà nulla di male. L'array prenderà questa dimensione e vi scriverà un valore e inizializzerà gli indici "mancanti" con valori zero.

Esattamente. Perché "zero"? Forse dovrebbe essere EMPTY_VALUE? O WRONG_VALUE?

Il problema di tali assegnazioni implicite è proprio la loro natura implicita - il compilatore introduce del codice, che un programmatore pensa in un modo, mentre un altro potrebbe pensare diversamente.

Inoltre è inefficace - non è sempre necessario inizializzare una variabile immediatamente, e inizializzare un grande array in un ciclo può ridurre significativamente la velocità.

E terzo, nessuno impedisce al programmatore di controllare la dimensionalità e l'indice utilizzato! L'unica differenza è che ora è costretto a farlo! )))

Se il compilatore stesso tiene traccia della dimensione di un array, nessuna classe sarà in grado di pulire questo codice. L'efficienza può benissimo diminuire.

Allo stesso tempo, se il compilatore non si occupa di questo compito, il programmatore può scrivere una classe per farlo e quindi utilizzare un array che si espanderà e sarà inizializzato con zeri dove necessario.

Nel secondo caso, la flessibilità è maggiore.

Quindi, quello che proponi è anche una buona soluzione per molti casi. Ma può diminuire l'efficienza, il che non è buono.

 
Сергей Таболин:

Questo è, in linea di principio, un semplice esempio di come un array dinamico dovrebbe normalmente essere riempito. Non scrivo in C da molto tempo, non mi ricordo, ma è così che si riempiono gli array in php! Tutto è logico e comprensibile. Se aggiungo un elemento a un array (arr[] = x), l'array viene automaticamente espanso, e l'elemento viene aggiunto alla fine dell'array. E non dobbiamo allungarlo da soli, e non dobbiamo specificare l'indice dell'elemento da soli. Ma qui dobbiamo fare movimenti assolutamente inutili:

la differenza è evidente...

Secondo me, è strano, per non dire altro ))))

I linguaggi di programmazione si dividono in strettamente tipizzati e non. Il tuo PHP, R e altri linguaggi funzionali appartengono a quelli non strettamente tipizzati. Nei linguaggi strettamente tipizzati come MQL o C# e Java questo tipo di manipolazione ambigua dei dati non è permesso. E questo è fatto specificamente per la sicurezza del programmatore stesso. La tipizzazione rigorosa implica che ogni vostra procedura sia estremamente specifica: "prendere un elemento all'indice 0 nell'array" è una procedura specifica e chiara, ma voi proponete di sostituirla con "prendere qualcosa dall'array e aggiungerlo a qualsiasi cosa il compilatore decida di restituire per primo". - Siete d'accordo che non andrete lontano su questo.

D'altra parte, naturalmente, vogliamo semplici costrutti di alto livello senza fastidiosi dimensionamenti di array e costanti riordinamenti da parte dell'utente. Questo è esattamente ciò a cui serve la libreria standard. Invece di usare gli array di base, passate alle classi del gruppo Array. Ecco come appare, per esempio, l'aggiunta da zero a 16 nell'array CArrayInt:

#include <Arrays\ArrayInt.mqh>

void OnStart()
{
   CArrayInt array;
   for(int i = 0; i < 16; i++)
      array.Add(i);   
}

Come potete vedere, non c'è niente di troppo naturale. E non c'è bisogno di scervellarsi sulla dimensione attuale dell'array e su altri riordinamenti. Tutto è fatto per voi, all'interno di una rigorosa digitazione, e siete invitati a concentrarvi direttamente sul compito dell'utente. Questo è il potere e il punto di OOP.

 

Registrazione completa non disponibile. Errore di compilazione

template<typename T>
class A { protected:
        A( T t ) : t( t ) {}
        T t;
};
class B : A<int> {
        B() : A<int>( 1 ) {} //'<' - member(s) initialization expected
};
 

Non riesco a trovare dove ho sbagliato.

Il compito è trovare il valore massimo e minimo su un intervallo

void OnStart()

  {
int            Kol_Kan=10;       //Количество элементов для копирования
double         HI[];             //массив для хранения максимумов на интервале
double         LO[];             //массив для хранения минимумов на интервале

CopyHigh(_Symbol,0,2,Kol_Kan,HI);//копируем значения максимумов
CopyLow(_Symbol,0,2,Kol_Kan,LO); //копируем значения минимумов

ArrayResize(HI,Kol_Kan);         //устанавливаем размер массива
ArrayResize(LO,Kol_Kan);

int in_max=0;                    //индекс максимального значения в массиве
int in_min=0;

in_max=ArrayMaximum(HI,WHOLE_ARRAY,0); //Находим индексы максимума и мин в массивах
in_min=ArrayMinimum(LO,WHOLE_ARRAY,0);

double hi_max;                   // максимальное значение цены 
double lo_min;                   // минимальное значение цены

hi_max=HI[in_max];               //Переносим значения максимумов и мин в переменные
lo_min=LO[in_min];
Alert(hi_max,"___",lo_min);   

  } 
 

Ordine errato degli argomenti in ArrayMaximum(), ArrayMinimum().

 
PabloEs:

Non riesco a trovare dove ho sbagliato.

Il compito è trovare il valore massimo e minimo su un intervallo

Funzioni

CopyHigh(_Symbol,0,2,Kol_Kan,HI);//copia i valori dei massimi

CopyLow(_Symbol,0,2,Kol_Kan,LO); //copia i valori minimi

già ridimensionare l'array.

Questo non è necessario

ArrayResize(HI,Kol_Kan); //imposta la dimensione dell'array

ArrayResize(LO,Kol_Kan);

 
Sergei Vladimirov:

Неправильный порядок аргументов в ArrayMaximum(), ArrayMinimum().

Esattamente)) E io che pensavo...

Vladimir Pastushak:

Funzioni

CopyHigh(_Symbol,0,2,Kol_Kan,HI);//copia i valori dei massimi

CopyLow(_Symbol,0,2,Kol_Kan,LO); //copia i valori minimi

già ridimensionare l'array.

Questo non è necessario

ArrayResize(HI,Kol_Kan); //imposta la dimensione dell'array

ArrayResize(LO,Kol_Kan);

Lo saprò, grazie.

 
PabloEs:
Allora, cosa c'è che non va? Non riesco a capirlo da solo?
 

L'autore, invece, l'ha già capito. ))

PabloEs:

Esattamente.)) E io che pensavo...