Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
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
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?
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.
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)
Non dimenticare di controllare se il puntatore è NULL
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?
Chi lo sa -- c'è un modo normale per tradurre un array di caratteri Unicode in una stringa?