Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.


Portalsuche


Werbung

Login
Benutzername:
Kennwort:


Statistik
Themen: 3810
Beiträge: 36866
Benutzer: 6.038
Aktive Benutzer: 489
Links: 80
Wir begrüßen unseren neuesten Benutzer: Markus
Mit 483 Benutzern waren die meisten Benutzer gleichzeitig online (21.04.16 um 17:12).
Neue Benutzer:
vor 2 Tagen
- Markus
vor 2 Tagen
- katana69
vor 2 Tagen
- lebedeinle...
vor 3 Tagen
- Harryy
vor 4 Tagen
- fariddesso...

Onlineuser
'Wer ist online' anzeigen Benutzer: 1
Gäste: 50
Gesamt: 51
Team: 0
Team:  
Benutzer:  traderdoc
Freunde anzeigen

Empfehlungen

Werbung

Like Tree2Likes
Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 07.03.17
Mitglied
 
Registriert seit: Feb 2017
Beiträge: 31
ping befindet sich auf einem aufstrebenden Ast
Standard komischer Fehler

Hi,

habe hier einen echt komischen Fehler:

so läuft das Programm fehlerlos:
Code:
#property indicator_chart_window
#property strict
string Feld[6],Zeichenkette="0,1,2,3,4,5";
int init()
{ StringSplit(Zeichenkette,StringGetCharacter(",",0),Feld);
  Alert(Feld[5]);
  return(0);
}
int start()
{ return(0);
}
wenn man aus der Zeichenkette ,5 löscht dann gibt's "array out of range":
Code:
#property indicator_chart_window
#property strict
string Feld[6],Zeichenkette="0,1,2,3,4";
int init()
{ StringSplit(Zeichenkette,StringGetCharacter(",",0),Feld);
  Alert(Feld[5]);
  return(0);
}
int start()
{ return(0);
}
weiss jemand warum?
Das Feld[5] sollte doch da sein, wenn auch leer.

ciao ping
  #2 (permalink)  
Alt 07.03.17
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.868
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

Dann würde ich einfach schreiben:

string Feld[];

traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #3 (permalink)  
Alt 07.03.17
Mitglied
 
Registriert seit: Feb 2017
Beiträge: 31
ping befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Dann würde ich einfach schreiben:

string Feld[];

traderdoc
nee, ist ja derselbe Fehler, nur jetzt zu Recht nachvollziehbar.

eine Lösung dafür ist ja einfach (wenn die Anzahl der Teilstrings nicht bekannt ist):

Code:
#property indicator_chart_window
#property strict
string Feld[],Zeichenkette="0,1,2,3,4";
int init()
{ if(StringSplit(Zeichenkette,StringGetCharacter(",",0),Feld)>5)
    Alert(Feld[5]);
  else
    Alert("kein 5. Teilstring vorhanden");
  return(0);
}
int start()
{ return(0);
}
aber ich wundere mich nur, dass man ein Array mit seiner Elementenanzahl fest definiert und dann sind nach StringSplit nicht mehr alle Elemente vorhanden. Das ist halt komisch.
  #4 (permalink)  
Alt 07.03.17
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.868
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

Ja was heißt da "nee", wenn Du im darauffolgenden Code
string Feld[] selber benutzt?

traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #5 (permalink)  
Alt 08.03.17
Mitglied
 
Registriert seit: Feb 2017
Beiträge: 31
ping befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Ja was heißt da "nee", wenn Du im darauffolgenden Code
string Feld[] selber benutzt?

traderdoc
versteh ich jetzt nicht.

meinst du "Alert(Feld[]);"

im Orginalcode wollte ich Feld[5] einer Variablen zuweisen.
NeueVariable[i]=Feld[5];
und da kam der "Array out of Range", weil teilweise (in einer Schleife aus einer Datei ausgelesen) kein 5.Teilstring in "Zeichenkette" vorhanden war.

Ich würde das (bis jemand eine logische Begründung abliefert warum das so sein muss) als "Bug" bezeichnen.
  #6 (permalink)  
Alt 08.03.17
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.868
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

Dann probiere doch mal folgendes aus:

string Feld[6];

Alert(Feld[0]); // oder auch Index 1 bis 5

Was siehst Du da?

traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #7 (permalink)  
Alt 16.03.17
Mitglied
 
Registriert seit: Feb 2017
Beiträge: 31
ping befindet sich auf einem aufstrebenden Ast
Standard

Hi,

abschließend sei angemerkt:

egal wie man die Array-Variable Feld definiert

string Feld[]; oder
string Feld[1]; oder
string Feld[5];
string Zeichenkette="0,1,2";

nach dem Funktionsaufruf

StringSplit(Zeichenkette,StringGetCharacter(",",0) ,Feld);

wird für Feld neuer Speicher allokiert.

in diesem Fall hat Feld immer 3 Elemente. (sebst bei string Feld[1] wohlgemerkt)

ciao ping
  #8 (permalink)  
Alt 16.03.17
Benutzerbild von Kronenchakra
Premium Mitglied
 
Registriert seit: Feb 2016
Ort: 2100 Österreich
Beiträge: 309
Kronenchakra befindet sich auf einem aufstrebenden Ast
Lightbulb Stringsplit

Jetzt hat mich das aber auch interessiert was da los ist mit dem StringSplit().
Also kleines Testscript gebaut und schon ist alles klar.
Das Array wird nicht ReAlloziert.
Ist es statisch zu klein, ergibt das einen Fehler.
Ist es statisch zu groß, passiert nix.
Das beste ist, das Array von Stringsplit() dynamisch allozieren zu lassen.
Hier das TestScript: Teste das Feld statisch: Feld[3], Feld[7] und dynamisch Feld[]
Code:
void OnStart()
{
   string Feld[];
   string Zeichenkette="0,1,2,3,4";
   Print("ArraySize is ",ArraySize(Feld));
   int count=StringSplit(Zeichenkette,StringGetCharacter(",",0),Feld);
   Print("ArraySize is ",ArraySize(Feld));
   Print(count," Elements found");
   if(count<0)
      {
         Print("a *ERROR* oh Kurt, Array is too small!");
         return;
      }
   for(int i=0; i<count; i++)    // IndexMax = count-1
      Print(Feld[i]);
}
Ich denke das beseitigt alle Unklarheiten.

Grüße Otto
__________________
Das Gras wächst nicht schneller wenn man daran zieht
  #9 (permalink)  
Alt 17.03.17
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.868
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

"Das Array wird nicht ReAlloziert.
Ist es statisch zu klein, ergibt das einen Fehler.
Ist es statisch zu groß, passiert nix."

Ja, was denn sonst!?

traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #10 (permalink)  
Alt 17.03.17
Mitglied
 
Registriert seit: Feb 2017
Beiträge: 31
ping befindet sich auf einem aufstrebenden Ast
Standard

Hi traderdoc, hi Kronenchakra,

ich glaube wir arbeiten mit unterschiedlichen Builds die unterschiedlich arbeiten.
Also ich habe Build 1045

und da ergeben sich folgende Ergebnisse:

bei 1.:
Code:
void OnStart()
{
   string Feld[];
   string Zeichenkette="0,1,2,3,4";
   Alert("ArraySize is ",ArraySize(Feld));
   int count=StringSplit(Zeichenkette,StringGetCharacter(",",0),Feld);
   Alert("ArraySize is ",ArraySize(Feld));
   Alert(count," Elements found");
   if(count<0)
      {
         Alert("a *ERROR* oh Kurt, Array is too small!");
         return;
      }
   for(int i=0; i<count; i++)    // IndexMax = count-1
      Alert(Feld[i]);
}
Feld[].PNG

bei 2.:
Code:
void OnStart()
{
   string Feld[1];
   string Zeichenkette="0,1,2,3,4";
   Alert("ArraySize is ",ArraySize(Feld));
   int count=StringSplit(Zeichenkette,StringGetCharacter(",",0),Feld);
   Alert("ArraySize is ",ArraySize(Feld));
   Alert(count," Elements found");
   if(count<0)
      {
         Alert("a *ERROR* oh Kurt, Array is too small!");
         return;
      }
   for(int i=0; i<count; i++)    // IndexMax = count-1
      Alert(Feld[i]);
}
Feld[1].PNG

bei 3.:
Code:
void OnStart()
{
   string Feld[20];
   string Zeichenkette="0,1,2,3,4";
   Alert("ArraySize is ",ArraySize(Feld));
   int count=StringSplit(Zeichenkette,StringGetCharacter(",",0),Feld);
   Alert("ArraySize is ",ArraySize(Feld));
   Alert(count," Elements found");
   if(count<0)
      {
         Alert("a *ERROR* oh Kurt, Array is too small!");
         return;
      }
   for(int i=0; i<count; i++)    // IndexMax = count-1
      Alert(Feld[i]);
}
Feld[20].PNG

... und das ist genau wie von mir beschrieben, das Feld wird neu allokiert!

... oder habe ich vieleicht "Build 1045 extended vision" und wusste bisher gar nix davon?

ciao ping


Thema geschlossen

Lesezeichen

Stichworte
array out of range, error, fehler, mql4, programmierung, programmierung metatrader, programmierung mql4


Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +1. Es ist jetzt 09:55 Uhr.



Der Wavesnode - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2017 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2017 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------