AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Parsen der Kommandozeilenparameter

Ein Thema von DMW · begonnen am 11. Okt 2006 · letzter Beitrag vom 11. Okt 2006
Antwort Antwort
DMW

Registriert seit: 6. Sep 2006
Ort: Münster
269 Beiträge
 
Delphi XE Professional
 
#1

Parsen der Kommandozeilenparameter

  Alt 11. Okt 2006, 21:22
Guten Abend allerseits.

Vorweg: eigentlich programmiere ich mit C und C++; mit Delphi habe ich bisher noch keine Erfahrung. Jetzt habe ich aber einen Quelltext für Delphi, den in C++ umzusetzen ein sehr großer Aufwand wäre, weshalb ich versuche, ihn in eine Delphi-Kommandozeilenapplikation zu integrieren. Das klappt soweit eigentlich auch, nur habe ich nun seltsame Probleme mit meinem ersten Versuch, den Kommandozeilenparameter in mehrere Teile zu zerlegen: Der Code wird zwar fehlerfrei kompiliert, aber die Ausführung wird plötzlich abgebrochen.

Hier der relevante Codeauszug:
Delphi-Quellcode:
var
  parameters : Array of String;

  procedure readParameters ();
  var
    cp, ptr : PChar;
    quota, escape : Boolean;
    ai : Integer;

  begin
    quota := false;
    escape := false;
    ptr := GetCommandLine ();
    ai := 1;
    SetLength (parameters, 1);


    while ptr^ <> #0 do
    begin
      if (ptr^ = '"') then // parameter in quotation marks
      begin
        quota := not quota;
        inc (ptr);
        continue;
      end;
      if (ptr^ = ' ') and (not quota) then // end of parameter
      begin;
        inc (ai);
        SetLength (parameters, ai);
        inc (ptr);
        continue;
      end;
      parameters[ai] := parameters[ai] + String (ptr^);
      inc (ptr);
    end;

  end;

begin;
  readParameters ();

  { ... }
end.
Die über Leerzeichen getrennte Kommandozeilenparameter sollen im Array parameters der Reihe nach untergebracht werden. Nun gibt es aber zwei Probleme:
- die Zeile parameters[ai] := parameters[ai] + String (ptr^); tut nicht, was sie soll: parameters[ai] ist nach der Ausführung mit ptr^='E' so leer wie zuvor.
- nach der zweiten Ausführung ebendieser Zeile springt die Applikation aus mir unerklärlichen Gründen zum Programmende.

Der Code wurde unter Turbo Delphi 2006 getestet, die Quelltexte, die ich benötige, sind hier verfügbar.

Hat jemand eine Erklärung für das Phänomen? Oder stellt Delphi möglicherweise Funktionen zum einfachen Parsen des Kommandozeilenparameters bereit, die mir nicht bekannt sind?
Moritz
"Hey, it compiles! Ship it!"
C++Builder Pages
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Parsen der Kommandozeilenparameter

  Alt 11. Okt 2006, 21:26
Warum nutzt du nicht Delphi-Referenz durchsuchenParamCount und Delphi-Referenz durchsuchenParamStr?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
DMW

Registriert seit: 6. Sep 2006
Ort: Münster
269 Beiträge
 
Delphi XE Professional
 
#3

Re: Parsen der Kommandozeilenparameter

  Alt 11. Okt 2006, 21:30
Zitat von Luckie:
Warum nutzt du nicht Delphi-Referenz durchsuchenParamCount und Delphi-Referenz durchsuchenParamStr?
Weil sie mir nicht bekannt waren Vielen Dank!

Dennoch, kann sich jemand das seltsame Verhalten erklären?
Moritz
"Hey, it compiles! Ship it!"
C++Builder Pages
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Parsen der Kommandozeilenparameter

  Alt 11. Okt 2006, 21:39
Dein "ai" hat den falschen wert. Wenn dein Array 1 Element groß ist, ist "ai" bei dir 1 so das du auf Index 1 zugreifst obwohl das Array 0 basiert ist.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
DMW

Registriert seit: 6. Sep 2006
Ort: Münster
269 Beiträge
 
Delphi XE Professional
 
#5

Re: Parsen der Kommandozeilenparameter

  Alt 11. Okt 2006, 21:40
Zitat von SirThornberry:
Dein "ai" hat den falschen wert. Wenn dein Array 1 Element groß ist, ist "ai" bei dir 1 so das du auf Index 1 zugreifst obwohl das Array 0 basiert ist.
Ah, vielen Dank. Irgendwie hatte ich noch im Hinterkopf, daß in Delphi Arrays bei 1 anfangen (vermutlich, weil das bei AnsiString in Turbo C++ so ist)...
Moritz
"Hey, it compiles! Ship it!"
C++Builder Pages
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Parsen der Kommandozeilenparameter

  Alt 11. Okt 2006, 21:44
Ist in C und C++ aber nicht anders.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
DMW

Registriert seit: 6. Sep 2006
Ort: Münster
269 Beiträge
 
Delphi XE Professional
 
#7

Re: Parsen der Kommandozeilenparameter

  Alt 11. Okt 2006, 21:53
Zitat von Luckie:
Ist in C und C++ aber nicht anders.
Nein, aber AnsiString, das ja irgendwie mit dem String-Typ in Delphi zusammenhängt, wird ab 1 indiziert, was bei mir wohl einen falschen Eindruck hinterlassen hat.
Moritz
"Hey, it compiles! Ship it!"
C++Builder Pages
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz