TIntArray
-
- Beiträge: 768
- Registriert: Mo 4. Mai 2009, 13:24
- OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
- CPU-Target: x86_64-linux-qt/gtk2
- Kontaktdaten:
TIntArray
...ist definiert als array[0..$effffff] of integer. Wenn ich eine Variable mit diesem Typ deklariere, gibt es eine Exception. Wie benutzt man so etwas FPC-konform, d.h. mit entsprechenden Helperfunktionen? Setlength() geht so nicht und SetArrayLength() finde ich nicht. High() bräuchte ich noch, und ich frage mich außerdem, ob irgendwo Speicher freigegeben werden muss.
Re: TIntArray
Wo ist TIntArray deklariert?
Falls du IntegerArray meinst, afaik so:
Falls du IntegerArray meinst, afaik so:
Code: Alles auswählen
var Arr:PIntegerArray;
begin
GetMem(Arr,10*SizeOf(Integer));
Arr^[0]:=1;
Arr^[9]:=9;
FreeMem(Arr);
end;
-
- Beiträge: 768
- Registriert: Mo 4. Mai 2009, 13:24
- OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
- CPU-Target: x86_64-linux-qt/gtk2
- Kontaktdaten:
Re: TIntArray
Okay, ich hätte gedacht, dass es etwas einfacheres gibt. Bisher hatte ich ein dynamisches array of integer, was IMHO fehleranfällig ist. Per GetMem() gewinne ich recht wenig.
-
- Beiträge: 770
- Registriert: Sa 21. Feb 2009, 13:46
- OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
- CPU-Target: 32Bit
Re: TIntArray
Was willst du haben?
Willst du einen Nicht Fehleranfälligen Array ???
Soetwas gibt es nicht, allerdings kann man es sich mit wenigen Zeilen programmieren, denn man muss nur den Index prüfen ob er im richtigen bereich liegt:
Ist vlt nicht 100% richtig , da ich das mal auf die Schnelle geschrieben hab.
Im grudne verwaltet die Klasse nen Array und nen Defaultwert.
Beim lesen schaut sie ob etwas gültig ist wenn ja wird das ausgegeben wenn nein wird der defaultwert gegeben. Man könnte noch ein Booleanwert übergeben...
Beim schreiben auf einen zu hohen wert verlängert sie einfach den Array bis auf diesen (ok, das kann auch schief gehen wenn man jetzt TIntArray.INT[99999999] := 1 oder so macht
wenn der wert kleiner low() ist macht die funktion gar nichts...
Oder willst du einfach ein
deklarieren
Willst du einen Nicht Fehleranfälligen Array ???
Soetwas gibt es nicht, allerdings kann man es sich mit wenigen Zeilen programmieren, denn man muss nur den Index prüfen ob er im richtigen bereich liegt:
Ist vlt nicht 100% richtig , da ich das mal auf die Schnelle geschrieben hab.
Im grudne verwaltet die Klasse nen Array und nen Defaultwert.
Beim lesen schaut sie ob etwas gültig ist wenn ja wird das ausgegeben wenn nein wird der defaultwert gegeben. Man könnte noch ein Booleanwert übergeben...
Beim schreiben auf einen zu hohen wert verlängert sie einfach den Array bis auf diesen (ok, das kann auch schief gehen wenn man jetzt TIntArray.INT[99999999] := 1 oder so macht

wenn der wert kleiner low() ist macht die funktion gar nichts...
Code: Alles auswählen
TIntArray = class
private
fInt:array of integer;
private
function GetInt(index: integer): integer;
procedure SetInt(index: integer; const AValue: integer);
function Valid(index:integer):boolean;
public
Default_int:integer;
property Int[index:integer]: integer read GetInt write SetInt ;
end;
function TIntArray.GetInt(index: integer): integer;
begin
if Valid(index) then result := fInt[index]
else result := default_int;
end;
procedure TIntArray.SetInt(index: integer; const AValue: integer);
var
i,alt:integer;
begin
if (index < low(fInt)) then exit;
if (index > high(fInt)) then
begin
// wenn nicht gültig wird einfach erstellt, bis gültig :D
alt := length(fInt);
setlength(fInt,index+1);
for i := alt to index do fInt[i] := default_int;
end;
fInt[index] := avalue;
end;
function TIntArray.Valid(index: integer): boolean;
begin
result := (index >= low(fInt)) and (index <= high(fInt));
end;
Code: Alles auswählen
Intarray = array of Integer;
Code: Alles auswählen
Signatur := nil;
-
- Beiträge: 768
- Registriert: Mo 4. Mai 2009, 13:24
- OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
- CPU-Target: x86_64-linux-qt/gtk2
- Kontaktdaten:
Re: TIntArray
Besten Dank, das sind ja mehr als "wenige Zeilen programmiert".
Ich überlege gerade, ob die Alternative einer spezialisierten Liste nicht besser ist.
(die Deklaration stimmt noch nicht ganz, zumindest gibt es "Count" so nicht)
Den Integer hätte ich benutzt, um auf den Eintrag der Liste (bisher eine normale TList) zuzugreifen. Aber eigentlich will ich wissen, welche "Letter" schon gelegt wurden und kann die ja auch gleich komplett dort speichern.

Ich überlege gerade, ob die Alternative einer spezialisierten Liste nicht besser ist.
Code: Alles auswählen
TLetter=class
...
end;
generic TList<TLetter> = class
procedure Add(const aValue: TLetter);
end;
TLetterList = specialize TList<TLetter>;
Den Integer hätte ich benutzt, um auf den Eintrag der Liste (bisher eine normale TList) zuzugreifen. Aber eigentlich will ich wissen, welche "Letter" schon gelegt wurden und kann die ja auch gleich komplett dort speichern.