Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   wie übergebe ich ein Array an eine Funktion (http://www.expert-advisor.com/forum/showthread.php?t=6650)

AVT 06.05.20 19:37

wie übergebe ich ein Array an eine Funktion
 
Je mehr ich darüber lese, desto verwirrender wird die Sache. Also frag' ich mal hier, damit vielleicht etwas Klarheit reinkommt.
Situation:
Ich habe mehrere Arrays z.B.
Code:

string ApairAud[7]={"AUDCAD","AUDCHF","AUDJPY","AUDNZD","AUDUSD","EURAUD","GBPAUD"};
string ApairNzd[7]={"NZDCAD","NZDCHF","NZDJPY","NZDUSD","AUDNZD","EURNZD","GBPNZD"};

Nun muß ich für jedes Array die gleichen Berechnungen durchführen, z.B.
Code:

void CalcAud()
{
  for(int j=0; j<ArrayRange(ApairAud,0); j++)
      if( ... )  Action;
}

Klar kann ich für jedes Array ne eigene Funktion schreiben, aber es wäre einfacher, wenn ich eine Funktion hätte, die dann alle Arrays behandeln kann, also so was wie CalcPair( string FürDiesesArray ).
Alles, was ich bisher für FÜrDiesesArray versucht habe, endetet in Fehlermeldungen.
Kann mir bitte jemand sagen, wie ich das richtig mache?
Danke. AVT

traderdoc 06.05.20 19:48

Das verstehe ich nicht ganz.
Du kannst doch alle Arrays in einer Funktion bearbeiten, ob nacheinander oder alle gleichzeitig hängt sicherlich von der Unterschiedlichkeit der Arraygröße ab und von der if-Abfrage.

Kannst Du das noch mal eindeutiger formulieren?

traderdoc

AVT 06.05.20 20:35

Danke für Deine Antwort traderdoc.
Mal zur Illustration, hier die erste Funktion (die funktioniert - ich baue lieber alles in kleinen Schritten auf):
Code:

void CalcAud()
{
  int CountWeaks=0, CountStrongs=0;
  for(int j=0; j<ArrayRange(ApairAud,0); j++)
  {
      if( GetFrontName(ApairAud[j]) ==ApairClass[0])      //InThisPairNameItIsInFront
      {
        for(int i=0; i<ALoopLimit; i++)                  //SearchTheSStableForTheName
        {
            if(SSpairTable[i].SpairName == ApairAud[j] )  //FoundTheSStableName
            {
              if(SSpairTable[i].SpairPercMove>0) CountStrongs++; //0% is counted weak
              else                              CountWeaks++;
            }
            SSpairTable[i].SpairStrongs=CountStrongs;
            SSpairTable[i].SpairWeaks=CountWeaks;
        }
      }
      if( GetBackName(ApairAud[j]) ==ApairClass[0])      //InThisPairNameItIsInBack
      {
        for(int i=0; i<ALoopLimit; i++)                  //SearchTheSStableForTheName
        {
            if(SSpairTable[i].SpairName == ApairAud[j] )  //FoundTheSStableName
            {
              if(SSpairTable[i].SpairPercMove<0) CountStrongs++;
              else                              CountWeaks++; //0% is counted weak
            }
            SSpairTable[i].SpairStrongs=CountStrongs;
            SSpairTable[i].SpairWeaks=CountWeaks;
        }
      }
  }
}

Es wird das "kleine" Array untersucht, um die Ergebnisse in der großen Tabelle festzuhalten. (Mit diesen Tabellenwerten wird danach weiter gerechnet).
Ich hätte das jetzt gerne umgewandelt in eine allgemeine Funktion, etwa so:
Code:

void CalcStrongWeak(string ArrayName=??? , int ClassNo=0)
{
  int CountWeaks=0, CountStrongs=0;
  for(int j=0; j<ArrayRange(ArrayName,0); j++)
  {
      if( GetFrontName(ArrayName[j]) ==ApairClass[ClassNo])
      {
        for(int i=0; i<ALoopLimit; i++)
        {
            if(SSpairTable[i].SpairName == ArrayName[j] )
            {
              if(SSpairTable[i].SpairPercMove>0) CountStrongs++; //0% is counted weak
              else                              CountWeaks++;
            }
            SSpairTable[i].SpairStrongs=CountStrongs;
            SSpairTable[i].SpairWeaks=CountWeaks;
        }
      }
      if( GetBackName(ArrayName[j]) ==ApairClass[ClassNo])
      {
        for(int i=0; i<ALoopLimit; i++)
        {
            if(SSpairTable[i].SpairName == ArrayName[j] )
            {
              if(SSpairTable[i].SpairPercMove<0) CountStrongs++;
              else                              CountWeaks++; //0% is counted weak
            }
            SSpairTable[i].SpairStrongs=CountStrongs;
            SSpairTable[i].SpairWeaks=CountWeaks;
        }
      }
  }
}

Ich hoffe, jetzt ist klar wohin ich will. Danke. AVT

TraumExperte 06.05.20 23:01

Hallo AVT,

per Referenz:

void CalcStrongWeak(string &DeinArray[] , int ClassNo=0)
{
....
}

Referenziert wird mit "&"

Grüße

TraumExperte

traderdoc 07.05.20 09:24

Wenn es dann so funktionieren soll, wäre die referenzierte Methode
wie @TraumExperte gezeigt hatte, ein der korrekten Möglichkeiten.

traderdoc

AVT 07.05.20 13:22

@ TraumExperte
Danke, das war es was mir fehlte - ist also quasi das gleiche wie die OnCalculate Arrays. :)

@ traderdoc
So sollte es eigentlich funktionieren. Die Ergebnisse sind auch richtig.

Code:

string ApairClass[8]={"AUD","CAD","CHF","EUR","GBP","JPY","NZD","USD"};
Jetzt frage ich mich nur, ob es nicht korrekter/eindeutiger wäre, die Funktion so zu beginnen (MT meckert zwar nicht, aber bei dem Klassenarray handelt es ja auch um ein string Array):
Code:

void CalcStrongWeak(string &ArrayName[],  //PairNameArrayToCalc
                    string &ClassArray[], //PairClassArrayToUse
                    int ClassNo=0)        //ArrayNoInThePairClass

Aufgerufen würde sie dann so:
Code:

CalcStrongWeak(ApairAud,ApairClass,0);
Oder war die "int ClassNo=0" ausreichend (im Sinne korrekter Programmierung, nicht im Sinne von MT Fehlertoleranz)?
Danke. AVT


Alle Zeitangaben in WEZ +2. Es ist jetzt 23:56 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum