Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi mengentypen in einer funktion und andere probleme (https://www.delphipraxis.net/125035-mengentypen-einer-funktion-und-andere-probleme.html)

vsilverlord 29. Nov 2008 16:17


mengentypen in einer funktion und andere probleme
 
Hallo.
Ich versuche gerade, zwei array of string zu einem zusammenzufügen, was aus einem unerfindlichen Grund nicht funktioniert.
Der Quelltext ist zu lang, hässlich und zu kompliziert, ich wüsste jetzt aber auch nicht was ich ändern könnte.
Viel besser würde mir das gefallen, wenn ich mit einem Mengentypen in einer Funktion arbeiten könnte, das würde mit viel besser gefallen, zb vereinfacht so:
Delphi-Quellcode:
function tform1.fusion(a,b:set of integer):set of integer;
begin
result:=a+b
end
nur leider ist das ja unmöglich. Hier nun mein quelltext. Es gibt auf dem Formular nur 3 buttons, 2 textfelder und 1 memo. mit den ersten beiten buttons kann man strings (von edit1 und edit2) zu dem jeweiligen array of string hinzufügen (button 1 und 2). Mit button3 sollten die beiden array of string zusammengefügt werden und dann im memo1 ausgegeben werden.
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  thasenkolonie=record
    hasen:array of string;
    anzahl:integer;
    end;
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Edit2: TEdit;
    Button2: TButton;
    Memo1: TMemo;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    function hasenkoloniefusion(a,b:thasenkolonie):thasenkolonie;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  keinohrhasen,mitohrhasen:thasenkolonie;
  gemischtehasen:thasenkolonie;

implementation

{$R *.dfm}

function tform1.hasenkoloniefusion(a,b:thasenkolonie):thasenkolonie;
var
i:integer;
begin
setlength(result.hasen,a.anzahl+b.anzahl);
for i:=0 to a.anzahl-1 do
  begin
    result.hasen[i]:=a.hasen[i];
  end;
for i:=a.anzahl to (a.anzahl+b.anzahl-1) do
  begin
    result.hasen[i]:=b.hasen[i-a.anzahl+1]
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
setlength(keinohrhasen.hasen,length(keinohrhasen.hasen)+1);
keinohrhasen.hasen[length(keinohrhasen.hasen)-1]:=edit1.Text;
inc(keinohrhasen.anzahl);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
setlength(mitohrhasen.hasen,length(mitohrhasen.hasen)+1);
mitohrhasen.hasen[length(mitohrhasen.hasen)-1]:=edit1.Text;
inc(mitohrhasen.anzahl);
end;

procedure TForm1.Button3Click(Sender: TObject);
var
i:integer;
begin
gemischtehasen:= hasenkoloniefusion(mitohrhasen,keinohrhasen);
for i:=1 to gemischtehasen.anzahl do
begin
memo1.Lines.Add(gemischtehasen.hasen[i])
end
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
setlength(mitohrhasen.hasen,0);
mitohrhasen.anzahl:=0;
setlength(keinohrhasen.hasen,0);
keinohrhasen.anzahl:=0;
end;

end.

DeddyH 29. Nov 2008 16:22

Re: mengentypen in einer funktion und andere probleme
 
Ein Array ist keine Menge ;). Und wieso speicherst Du die Anzahl mit im Record, die könntest Du doch bequem mittels Length(Array) abfragen?

alzaimar 29. Nov 2008 17:32

Re: mengentypen in einer funktion und andere probleme
 
Die Klassen TList und TStringlist (und andere) haben bereits solche Methoden (TStringList.AddStrings bzw. TList.Assign). Vielleicht solltest Du fertige Klassen nehmen, anstatt das Rad neu zu erfinden.

sx2008 29. Nov 2008 20:29

Re: mengentypen in einer funktion und andere probleme
 
Just for Info:
eine Menge kann in Delphi max 256 Elemente haben und benötigt dann 8 Bytes Speicherplatz.
Daher ist set of integer keine erlaubte Menge.
set of char oder set of Byte ist die grösstmögliche Menge.
Ein Menge ist ein komplexer Datentyp und muss daher immer mit dem Schlüsselwort type zuvor deklariert werden.

Hawkeye219 29. Nov 2008 21:47

Re: mengentypen in einer funktion und andere probleme
 
Hallo,

Zitat:

Zitat von sx2008
eine Menge kann in Delphi max 256 Elemente haben und benötigt dann 8 Bytes Speicherplatz.

Das wären aber dann sehr große Bytes, von den "normalen" benötigt man 32 Stück.

@vsilverlord

Du musst bei den Indexwerten für Arrays etwas besser aufpassen.
In der Fusion der Hasenkolonien unterschlägst du einen "keinohrhasen" und fügst einen imaginären Hasen hinzu. Dabei dürfte es allerdings zu einer Zugriffsverletzung kommen.
Bei der Ausgabe im Memo liegt eine Indexverschiebung vor. Auch nach der Korrektur wirst du im Memo nichts finden. Die Hasen verraten ihrem Züchter die Gesamtzahl nicht...

Gruß Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:58 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