Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Ist die Verwendung von TStrinList sinnvoll?


Kroni - Di 23.11.04 18:21
Titel: Ist die Verwendung von TStrinList sinnvoll?
Hallo.

Ich habe ein Primzahlgeneratorprogramm geschrieben. Jedoch ist ja bei Delphi die Ausgabe in Memos so ein bisschen langsam. Nun könnte man ja normal, während der Rechner rechnet die Primzahlen speichen.
In ein dynamische Array geht nicht, weil ich Delphi 3 habe, sonst würde ich ja diese Variante benutzen.
Wäre das mit nem TStringList Sinnvoll?
Wenn ja, wie genau muss ich das verwenden? werd aus den anderen antworten noch nich schlau


.Chef - Di 23.11.04 19:38

Sinnvoller wäre eine Liste für Integertypen, da du dir so die Umwandlung sparst. Entweder leitest du sie von TList ab, oder du implementierst sie selbst mit Pointern von einem Listeneintrag zum nächsten. (Stichwort "einfach/doppelt verkettete Liste")

Gruß,
Jörg


Motzi - Di 23.11.04 19:43

Ach.. es geht auch direkt mit ner TList..! Einfach nur die Integers in einen Pointer casten.. ;)


wulfskin - Di 23.11.04 19:48

Nur mal zum Verständnis:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
type
  PItem = ^TItem;
  TItem = record
    NextItem: PItem;
    Value: Integer;
  end;
Das ist eine einfach verkettete Liste, oder? Was ist dann eine mehrfach verkettete Liste?

Gruß Hape!


Motzi - Di 23.11.04 19:56

Eine doppelt verkette Liste hat 2 Zeiger -> einen zum Vorgänger und einen zum Nachfolger. Dadurch kann die Liste in beide Richtungen durchlaufen werden...


Kroni - Di 23.11.04 22:13

oder wäre nich vlt. doch sinnvoller, auf delphi 6 umzusteiegen und ein variables array zu nehmen??
klingt für mich n bissl einfacher....
na ja, ansonsten mal warten, bis unser Lehrer uns das erklärt.....haben noch nicht mal prozeduren und funktionen gelernt *selbst beigebrach hat*
na ja.....immer diese langsamen schüler im kurs^^
aber denen kann man dann ja helfen......


BenBE - Di 23.11.04 22:29

Naja, wenn schon kein dynamisches Array geht, kann man trotzdem den Delphi-Compiler dazu bringen, so etwas ähnliches zu erzeugen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
type
    TDynMemArray = array[0..0] of Integer;
    PDynMemArray = ^TDynMemArray;
var
    PrimList : PDynMemArray;
begin
    GetMem(PrimList, 1024 * 1024 * SizeOf(TDynMemArray));
    While not PrimListIsVoll do
        SuchePrimZahl;
    FreeMem(PrimList);
end;


Zugreifen kannst du auf die einzelnen Elemente von PrimList durch PrimList^[ElementIndex].
Obwohl dies zwar offensichtlich den Index überschreitet erlaubt Delphi dieses Konstrukt, da es bei Zeigertypen keine Prüfung auf die Array-Grenzen durchführt.

Das ist zum einen schneller als TList\TStringList und kann zum anderen mit ReallocMem schnell vergrößert werden.


.Chef - Mi 24.11.04 00:06

Kroni hat folgendes geschrieben:
oder wäre nich vlt. doch sinnvoller, auf delphi 6 umzusteiegen und ein variables array zu nehmen??

Nein! Denn so lernst du wenigstens was.


BenBE - Mi 24.11.04 00:38

Übrigens: Die Variante mit GetMem \ ReallocMem und FreeMem kann als "dynamisches Array" angesehen werden, ist aber nicht so komfortabel, wie die dynamischen Arrays aus D4++, da du dich um die Bereichsprüfung, Speicherreservierung und die anderen Dinge selber kümmern musst.

BTW: Hab auf die Art uns weise ohne ASM mal ein Primzahlsuchprogramm geschrieben, dass die ersten 10,000,000 Primzahlen mit einer Geschwindigkeit von 400,000 Zahlen je Sekunde prüft. Allerdings dürfte dieses Programm auf D3 leider net laufen, da es Int64 nutzt und dieser IIRC auf D3 nicht verfügbar ist.


Kroni - Mi 24.11.04 16:29

ok....stimmt schon, aber ich befinde mich ja noch im Anfang meiner Informatiklaufbahn....aber ich denke, dass ich das von BenBE soweit verstanden habe....
Aber 400.000 Zahlen pro Sekunde? *staunz*
Na ja.....quartalsnote heute bekommen und ne eins...so kanns weiter gehen=)
danke an euch...muss nämlich noch viel lernen und bald n referat über die programmiersprachen und typen halten.