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

Low() i High() dla tablicy zdeklarowanej jako stała
RD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 212
0

Mam pewien poniżej trochę kodu:

Kopiuj
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?

Opi
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1034
0
Kopiuj
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?

Kopiuj
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;
Azarien
  • Rejestracja: dni
  • Ostatnio: dni
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.

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12269
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:

Kopiuj
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;

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.