|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
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); } 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); } Das Feld[5] sollte doch da sein, wenn auch leer. ciao ping |
|
|||
Dann würde ich einfach schreiben:
string Feld[]; traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Zitat:
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); } |
|
|||
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. |
|
|||
Zitat:
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. |
|
|||
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. |
|
|||
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 |
|
|||
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]); } Grüße Otto |
|
|||
"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. |
|
|||
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]); } 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]); } 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]); } ... 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 |
Lesezeichen |
Stichworte |
array out of range, error, fehler, mql4, programmierung, programmierung metatrader, programmierung mql4 |
|
|