TIntArray

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Scotty
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

Beitrag von Scotty »

...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.

Benutzeravatar
theo
Beiträge: 10950
Registriert: Mo 11. Sep 2006, 19:01

Re: TIntArray

Beitrag von theo »

Wo ist TIntArray deklariert?

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;

Scotty
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

Beitrag von Scotty »

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.

MAC
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

Beitrag von MAC »

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...

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;
Oder willst du einfach ein

Code: Alles auswählen

Intarray = array of Integer;
deklarieren

Code: Alles auswählen

Signatur := nil;

Scotty
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

Beitrag von Scotty »

Besten Dank, das sind ja mehr als "wenige Zeilen programmiert". :mrgreen:
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>;
(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.

Antworten