Autor Beitrag
fidionael
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 232

Win XP SP2, Ubuntu 6.06
Delphi 7 PE, Delphi 3 Prof
BeitragVerfasst: Di 08.08.06 23:12 
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:
ausblenden 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:

ausblenden 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:
ausblenden 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:
ausblenden 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:
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 129



BeitragVerfasst: Mi 09.08.06 07:23 
malloc() ist c Syntax (new ist c++)
(Das hat aber nichts mmit dem Problem zu tun.)

_________________
Wennn man feststellt, dass es drei Moeglichkeiten gibt, die einen Vorgang schiefgehen lassen koennen und man diese ausschaltet, entstehen automatisch drei neue Moeglichkeiten.
fidionael Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 232

Win XP SP2, Ubuntu 6.06
Delphi 7 PE, Delphi 3 Prof
BeitragVerfasst: Fr 11.08.06 09:06 
Hat sonst niemand eine Idee?
ManniTwo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 46

Win XP SP III, Ubuntu 8.04, Debian 5.0
Delphi 5 Pro; Delphi 2005; C++,C# (VS 2005); Java, Ruby (Eclipse)
BeitragVerfasst: Fr 11.08.06 10:44 
zunächst mal verstehe ich zeile 11 des C++-Quelltextes nicht
ausblenden Quelltext
1:
cArg[cLen] = 0;					

da meinst du wohl eher
ausblenden Quelltext
1:
cArg[nArg][cLen] = 0;					

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

mehr konnte ich bislang nicht entdecken

_________________
Wer andern eine Bratwurst brät, der hat ein Bratwurst-Brat-Gerät, oder anders:
ausblenden Delphi-Quelltext
1:
if Self.BraetAndernEineBratwurst then Self.HasBratwurstBratGeraet := true;					
fidionael Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 232

Win XP SP2, Ubuntu 6.06
Delphi 7 PE, Delphi 3 Prof
BeitragVerfasst: Fr 11.08.06 15:33 
DANKE

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