Avatar billede speedy Nybegynder
03. juli 2000 - 15:03 Der er 8 kommentarer og
1 løsning

Dyn. 2 dim. array - igen

Hej

Jeg spurgte for et par dage siden om, hvordan man satte længden på et 2 dim. array (altså dynamisk :) Der skulle man feks. skrive

SetLength(MitArray, 100, 100);

Men så hedder den første plads i arrayet 0. Det er også tit godtnok, men jeg er ved at lave et komponent, hvor det er rimelig vigtigt at den starter på 1. Er det muligt ?? Hvis ja hvordan ??

/SpEeDy

Avatar billede sjensen Nybegynder
03. juli 2000 - 15:38 #1
Så vidt jeg husker kan du angive et eller andet sted om dine arrays starter med 0 eller med 1 når du ikke selv angiver arrayet. Det bør hedde noget med BASE(0) eller BASE(1), men jeg er ikke helt sikker på hvor, eller hvordan, du skal gøre det.

Prøv at se om du kan finde noget omkring "base" (el. arraybase eller noget i den stil)
Avatar billede speedy Nybegynder
04. juli 2000 - 20:57 #2
kan ikke finde noget :(

/SpEeDy
Avatar billede retep Nybegynder
05. juli 2000 - 04:51 #3
He he... Endnu engang et opslag... Denne gang fra Delphi 4 Developers Guide:

Dynamic arrays are always zero-based.

Om du vil stole på bogen vil jeg lade være helt op til dig!
Mvh
Retep
Avatar billede pellelil Nybegynder
05. juli 2000 - 08:37 #4
Kan du ikke "bare" lavet en Property der læser dit array "som om" de started med 1. Det vil sige at dit fysiske array går fra 0 til 99 men når du tager fat i det via Property'en "ser det ud som om" det gik fra 1 til 100 ???
Avatar billede speedy Nybegynder
05. juli 2000 - 10:08 #5
retep>> tak! Men øv... :)

pellelil>> Ha du en ide til hvordan det skal gøres ??

/SpEeDy
Avatar billede speedy Nybegynder
05. juli 2000 - 10:08 #6
pellelil>> Du skal nok få nogle points :)

/SpEeDy
Avatar billede pellelil Nybegynder
05. juli 2000 - 10:29 #7
For nemhedens skyld bruger vi et std. array:

<SNIP>
type
  TNullBasedArray = Array[0..99] of String;

  TWhatever = Class
  private
    FArray : TNullBasedArray;   
    Function  GetArray(iIdx : Integer) : String;
    Procedure SetArray(iIdx : Integer; szValue : String);
  public
    Constructor Create;
    Destructor  Destroy;
    Property ArrayValue[iIdx : Integer] : String read GetArray write SetArray;
  End;
</SNIP>

Vi "springer over hvor der er hul i hegnet" og beskriver således kun indholdet af GetArray/SetArray:

<SNIP>
Function  TWhatever.GetArray(iIdx : Integer) : String;
begin
  if iIdx < 1 then iIdx := 1;      // "God vane"
  if iIdx > 100 then iIdx := 100; 
  Result := FArray[iIdx-1];
end;

Procedure TWhatever.SetArray(iIdx : Integer; szValue : String);
begin
  if iIdx < 1 then iIdx := 1;      // "God vane"
  if iIdx > 100 then iIdx := 100; 
  FArray[iIdx+1] := szValue;
end;
</SNIP>

Når du skal "bruge data" så glemmer du alt om FArray og læser/sætter alt gennem din property.

<SNIP>
var
  Whatever : TWhatever;
  szTest  : String;
begin
  Whatever := TWhatever.Create;
  Whatever.ArrayValue[35] := 'Test':
  szTest := Whatever.ArrayValue[35];
  Whatever.Free;
</SNIP>
Avatar billede pellelil Nybegynder
05. juli 2000 - 10:31 #8
Linien "FArray[iIdx+1]..." i SetArray skulle naturligvis være "-1" i stedet for "+1"
Avatar billede speedy Nybegynder
05. juli 2000 - 13:09 #9
pellelil>> "Vielen dank", "thank you", "tak skal du ha".

Se : http://www.eksperten.dk/spm.asp?id=20502

/SpEeDy

Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester