Low() i High() dla tablicy zdeklarowanej jako stała

0

Mam pewien poniżej trochę kodu:

Type
  TTypePay = packed record
  const
    { Nie wolno zmieniać kolejności i wartości tablicy }
    value1 = 'Przedpłata';
    value2 = 'Pobranie';
    value3 = 'Gotówka';
    value4 = 'Odroczony termin płatności';
    TypePay: array [1 .. 4] of string = (value1, value2, value3, value4);
  end;

Function FindInTable(value: string; table: array of string):Integer;
var
  x : Integer;
begin
  Result := -1;
  for X := Low(table) to High(table) do
    if table[x] = value then Exit(X);
end;

procedure Form1.Button1;
var
  numer: integer;
begin
  numer := FindInTable('Przedpłata',TTypePay.TypePay);
end;

Dlaczego Low(table) w takim przypadku zwraca mi 0 a nie 1? Może się myle ale podając funkcji tablice TTypePay.TypePay tworzy ona w pamięci jej kopie gdzie początek tablicy zaczyna się od 0 i kończy na 3?

Jak rozwiązać ten problem? Wskazywać na tablicę - użyć wskaźników?

0
Function FindInTable(value: string; table: array of string):Integer;
var
  x : Integer;
begin
  Result := -1;
  for X := Low(table) to High(table) do
    if table[x] = value then Exit(X);
end;

Zauważ, że nie zwracasz wyniku. Zawsze wskazujesz na "-1".

Czy przypadkiem nie chodzi Ci o takie rozwiązanie?

Function FindInTable(value: string; table: array of string):Integer;
var
  x : Integer;
begin
  Result := -1;
  for X := Low(table) to High(table) do
    if table[x] = value then
      begin
       Result := x + 1; //w zasadzie to sam X powinien być.
       Exit(X);
      end;
end;
1

Dlaczego Low(table) w takim przypadku zwraca mi 0 a nie 1?

No i prawidłowo.
Zapis array of string w parametrze funkcji to tzw. open array. Można tam przekazać tablicę dowolnego rozmiaru.
Wewnątrz funkcji taka tablica jednak zawsze będzie indeksowana od zera, niezależnie od tego jak jest indeksowana na zewnątrz funkcji.

0

@Azarien podał Ci przyczynę problemów - "open array" zawsze indeksowany jest od 0;

Rozwiązaniem będzie np. deklaracja typu tablicy i wykorzystanie tego typu w deklaracji parametrów funkcji:

type
  TTypePeyArr = array [1 .. 4] of String = (value1, value2, value3, value4);

type
  TTypePey = packed record
    const
    { Nie wolno zmieniać kolejności i wartości tablicy }
    value1 = 'Przedpłata';
    value2 = 'Pobranie';
    value3 = 'Gotówka';
    value4 = 'Odroczony termin płatności';
    TypePay: TTypePeyArr = (value1, value2, value3, value4);
  end;

{...}

function FindInTable(Value: String; Table: TTypePeyArr): Integer;
var
  X: Integer;
begin
  for Low(Table) to High(Table) do
    if Table[X] = Value then
      Exit(X);

  Result := -1;
end;

Sugestia - nie wiem czy deklaracja macierzy w typie TTypePey jest celowa, w każdym razie mógłbyś podać od razu w tablicy literały dla wartości, bez używania dodatkowych stałych; Po drugie - jeśli funkcja ma zwracać wartość domyślną, to zwracaj ją na końcu ciała funkcji, bo niepotrzebnie wykonujesz dwa przypisania do rezultatu, jeśli znajdziesz szukaną wartość w macierzy; Przykład masz powyżej - przypisanie wartości -1 zapisane jest po wyszukiwaniu, dzięki temu funkcja zawsze wykona tylko jedny przypisanie;

Przy okazji - deklarując ten typ rekordowy, nie miałeś przypadkiem na myśli słówka pay od płacić? Słowo pey nie istnieje w słowniku angielskim;

1 użytkowników online, w tym zalogowanych: 0, gości: 1