Struktura jako parametr funkcji/procedury

Odpowiedz Nowy wątek
2006-06-22 16:26

Rejestracja: 17 lat temu

Ostatnio: 3 tygodnie temu

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


Pozostało 580 znaków

2006-06-22 17:17

Rejestracja: 16 lat temu

Ostatnio: 10 lat temu

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.


<font color="red">Konto porzucone</span>

Dzięki wszystkim forumowiczom za lata wspólnych dyskusji; miłej zabawy w programowanie!
Sławomir 'Szczawik' Włodkowski

Pozostało 580 znaków

2006-06-22 17:58

Rejestracja: 17 lat temu

Ostatnio: 3 tygodnie temu

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]


Pozostało 580 znaków

wil
2006-06-22 21:14
wil

Rejestracja: 14 lat temu

Ostatnio: 1 rok temu

0

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

Pozostało 580 znaków

spc
2006-06-22 21:32
spc

Rejestracja: 14 lat temu

Ostatnio: 10 miesięcy temu

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.


00, OK, 00, 00
...dziś się to robi na sprzętach, kiedyś na patentach...

Pozostało 580 znaków

2006-06-22 22:07

Rejestracja: 16 lat temu

Ostatnio: 10 lat temu

0

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


<font color="red">Konto porzucone</span>

Dzięki wszystkim forumowiczom za lata wspólnych dyskusji; miłej zabawy w programowanie!
Sławomir 'Szczawik' Włodkowski

Pozostało 580 znaków

Odpowiedz

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