Libreria di classi generiche - bug, descrizione, domande, caratteristiche d'uso e suggerimenti - pagina 27

 
Artyom Trishkin:
  1. Intendevo dire che la rimozione automatica da parte del sottosistema terminale di tutti i vostri oggetti creati e mettere i puntatori ad essi nelle liste la chiamate una stampella, e non considerate la gestione manuale degli oggetti e la creazione di stampelle per farlo una stampella
  2. Questo non faceva parte di quello che hai detto al punto 1, ed è la ragione principale per cui ho risposto.
  3. Anche questo, e per la stessa ragione.

Per cosa si creano le collezioni, per le collezioni e la cancellazione automatica degli oggetti)? Non ho parlato affatto di funzionamento manuale. Da dove l'hai preso?).

Studiate STL e capirete di cosa sto parlando.

 
Igor Makanu:

come copiare correttamente, puoi dare un esempio per questo modello?

Ho usato l'aiuto per scrivere il metodo AddValuehttps://www.mql5.com/ru/docs/basis/types/classes

Mi sono scervellato, ma non vedo altra soluzione in MQL che quella che ho scritto nel mio esempio!

Mostratemi la vostra implementazione della corretta memorizzazione dei dati.

Questo è quello che intendevo nel tuo caso.
void  AddValue (const T &value)  { Tptr = new T(value); mlist.Add(Tptr); }

Ma questa soluzione è comunque sbagliata. Una soluzione normale è usare qualcosa come STL. Nel vostro caso std::list.

Penso che MQL5 non lo limiti. Potete provare a tradurre i sorgenti STL dallo stesso VS a MQL

 
Nella vecchia generazione di moderatori c'erano almeno due programmatori professionisti. ora non ce ne sono. ed è molto evidente)
 
Andrey Pogoreltsev:
Questo è quello che intendo nel tuo caso.

Ma è ancora la soluzione sbagliata. La soluzione normale è usare qualcosa come STL. Nel vostro caso std::list.

Non credo che MQL5 non lo limiti. Si potrebbe provare a tradurre il codice sorgente STL da VS a MQL

Ancora una volta: MQL non è C++,

e un puntatore a un oggetto in MQL è in effetti un handle, e un puntatore in C++ è un indirizzo di memoria fisica.

che senso ha fare il porting delle librerie C++ su MQL?

 
Igor Makanu:

Ancora una volta: MQL non è C++,

e un puntatore a un oggetto in MQL è infatti un handle, e un puntatore in C++ è un indirizzo di memoria fisica

che senso ha fare il porting delle librerie C++ su MQL?

Per implementare correttamente i design pattern invece di creare potenziali problemi usando i generici.

Sarai sorpreso, ma anche i puntatori per il sistema operativo sono virtuali. Dovete ancora convertirli in quelli fisici, ma questo è un livello di lavoro completamente diverso con i puntatori.

Non sarete in grado di portare 1 in 1, ma penso che sarete in grado di portare un C++03 spogliato. È disponibile il supporto di modelli e operatori.

 
Andrey Pogoreltsev:

1. Potreste essere sorpresi, ma anche i puntatori per il sistema operativo sono virtuali. Hanno ancora bisogno di essere convertiti in quelli fisici, ma questo è tutto un altro livello di gestione dei puntatori.

2. Non sarete in grado di fare il porting di 1 in 1, ma sarete in grado di fare il porting dello stripped-down C++03. C'è anche il supporto di modelli e operatori.

1. Non sarei sorpreso

2. Beh, ecco la verità - anche se vi mettete insieme e fate un port da C++, causerà comunque delle domande, ma perché non come nell'originale? - qual è il punto?

C'è una libreria standard di MQL, usandola almeno una sorta di garanzia che il supporto sarà fornito dagli sviluppatori in futuro. Sono già stato bruciato un paio di volte - ho usato componenti grafici da articoli scritti qualche anno fa, è facile da usare, molto simile a lavorare con componenti Delphi, ma quando ho iniziato a cercare di implementare progetti più seri ho avuto un sacco di domande e nessuna risposta dall'autore dell'articolo

Non ricordo chi dei programmatori di spicco ha detto, ma qualcosa del genere: il codice non deve essere bello o leggibile, deve compiere il suo scopo

nella nostra discussione, se non mi sbaglio, volevi memorizzare una struttura con i tuoi dati in liste, ti ho mostrato la mia implementazione, che ho sviluppato per lo stesso compito - la mia implementazione funziona? - causa errori di runtime nei programmi MQL? - Sono curioso di scoprire nel corso della conversazione

 

Andrey Pogoreltsev:

C++03 è possibile, credo. È disponibile il supporto per modelli e operatori.

Beh sì, buona fortuna ))

 
Igor Makanu:

Il codice non deve essere bello o leggibile, deve fare il suo lavoro

Questo è vero solo finché non si vuole raffinare.

 

Ho già sottolineato questo bug nella classe CLinkedList, ma lo ripeterò. I nodi di inizio e fine della lista sono chiusi l'uno all'altro: Next dell'ultimo nodo punta al primo nodo, mentre Previous del primo nodo punta all'ultimo. Come risultato, il ciclo di ricerca standard si trasforma in un ciclo infinito:

#include <Generic\LinkedList.mqh>

void OnStart()
{
  CLinkedList<string> list;
   
  list.AddLast("One");
  list.AddLast("Two");
  list.AddLast("Three");
  int i=0;
  for (CLinkedListNode<string> *node= list.First();  node!=NULL;  node=node.Next())  // Цикл бесконечно бегает по кругу
    { }
} 

In C# tale assurdità non è naturalmente osservata. Il Next dell'ultimo nodo è zero, così come ilPrevious del primo nodo.

Non so se è una "caratteristica" inventata dagli sviluppatori (anche se non ne vedo l'utilità), ma in ogni caso il comportamento della libreria dovrebbe corrispondere a quello originale.

 
Alexey Navoykov:

Ho già sottolineato questo bug nella classe CLinkedList, ma lo ripeterò. I nodi di inizio e fine della lista sono chiusi l'uno all'altro: Next dell'ultimo nodo punta al primo nodo, mentre Previous del primo nodo punta all'ultimo. Come risultato, il ciclo di ricerca standard si trasforma in un ciclo infinito:

In C#, naturalmente, non ci sono queste sciocchezze: il Next dell'ultimo nodo è zero, così come ilPrevious del primo nodo.

Non so se questa è una "caratteristica" inventata dagli sviluppatori (anche se non ne vedo alcun beneficio), ma in ogni caso il comportamento della libreria dovrebbe corrispondere all'originale.

Che diavolo sta succedendo di nuovo qui? Stanno cancellando dei post di LinkedList perfettamente validi. Proprio così, da qualche parte in Europa, un moderatore anonimo sta cancellando i post degli odiati russi mentre sghignazza maliziosamente. Che discarica, ti fa passare la voglia di scrivere.