Fehler, Irrtümer, Fragen - Seite 1440

 

MT 4. MathRand() Zufallszahlengenerator in OnTick(). Beim Testen der Eule werden unterschiedliche Ergebnisse erzielt, wenn sie mit denselben Einstellungen erneut ausgeführt wird. Dies ist normal, wenn die erzeugte Zahl den Algorithmus beeinflusst.

Bei der Optimierung erhalte ich aus irgendeinem Grund identische Ergebnisse bei einem zweiten Durchlauf mit denselben Einstellungen. Funktioniert MathRand() also nicht im Optimierungsmodus?

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

Zweitens (ich habe Angst, hier einen Fehler zu machen, ich hoffe,Alexander Puzanov kann mich korrigieren), wenn der Programmierer aus irgendeinem Grund beschließt, ein Element mit Index 20 zu einem dynamischen Array hinzuzufügen, wird nichts Schlimmes passieren. Das Array nimmt diese Dimension und schreibt dort einen Wert hinein und initialisiert die "fehlenden" Indizes mit Nullwerten.

Ganz genau. Warum "Null"? Vielleicht sollte es EMPTY_VALUE heißen? Oder WRONG_VALUE ?

Das Problem bei solchen impliziten Zuweisungen ist genau ihre implizite Natur - der Compiler führt einen Code ein, den ein Programmierer auf die eine Art denkt, während ein anderer anders denken könnte.

Außerdem ist es ineffektiv - es ist nicht immer notwendig, eine Variable sofort zu initialisieren, und die Initialisierung eines großen Arrays in einer Schleife kann die Geschwindigkeit erheblich verringern.

Und drittens hindert den Programmierer niemand daran, die Dimensionalität und den verwendeten Index zu kontrollieren! Der einzige Unterschied ist, dass er jetzt gezwungen ist, es zu tun! )))

Wenn der Compiler die Dimension eines Arrays selbst verfolgt, ist keine Klasse in der Lage, diesen Code zu bereinigen. Der Wirkungsgrad kann sehr wohl sinken.

Wenn der Compiler sich nicht um diese Aufgabe kümmert, kann der Programmierer eine Klasse schreiben, die diese Aufgabe übernimmt, und dann ein Array verwenden, das expandiert und gegebenenfalls mit Nullen initialisiert wird.

Im zweiten Fall ist die Flexibilität höher.

Was Sie vorschlagen, ist also auch eine gute Lösung für viele Fälle. Aber es kann die Effizienz verringern, was nicht gut ist.

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

Dies ist im Prinzip ein einfaches Beispiel dafür, wie ein dynamisches Array normalerweise gefüllt werden sollte. Ich habe schon lange nicht mehr in C geschrieben, ich kann mich nicht erinnern, aber so werden Arrays in php gefüllt! Alles ist logisch und verständlich. Wenn ich einem Array ein Element hinzufüge (arr[] = x), wird das Array automatisch erweitert, und das Element wird am Ende des Arrays hinzugefügt. Und wir müssen es nicht selbst strecken, und wir müssen den Index des Elements auch nicht selbst angeben. Aber hier müssen wir absolut unnötige Bewegungen machen:

der Unterschied ist offensichtlich...

Meiner Meinung nach ist das, gelinde gesagt, seltsam ))))

Programmiersprachen werden in streng typisierte und nicht typisierte Sprachen unterteilt. Ihr PHP, R und andere funktionale Sprachen gehören zu den nicht-streng typisierten Sprachen. In streng typisierten Sprachen wie MQL oder C# und Java ist diese Art der zweideutigen Datenmanipulation nicht erlaubt. Und dies geschieht vor allem zur Sicherheit des Programmierers selbst. Strenge Typisierung impliziert, dass jede Ihrer Prozeduren extrem spezifisch ist: "to take an element at index 0 in array array" ist eine spezifische und klare Prozedur, aber Sie schlagen vor, sie durch "take something from array array and add it to whatever the compiler decides to return first" zu ersetzen. - Sie sind sich einig, dass Sie damit nicht weit kommen werden.

Andererseits wollen wir natürlich einfache High-Level-Konstrukte ohne lästige Array-Größenanpassung und ständige Neuanordnung durch den Benutzer. Genau dafür ist die Standardbibliothek gedacht. Anstatt einfache Arrays zu verwenden, wechseln Sie zu den Klassen der Gruppe Array. So sieht zum Beispiel das Hinzufügen von Null bis 16 in das Array CArrayInt aus:

#include <Arrays\ArrayInt.mqh>

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

Wie Sie sehen können, ist nichts zu natürlich. Und es ist nicht nötig, sich den Kopf über die aktuelle Array-Größe und andere Umstellungen zu zerbrechen. Alles wird für Sie erledigt, und Sie können sich direkt auf die Benutzeraufgabe konzentrieren. Das ist die Stärke und der Sinn von OOP.

 

Vollständige Aufzeichnung nicht verfügbar. Kompilierungsfehler

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
};
 

Ich kann nicht feststellen, wo ich falsch liege.

Die Aufgabe besteht darin , den maximalen und minimalen Wert in einem Intervall zu finden

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);   

  } 
 

Falsche Reihenfolge der Argumente in ArrayMaximum(), ArrayMinimum().

 
PabloEs:

Ich kann nicht feststellen, wo ich falsch liege.

Die Aufgabe besteht darin , den maximalen und minimalen Wert in einem Intervall zu finden

Funktionen

CopyHigh(_Symbol,0,2,Kol_Kan,HI);//Kopieren der Werte der Maxima

CopyLow(_Symbol,0,2,Kol_Kan,LO); //Kopieren der Werte der Minima

bereits die Größe des Arrays ändern.

Dies ist unnötig

ArrayResize(HI,Kol_Kan); //Setzen der Array-Größe

ArrayResize(LO,Kol_Kan);

 
Sergei Vladimirov:

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

Genau)) Und ich dachte schon...

Wladimir Pastuschak:

Funktionen

CopyHigh(_Symbol,0,2,Kol_Kan,HI);//Kopieren der Werte der Maxima

CopyLow(_Symbol,0,2,Kol_Kan,LO); //Kopieren der Werte der Minima

bereits die Größe des Arrays ändern.

Dies ist unnötig

ArrayResize(HI,Kol_Kan); //Setzen der Array-Größe

ArrayResize(LO,Kol_Kan);

Ich werde das wissen, danke.

 
PabloEs:
Was ist los? Kann ich es nicht selbst herausfinden?
 

Der Autor hingegen hat es bereits herausgefunden. ))

PabloEs:

Genau.)) Und ich dachte schon...