Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Parser von Delphi zu C++


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.


Gandalfus - Mi 09.08.06 07:23

malloc() ist c Syntax (new ist c++)
(Das hat aber nichts mmit dem Problem zu tun.)


fidionael - Fr 11.08.06 09:06

Hat sonst niemand eine Idee?


ManniTwo - Fr 11.08.06 10:44

zunächst mal verstehe ich zeile 11 des C++-Quelltextes nicht

Quelltext
1:
cArg[cLen] = 0;                    

da meinst du wohl eher

Quelltext
1:
cArg[nArg][cLen] = 0;                    

wahrscheinlich war das aber nur ein fehler hier beim übertragen ins forum...

mehr konnte ich bislang nicht entdecken


fidionael - Fr 11.08.06 15:33

DANKE

Stand tatsächlich so im Quelltext und war tatsächlich der gesuchte Fehler. Ich danke dir!