Errori, bug, domande - pagina 453

 
Interesting:

Non create oggetti dinamici - non dovrete usare ora e tutto ciò che riguarda questi oggetti (ma poi non potrete fare molte cose).

Vuoi capire non il significato di adesso, ma il significato di lavorare con oggetti dinamici...

//////////////////////////////////////// SEGUI IL MIO TESTO (NON POSSO USCIRE DALLA CITAZIONE) :) //////////////////////////////////////////////////////////////

void OnStart()
{
//---
primer obekt;
obekt.f1();
}
//+------------------------------------------------------------------+
primer di classe
{
pubblico:
void f1();

primer();
};

primer::primer()
{
Alert("Credo che anche qui l'inizializzazione sia solo al momento della creazione");
};

primer::f1()
{
int l[];
ArrayResize(l,3);
l[0]=87;
l[1]=67;
l[2]=57;
ArrayResize(l,5);
l[3]=47;
l[4]=37;
Alert(l[0]," ",l[1]," ",l[2]," ",l[3]," ",l[4]);
};

Questo codice non produce un errore e l'array è dinamico. Perché????

E se vuoi distruggerlo:

{

obekt;
obekt.f1();


}

Sembra che abbiano preso il C++ e incasinato la gestione degli indirizzi e l'abbiano messo in MQL

 

220Volt:

PIÙ AVANTI C'È IL MIO TESTO (NON POSSO USCIRE DALLE VIRGOLETTE) :)

Questo codice non dà un errore e l'array è dinamico. Perché????

1. Perché dovrebbe essere eseguito con un errore?

a) L'oggetto viene creato automaticamente (questo è causato dal metodo di dichiarazione di un'istanza di oggetto in OnStart) e viene automaticamente cancellato

primer  obekt1;   //Конструктор будет вызван автоматически уже на этой строчке
 primer *obekt2; //Указатель на динамический объект

void OnStart()
{
obekt2 = new primer; //Конструктор выполняется вот тут 

obekt.f1();

delete(obekt2); //Тут выполняется деструктор (отсутствие delete приведет к утечки памяти в момент завершения работы скрипта)
}

Come per gli oggetti, le loro istanze possono essere create automaticamente o dinamicamente. Nel primo caso, il costruttore viene solitamente eseguito durante l'inizializzazione, nel secondo caso viene eseguito dopo l'utilizzo dell'operatore new.

b) Logicamente, non ci dovrebbero essere errori neanche in f1() (anche se personalmente l'avrei implementato diversamente).

Per quanto riguarda gli array dinamici. Essi differiscono dagli array statici in quanto tali array non hanno una dimensionalità nota, il che significa che prima di lavorare con un tale array, dovreste specificarlo usando ArrayResize (dovreste specificare una nuova dimensione nella prima dimensione dell'array). È importante notare che gli elementi della matrice sono numerati a partire da 0.

2. Se sei interessato a lavorare con oggetti dinamici, studia attentamente questo esempio - Tetris (anche se non riesco ancora a capire cosa fa nel vecchio forum)...

 

Mi dispiace intromettermi, ma voglio davvero arrivare in fondo a questa storia. Vi dirò su cosa mi sbaglio.

Se guardiamo la notazione C++ (abbiamo una classe primer dichiarata)

primer *ukazatel=nuovo primer;

dice che ukazatel contiene l'indirizzo in memoria dove il nostro oggetto, una copia della classe primer, è memorizzato. Da MQL gli indirizzi vengono rimossi, e ukazatel contiene un descrittore di oggetti. Cosa ne ricaviamo? L'unica differenza che ho notato è che se dichiarate un oggetto all'interno del blocco tramite new e dimenticate di usare delete prima di finire il blocco, allora l'oggetto sarà cancellato solo quando il programma sarà finito. E dopo l'uscita dal blocco la connessione con questo oggetto tramite l'handle sarà persa.

Ho pensato che se dichiarato tramite new, allora la memoria per l'oggetto è allocata dinamicamente (cioè, può aumentare la sua dimensione), e se no new, allora l'oggetto può avere solo variabili statiche. Ma la mia supposizione non è stata confermata (lo script, che ho postato prima, l'oggetto è dichiarato non tramite new, ma si occupa di una variabile dinamica).

E dopo tutte queste passioni mi trovo in una situazione non molto bella, e non capisco qual è la differenza con il nuovo o senza, e se il compilatore stesso risolve qualcosa lì, perché dovrei preoccuparmi?

Документация по MQL5: Основы языка / Переменные / Статические переменные
Документация по MQL5: Основы языка / Переменные / Статические переменные
  • www.mql5.com
Основы языка / Переменные / Статические переменные - Документация по MQL5
 

Anche provato a fare qualcosa come quello che è descritto nella documentazione (per scoprire qualcosa di nuovo) :

interruttore(5)

{

caso 5: m_shape=new CTetrisShape1; // questa opzione non funziona affatto (e questo dalla documentazione!!!!!!) solo in questo modo

( m_shape=nuovo CTetrisShape1; )

}

e ora non possiamo accedere all'oggetto m_shape.___, verrà visualizzato un errore

 

220Volt:

E ora mi trovo in una situazione non molto buona dopo tutte queste passioni, e non capisco qual è la differenza tra l'avere nuovo o no, e se il compilatore aggiusta qualcosa lì, perché dovrei preoccuparmi?

Le istanze degli oggetti sono create dinamicamente usando l'operatore new if (ecco perché ho chiesto di vedere l'esempio di Tetris):

1. Il numero di istanze dell'oggetto non è noto in anticipo (ma si presume che ce ne sarà sempre più di uno);

2. Se si vuole creare un array di puntatori a oggetti "eterogenei", che hanno lo stesso antenato;

3. se si suppone che l'oggetto (o piuttosto un puntatore a questo oggetto) sarà usato come parametro per una procedura o funzione (probabilmente dovreste passarlo alla libreria);

4. Se si intende lavorare con un oggetto (leggi: un puntatore a questo oggetto) in diverse parti del programma. Per esempio, lo stesso oggetto "ordine" può essere in: un array di ordini creati dall'Expert Advisor; un array di ordini per un certo simbolo; un array di ordini che hanno formato una certa posizione, e così via.

5. Ci sono molti altri compiti che vengono risolti applicando voti e puntatori creati dinamicamente.

 
220Volt:

Anche provato a fare qualcosa come quello che è descritto nella documentazione (per scoprire qualcosa di nuovo) :

........................

e ora non possiamo accedere all'oggetto m_shape.___, verrà lanciato un errore

In realtà nell'esempio di Tetris è implementato nel modo seguente (notate che nel vostro caso manca l'operatore break)

   switch(nshape)
     {
      case 0: m_shape=new CTetrisShape1; break;
      case 1: m_shape=new CTetrisShape2; break;
      case 2: m_shape=new CTetrisShape3; break;
      case 3: m_shape=new CTetrisShape4; break;
      case 4: m_shape=new CTetrisShape5; break;
      case 5: m_shape=new CTetrisShape6; break;
      case 6: m_shape=new CTetrisShape7; break;
     }

Non dimenticare di controllare se il puntatore è NULL

 if(m_shape!=NULL)
 {
//С указателем можно работать
 }
 

Interessante, grazie per il vostro aiuto
 

Sviluppatori.

Nella documentazione si prega di specificare "esplicitamente" tutte le cose che o non funzionano in tester, o funzionano con certe caratteristiche (in modo che non sorgano domande inutili).

Per esempio, dovreste menzionare esplicitamente le peculiarità dell'ora locale e dell'ora GMT (equiparata all'ora del server), così come la natura problematica di TimeGMTOffset per ottenere il risultato atteso.

 

Chi lo sa -- c'è un modo normale per tradurre un array di caratteri Unicode in una stringa?

 
TheXpert:

Chi lo sa -- c'è un modo normale per tradurre un array di caratteri Unicode in una stringa?

Mi sembra che dovrei tradurre ogni elemento dell'array individualmente.
Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5