Hallo!
Ich habe in Delphi einen Parser geschrieben, welcher auch funktioniert. Nun beschäftige ich mich gerade mit C++-Programmierung und habe dementsprechend versucht, meine Parsing-Funktion zu übersetzen. Hierbei ist mir aber anscheinend ein Fehler unterlaufen, der mir unerklärlich ist und bleibt.
Ich bin mir nicht sicher, ob ich mit dieser Frage hier im Forum richtig bin, aber ich wüsste nicht, wohin ich mich sonst wenden sollte.
Hier mein Delphi-Parser:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| function Parse(buf: String; divchar: Char; var output: Array of String) : Integer; var cLen,i,n: Integer; begin Result := 0; cLen := 0; i := 1;
Repeat if (buf[i] = divchar) then begin for n := 0 to cLen-1 do output[Result] := output[Result] + buf[i-(cLen-n)]; inc(Result); cLen := 0; end else if (i+1 = Length(buf)) then begin for n := 0 to cLen+1 do output[Result] := output[Result] + buf[i-(cLen-n)]; inc(Result); cLen := 0; end else inc(cLen); inc(i); Until i = Length(buf); end; |
Und hier die C++-Übersetzung:
C++ Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| int Parse(char *buf,char divchar,char **cArg) { int nArg = 0; unsigned int cLen = 0;
unsigned int i = 0; do { if (buf[i] == divchar) { cArg[nArg] = (char*) malloc((cLen+1)*sizeof(char)); for (int n = 0; n < cLen; n++) cArg[nArg][n] = buf[i-(cLen-n)]; cArg[cLen] = 0; nArg++; cLen = 0; } else if (buf[i+1] == 0) { cArg[nArg] = (char*) malloc((cLen+2)*sizeof(char)); for (int n = 0; n < cLen+1; n++) cArg[nArg][n] = buf[i-(cLen-n)]; cArg[cLen+1] = 0; nArg++; cLen = 0; } else cLen++; i++; } while (buf[i] != 0);
return nArg; } |
Um zu demonstrieren, was nicht funktioniert, hier 2 Beispielaufrufe mit Delphi- und C++-Parsing:
nArg := Parse('SAY#PLR1#PLR2#Hallo','#',MyOutput); bekommt folgende Ausgabe:
Quelltext
1: 2: 3: 4:
| [Argument 0] SAY [Argument 1] PLR1 [Argument 2] PLR2 [Argument 3] Hallo |
nArg := Parse('MOVE#PLR1#45#38','#',MyOutput); bekommt folgende Ausgabe:
Quelltext
1: 2: 3: 4:
| [Argument 0] MOVE [Argument 1] PLR1 [Argument 2] 45 [Argument 3] 38 |
Nun in C++:
nArg = Parse("SAY#PLR1#PLR2#Hallo",'#',MyOutput); bekommt folgende Ausgabe:
Quelltext
1: 2: 3: 4:
| [Argument 0] SAY [Argument 1] PLR1 [Argument 2] PLR2 [Argument 3] Hallo |
nArg = Parse("MOVE#PLR1#45#38",'#',MyOutput); bekommt folgende Ausgabe:
Quelltext
1: 2: 3: 4:
| [Argument 0] MOVE [Argument 1] PLR1 [Argument 2] (null) [Argument 3] 38 |
Für Hilfe diesbezüglich wäre ich sehr dankbar.