nazwa array jako zmienna

nazwa array jako zmienna
MR
  • Rejestracja:prawie 7 lat
  • Ostatnio:9 dni
  • Postów:118
0

Mam kilka tablic array of string które są różnej długości
I chciałbym zrobić jedną funkcję, która w nazwie przyjmuje nazwę takiej tablicy jako string i wartość i sprawdza czy w takiej tablicy istnieje taka wartość

Kopiuj
const 
  MyArray_elementy  : array  [0..2] of string = ('element 1','element 2','element 3');
  MyArray_imiona    : array  [0..3] of string = ('Adam','Ewa','Zosia','Kamil');

Function CzyIstniejeWTablicy(nazwa_tablicy, poszukiwana_wartosc : string):Boolean
var i:byte;
begin
  tutaj trzeba jakoś znaleźć tę tablicę po jej nazwie  

  tutaj będzie pętla po tablicy
end


if CzyIstniejeWTablicy('MyArray_imiona','Ewa') then

Wiem, że zamiast podawać tę tablicę jako string, lepiej od raz podać jej nazwę, problem w tym, że ja te dwie wartości muszę zapisać a później je odczytać i wtedy już mam je w stringu.
Da się tak zrobić?

edytowany 4x, ostatnio: Riddle
_13th_Dragon
Może zacznij od zapoznania się z podstawami syntaksu pascala ...
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:15 dni
2
Kopiuj
type TMyArray:array[0..2] of String;

function CzyIstniejeWTablicy(const nazwa_tablicy:TMyArray;poszukiwana_wartosc:string):Boolean;
var I:Integer;
var Str:String;
begin
  for I:=Low(nazwa_tablicy) to High(nazwa_tablicy) do
  begin
    if nazwa_tablicy[i]=poszukiwana_wartosc then
    begin
      Result:=true;
      Exit;
    end;
  end;
  Result:=false;
end;

if CzyIstniejeWTablicy(MyArray_elementy,'Ewa') then ...

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
ZD
  • Rejestracja:ponad 3 lata
  • Ostatnio:ponad rok
  • Postów:2310
3

@_13th_Dragon:

Sądzę, że kolega jakiś XY wymyśla, tylko jaki ... słownik TDictionary ???

@My Razem:

Przeczuwam, że zaplatałeś się w myśleniu o języku, i chodzi od coś w rodzaju

Kopiuj
Function CzyIstniejeWTablicy(const arr: Array of string; const str: String);
...
if CzyIstniejeWTablicy(MyArray_imiona,'Ewa') then

If you put a million monkeys at a million keyboards, one of them will eventually write a Java program - the rest of them will write Perl
edytowany 1x, ostatnio: ZrobieDobrze
ZD
Czytam założenie o drukowaniu .... to raczej się ręcznie coś "pomaga" podczas drukowania, np podając dodatkowy opis, niż masakruje struktury danych na nieoptymalne, aby akurat w drukowaniu było ćwierć kroku łatwiej
woolfik
  • Rejestracja:ponad 17 lat
  • Ostatnio:około godziny
  • Postów:1598
2
Kopiuj
unit Unit1;

interface

uses
  Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.Generics.Collections;

type
  TTypeArrayOfString =  array  [0..3] of string;
  TMyDictArray = TDictionary<string,TTypeArrayOfString>;
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  strict private
    dict: TMyDictArray;
  private
    const
        MyArray_elementy  : TTypeArrayOfString = ('element 1','element 2','element 3','');
        MyArray_imiona    : TTypeArrayOfString = ('Adam','Ewa','Zosia','Kamil');
  public
    constructor Create(AOwner: TComponent);  override;
    destructor Destroy(); override;
  end;

var
  Form1: TForm1;

implementation


{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin

    dict.AddOrSetValue('MyArray_elementy',MyArray_elementy);
    dict.AddOrSetValue('MyArray_imiona',MyArray_imiona);

end;

procedure TForm1.Button2Click(Sender: TObject);
var
  d: TTypeArrayOfString;
  I: Integer;
begin
    dict.TryGetValue('MyArray_imiona',d);
    for I := 0 to Length(d) -1 do
        if d[i] = 'Ewa' then
            ShowMessage('HURRA');
end;

constructor TForm1.Create(AOwner: TComponent);
begin
    inherited Create(AOwner);
    dict := TMyDictArray.Create();
end;

destructor TForm1.Destroy;
begin
    dict.Free();
    inherited;
end;

end.

chociaż tu aż prosi się o TStringList i IndexOf lub IndexOfValue :) ale skoro pytacz chce na arrayach to ma

edytowany 1x, ostatnio: woolfik
_13th_Dragon
Czy nie prościej: TTypeArrayOfString = array[0..1] of array string; tym bardziej że jeden ma rozmiar 3 zaś drugi 4?
woolfik
Można pisalem na szybko i dalej obstawiam tstringlist
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 9 godzin
  • Lokalizacja:Tuchów
  • Postów:12175
3

Myślę, że autorowi chodzi o to, aby użyć nazwy zmiennej jak ciągu znaków i na jej podstawie wybrać którąś tablicę do przeszukania. Odpowiedź jest prosta — tak się nie da. Zmienne nie posiadają nazw, które można by użyć z poziomu kodu tak jak zwykłe łańcuchy. I nie, RTTI też nie pomoże, bo ono dotyczy typów danych, nie identyfikatorów.

Jeśli chcesz identyfikować jakieś kolekcje łańcuchów na podstawie nazwy, to trzymaj je w obiektach typu TStringList, natomiast wszystkie listy trzymaj np. w słowniku, w którym kluczem jest nazwa kolekcji, a wartością referencja listy. Coś na kształt poniższego (pisane z palca):

Kopiuj
type
  TNamedStringCollections = TDictionary<String, TStringList>;

Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 1x, ostatnio: flowCRANE
GS
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 3 godziny
1

I chciałbym zrobić jedną funkcję, która w nazwie przyjmuje nazwę takiej tablicy jako string

Tak się nie da. Twoja nazwa tablicy istnieje tylko w kodzie źródłowym

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 9 godzin
  • Lokalizacja:Tuchów
  • Postów:12175
2

Zawsze można też rozszerzyć klasę TStringList i dodać do niej pole przechowujące nazwę listy (oraz właściwość). Można też nadpisać sobie metody, tak aby nazwa z dodatkowego pola była respektowana (np. przez metody LoadFromFile i SaveToFile). To pozwoli używać luźnych TStringList, bez wrzucania ich do słownika/mapy.

Możliwości jest od uja, przy czym najgorszą z nich jest zabawa dynamicznymi macierzami.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 3x, ostatnio: flowCRANE

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.