Wie kann ich einen neuen Eintrag zu einem Array hinzufügen

 

Hallo.

Ich möchte gerne ein das array rates...

MqlRates rates[];
CopyRates(_Symbol,_Period,1,10,rates);


erweitern um ein neues "Feld"

               for(int i=0;i<10;i++)
              {
               PrintFormat("[%d]\t%s\t%G\t%G\t%G\t%G\t%G\t%G\t%I64d\t",i,
               TimeToString(rates[i].time,TIME_DATE|TIME_MINUTES|TIME_SECONDS),
               rates[i].open,rates[i].high,rates[i].low,rates[i].close,
               rates[i].tick_volume,rates[i].spread,rates[i].real_volume);
               rates[i].trend='trend...'+i;
              }

dies geht jedoch wohl so nicht.

Wie kann ich also ein vorhandenes array in der Form erweitern?

Um die Funktion der Arrays und struckturen zu verstehen möchte ich ein neues strukturiertes array erstellen und es mit einem neuen Wert befüllen, aber selbst daran scheitere ich mit dem Fehler "array out of range"...

struct trend_array
  {
   int      id;   
   ulong    time;
   ushort   trend;
  };
         trend_array my_trend_array[];
         int array_size = ArraySize(my_trend_array);         
         ArraySetAsSeries(my_trend_array,true);
        
         
         ArrayResize(my_trend_array,array_size+1);
         my_trend_array[array_size+1].id=1;
         my_trend_array[array_size+1].time="test1";
         my_trend_array[array_size+1].trend="trend1";
Dokumentation zu MQL5: Datenverarbeitung / TimeToString
Dokumentation zu MQL5: Datenverarbeitung / TimeToString
  • www.mql5.com
TimeToString - Datenverarbeitung - Nachschlagewerk MQL5 - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5
 
  1. Wenn Du Code postest bitte als Code posten, also mit Alt+S oder dem Icon </> aus der Editierzeile.
  2. Lies mal über Arrays: https://www.mql5.com/en/articles/567: erst einen Array deklarieren und dann seine Größe (und Richtung) bestimmen.
  3. und Strukturen: https://www.mql5.com/en/docs/basis/types/classes
Documentation on MQL5: Language Basics / Data Types / Structures, Classes and Interfaces
Documentation on MQL5: Language Basics / Data Types / Structures, Classes and Interfaces
  • www.mql5.com
Structures, Classes and Interfaces - Data Types - Language Basics - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
 
Die Reihenfolge habe ich aber doch eingehalten!?

Ich deklariere zuerst das Array
 struct trend_array 
  { 
   int      id;   
   ulong    time; 
   ushort   trend;
  };
         trend_array my_trend_array[];
dann bestimme ich die größe
int array_size = ArraySize(my_trend_array); 
und dann bestimme ich die Richtung
ArraySetAsSeries(my_trend_array,true);
oder habe ich bis hier hin schon was falsch gemacht/verstanden?

Dann würde ich nun gerne einen neuen Eintrag in das Array speichern
ArrayResize(my_trend_array,array_size+1);
         my_trend_array[array_size+1].id=1;
         my_trend_array[array_size+1].time="test1";
         my_trend_array[array_size+1].trend="trend1";
und spätestens hier denke ich habe ich was falsch gemacht/verstanden?
 
ReLor #:
Die Reihenfolge habe ich aber doch eingehalten!?

Ich deklariere zuerst das Array
dann bestimme ich die größe
und dann bestimme ich die Richtung
oder habe ich bis hier hin schon was falsch gemacht/verstanden?

Dann würde ich nun gerne einen neuen Eintrag in das Array speichern
und spätestens hier denke ich habe ich was falsch gemacht/verstanden?
Das ist für den Anfang schonmal nicht schlecht, Du hast hier eine eigene Struktur gemacht und deklarierst ein dynamisches Array das aus dem Typ dieser Struktur besteht. Dann hat das Array aber noch gar keine Größe, die Du bestimmen könntest. Du musst erst eine festlegen mit ArrayResize. Aber nicht für alle Strukturmitglieder einzeln.  

Wenn Du noch unsicher bist, schau mal unter Dokumentation, Grundlagen, Regeln der Sprache, Strukturen. Oder such nach "Grundlagen Arrays" von Dmitry Fedoseev

 
Danke für die Ausführungen. Kannst mir vielleicht kurz ein Beispielcode anhand des obrigen Beispiels geben, daran erkenne ich glaube ich eher was du meinst.
 
ReLor #:

struct trend_array                                      // hier deklarierst Du eine Struktur
  { 
   int      id;   
   ulong    time; 
   ushort   trend;
  };

int arraysize = 10;                                       // Dein Array soll später diese Größe haben

trend_array my_trend_array[];                     // hier deklarierst Du ein dynamisches Array mit der Struktur als Typ
 
ArrayResize(my_trend_array , array_size);         // Erst hier bekommt der Array die vorgesehene Größe, und zwar jeder Variable der Struktur.
                                                  // Es ist jedoch nicht nötig bei jeder Variable die Größe einzeln umzustellen.

ArraySize(my_trend_array);                        // Jetzt erst kannst Du die Größe abfragen, ohne dass 'array out of range' fliegt.

Wenn Du mit Copy...-Funktionen kopierst, wird die Größe, die Du eingegeben hast, automatisch eingerichtet.

MqlRates rates_array[];                                                 // Du deklarierst das Array mit dem Typ der Struktur MqlRates

int array_size = 10;
int x;

CopyRates(_Symbol,_Period,0,array_size,rates_array);            // CopyRates stellt bei dem gewünschten Array die Größe ein (hier zehn) und füllt es mit den Werten
                                                                        
x = ArraySize(rates_array);
Print(x);

ArrayResize(rates_array,array_size+1);
                
x = ArraySize(rates_array);                                                             // Die Arraygröße ist jetzt um eins größer als bei der letzten Abfrage
Print(x);
Aber schau Dir unbedingt mal die Artikel an, die Carl in seinem letzten Post gepostet hat... die sind wirklich sensationell gut.
 

Hallo @pennyhunter

Danke für Deine Hilfestellung.

Bist du sicher, dass der erste Codeblock richtig ist und es "int arraysize=10" und nicht vielleicht "int array_size=10" heißen soll?

Unabhängig davon erhalt ich immer, egal wie ich es mache den Fehler "'ArrayResize' - unexpected token, probably type is missing? "
"

 

//===================================================================================================================================================
void addToIntArray(int &theArray[],int val)
//===================================================================================================================================================
{
   int sizeArr = ArraySize(theArray);
   
   if(sizeArr == 0) //Erstes Element
   {
      ArrayResize(theArray,1);
      theArray[0] = val;
      sizeArr=ArraySize(theArray);
   
   }
   else //alle anderen Elemente
   {
      sizeArr = ArraySize(theArray);
      ArrayResize(theArray,sizeArr+1);
      theArray[sizeArr] = val;
   }
}  

//===================================================================================================================================================
void addToDoubleArray(double &theArray[],double val)
//===================================================================================================================================================
{
   int sizeArr = ArraySize(theArray);
   
   if(sizeArr == 0) //Erstes Element
   {
      ArrayResize(theArray,1);
      theArray[0] = val;
      sizeArr=ArraySize(theArray);
   
   }
   else //alle anderen Elemente
   {
      sizeArr = ArraySize(theArray);
      ArrayResize(theArray,sizeArr+1);
      theArray[sizeArr] = val;
   }

//===================================================================================================================================================
void addToStringArray(string &theArray[],string val)
//===================================================================================================================================================
{
   int sizeArr = ArraySize(theArray);
   
   if(sizeArr == 0) //Erstes Element
   {
      ArrayResize(theArray,1);
      theArray[0] = val;
      sizeArr=ArraySize(theArray);
   
   }
   else //alle anderen Elemente
   {
      sizeArr = ArraySize(theArray);
      ArrayResize(theArray,sizeArr+1);
      theArray[sizeArr] = val;
   }

//PS: Ginge natürlich via Polymorphismus nur mit addToArray( ..., ...), aber für den Anfang ist das übersichtlicher ;-)
 
Bitte Code als Code posten: Alt+s oder mit dem Icon: </> aus der Editierzeile!
 

Hallo @WeHu58

vielen Dank für Deine Antwort, leider stehe ich noch ziemlich am Anfang und frage mich nun erst recht wie/wo was.

Eigenlich ging es mir darum ein structuriertes Array zu definieren und es dann manuell zu befüllen.

Du scheinst hierzu Funktionen gepostet zu haben, leider erklärt sich mir als Newbie das nun nicht wirklich und macht mich eher etwas konfus.

Vielleicht kannst du mir die Funktionsweise erläutern?

Dennoch würde ich auch das simple Konstrukt zu Beginn gerne verstehen und warum es aktuell nicht funktioniert.

Gruß

 
ReLor #:

Hallo @pennyhunter

Danke für Deine Hilfestellung.

Bist du sicher, dass der erste Codeblock richtig ist und es "int arraysize=10" und nicht vielleicht "int array_size=10" heißen soll?

Unabhängig davon erhalt ich immer, egal wie ich es mache den Fehler "'ArrayResize' - unexpected token, probably type is missing? "
"

struct trend_array                                      
  { 
   int      id;   
   ulong    time; 
   ushort   trend;
  };

int array_size_1 = 10;                                       
int array_size_2 = 20;

trend_array my_trend_array[];                     
 

int OnInit()         // Oben werden die Variablen deklariert, aber Funktionen kannst Du da nicht ausführen. 
                     // Wir schreiben die Funktionen hier in die OnInit(), damit diese nur einmal ausgeführt werden
                     // Dann, wenn Du diesen kleine Programm auf den Chart wirfst oder im Tester startest.
                     // die Größen des Arrays werden im Reiter 'Journal' oder 'Experten' ausgegeben.
  {
//---
  ArrayResize(my_trend_array , array_size_1);         
  Print("my_trend_array Größe #1: ",ArraySize(my_trend_array));  

  ArrayResize(my_trend_array , array_size_2);         
  Print("my_trend_array Größe #2: ",ArraySize(my_trend_array));                       
//---
   return(INIT_SUCCEEDED);
  }

Junge junge, das ist ja schon wieder über eine Woche her.

Oh ja natürlich, da ist mir ein Fehler unterlaufen. Egal ob es nun arraysize oder array_size heißt, wenn es die selbe Variable sein soll, dann ist die Hauptsache dass es den gleichen Namen hat. Leider verliere ich gerne mal den Überblick weil ich von der Aufmerksamkeinsspanne nicht dazu gemacht bin, mir einen Haufen Variablen Buchstaben für Buchstaben zu merken. Ich verbuche das als Beweis, dass ich ein Mensch bin. Habe mir außerdem sagen lassen, dass 70% der Arbeit eines Programmierers im Debugging besteht. Es gibt Mittel und Wege, diesen Wert zu drücken (Code ReUse mittels Funktionen), aber Sachen aus dem Stehgreif zusammenschustern gehört leider nicht dazu.


Geht es denn jetzt?