Struktura jako parametr funkcji/procedury

0

Witam
Chce napisac uniwersalna procedure sortujaca plik rekordowy wczytany do strumienia.
Nie jest to duzy problem jesli wiemy jakiego typu sa rekordy w tym pliku i wiemy
wedlug ktorego pola chcemy sortowac.

Chcialbym zrobic taka procedure ktorej podawalbym jako parametr:
strumien - do ktoreg jest wczytany plik,
typ rekordu - okresla jakie dane sa w nim przechowywane
pole rekordu - okresla pole wg ktorego sortuje

problem w tym ze nie wiem jak (ani czy jest to mozliwe)
jak przekazac strukture do procedury...

moze trzeba to obejsc jakimis wskaznikami albo jeszcze inaczej...?
czekam na wszelkie propozycje

0
type
  TRec = record
    pole: integer;
  end;

  PRec = ^TRec;

procedure SortA(rec:TRec);
begin
rec.pole:=0;
end;

procedure SortB(rec:PRec);
begin
rec.pole:=0;
end;

procedure Test();
var test_rec:TRec;
begin
SortA(test_rec);
SortB(@test_rec);
end;

Zwróć uwagę, że SortA nie modyfikuje test_rec tylko kopię - rec stworzoną przy przekazywaniu parametru. SortB modyfikuje test_rec.

0

niestety nie o to mi chodzilo...

pokaze przyklad:
mamy dwa typy rekordow
i dwa strumienie do ktorych je zapisujemy

type 
  TOsoba = record
    imie: string;
    wiek: integer; 
  end;

  TRoslina = record
    Nazwa: string;
    Gatunek: string;
  end;

var
  Uczniowie, Plantacja: TMemoryStream;
  Osoba: TOsoba;
  Roslina: TRoslina;

(...)
  //w petli wypelniam strumien
  Uczniowie.write(Osoba,sizeof(TOsoba));

  //w innej petli wypelniam drugi strumien
  Rosliny.write(Roslina,sizeof(TRoslina));

Teraz chce napisac procedure ktora bedzie umiala posortowac
oba te strumienie.
Do tego, jak mi sie wydaje, potrzeba jako parametry podac:

procedure SortujStrumien(STRUMIEN,TYP_REKORDU,POLE);

STRUMIEN - zawierajacy rekordy
TYP_REKORDU - zeby moc odczytac dane ze strumienia
POLE - wedlug ktorego bedziemy sortowac

z podaniem parametru STRUMIEN nie ma problemu bo to po prostu zmienna,
ale jak podac jako parametr TYP_REKORDU???? (moze wskaznik do typu?? [???] - jest cos takiego? [???])
a na podanie POLA to juz mi nawet nic do glowy nie przychodzi [glowa]

0

Zamiast typu rekordu przekazujesz funkcję porównującą te rekordy,
albo obiektowo - tworzysz kilka klas strumieni, metody virtualne, itp.

0

Funkcja sortujaca musi "wiedziec" wzgledem jakich pol sortowac. Nie odganie tego ze szklanej kuli. Polecam to co jest w powyzszych postach, wzglednie jakies matactwa z biblioteka TypInfo.

0

Albo po prostu overload funkcji - dwie różne funkcje o tej samej nazwie, ale innych parametrach.

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