Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit StringList.IndexOf(s) (https://www.delphipraxis.net/14071-problem-mit-stringlist-indexof-s.html)

MikeC 1. Jan 2004 16:44


Problem mit StringList.IndexOf(s)
 
Hi

ich habe eine Stringlist mit folgenden einträgen (format: "index: Eintrag"; nur für's bessere verständnis)
  • 0: Eintrag 1
    1: Eintrag 2
    2: Eintrag 3
    3: Eintrag 1
    4: Eintrag 4
    5: Eintrag 5
    ...

Wenn ich jetzt mit TStringList.IndexOf(s) den eintrag "Eintrag 1" finden will, komme ich zum Listenindex 0. Wie komme ich jetzt aber an den Listenindex 3 mit einfachen Mitteln dran? Klar, wenn ich weiß, wo überall "Eintrag 1" steht, kann ich mit ner for-schleife und ner case-anweisung durch rennen, aber wenn ich das jetzt nicht weiß (z.B. in fremd-listings), habe ich ein problem.

Kann mir da jemand helfen?

Greetz
Mike

sakura 1. Jan 2004 16:45

Re: Problem mit StringList.IndexOf(s)
 
Hilft trotzdem nur eine FOR-Schleife oder ähnliches ;-)

...:cat:...

MikeC 1. Jan 2004 16:53

Re: Problem mit StringList.IndexOf(s)
 
das könnte aber mit ner for-schleife auch extrem daneben gehen. angenommen, du hast einen quellcode und in diesem stück quellcode tauchen an unterschiedlichen stellen 2 identische zeilen auf, in beiden ist ein fehler.
weiterhin ist gegeben, dass der compiler mit 2 stringlists arbeitet, einer mit dem orginal-quelltext und mit einer anderen, in der der "bereinigte" quelltext gespeichert ist (also ohne leere zeilen). das compilieren soll im bereinigten quelltext stattfinden. woher weiß jetzt der compiler, dass die fehlerhafte zeile im quelltext mehrmals auftauch? und woher weiß er an welcher stelle diese im orginalquelltext (also version mit leeren zeilen) stehen? das geht doch nur über nen index, oder?

sakura 1. Jan 2004 16:55

Re: Problem mit StringList.IndexOf(s)
 
Sorry, Du hast mich verloren. Was genau willst Du jetzt. Der Delphi-Compiler (als Beispiel) macht das imho nicht so umständlich wie Du es beschrieben hast.

...:cat:...

MikeC 1. Jan 2004 17:07

Re: Problem mit StringList.IndexOf(s)
 
ok, sorry. ich beschriebe das problem nochmal

ich habe einen compiler, der mit 2 stringlists arbeitet. in der einen steht der quelltext, so wie der user ihn schriebt, in der anderen die bereinigte version, in der alle leeren zeilen gelöscht wurden (das erspart abfragen, ob die zeile leer ist oder nicht). jetzt taucht in irgendeiner zeile ein fehler auf und eben diese zeile taucht nocheinmal irgendwo anders im sourcecode auf (ob mit fehler oder nicht ist ja egal). der compiler soll jetzt eine fehlermeldung rausgeben, in der auch die zeile im programm enthalten ist. (also sowas wie "Error 1 (in line 19): "blablabla" "). da der compiler mit der bereinigten version vom source-code arbeitet, stellt sich die frage, woher weiß der compiler, wo er sich gerade im programm befindet? er könnte natürlich einfach die zeile aus der bereinigten version nehmen, nur bringt das dem user nix, weil die zeilenangabe dann nicht mehr mit seiner sourcecode-version übereinstimmt. also muss der compiler (meiner imho) nach auf einen index zurückgreifen, den er sich am besten aus der unbereinigten version von seinem quelltext holt. problem dabei: wenn in diesem quelltext eine zeile mehrfach auftritt, wird er nur den ersten eintrag erhalten, weil TStringlist.IndexOf(s) halt mal so arbeitet. Erare humanum est aber ich wüsste keine andere möglichkeit meinen bescheidenen kleinen compiler zu schreiben.
wie macht borland das denn?

Chewie 1. Jan 2004 17:10

Re: Problem mit StringList.IndexOf(s)
 
Du kannst in jedem Element einer Stringlist neben dem String noch ein Objekt speichern. Ein Objekt ist nichts anderes als ein Zeiger. Du könntest dort einen Zeiger auf die Originalzeile speichern.

MikeC 1. Jan 2004 17:13

Re: Problem mit StringList.IndexOf(s)
 
ich habe grade eine andere möglichkeit gefunden. Zugegeben umständlich aber sie funktioniert

ich definiere einen typ TIntegerlist und schreibe eine Funktion GetCodeLines(Searchline: string):TIntegerlist, die den sourcecode in der orginalversion durchrennt und mir alle einträge in der integerlist zurückgibt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz