fidionael - Di 08.08.06 23:12
Titel: Parser von Delphi zu C++
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.
ManniTwo - Fr 11.08.06 10:44
zunächst mal verstehe ich zeile 11 des C++-Quelltextes nicht
da meinst du wohl eher
wahrscheinlich war das aber nur ein fehler hier beim übertragen ins forum...
mehr konnte ich bislang nicht entdecken