type wek = record
case integer of
0: ( X: Byte; )
1: ( tab : array [0..5] of Byte; )
end;
Co daje w tym przypadku instrukcja case, po co ona tu jest dana?
type wek = record
case integer of
0: ( X: Byte; )
1: ( tab : array [0..5] of Byte; )
end;
Co daje w tym przypadku instrukcja case, po co ona tu jest dana?
To jest tzw rekord wariantowy (chyba dobrze mówię) i może mieć różne wartości.
Możesz mieć dostęp do niego w ten sposób:
wek.X := ....
lub
wek.tab[0]:=...
wek.tab[1]:=...
Więcej o tego typu rekordach możesz poczytać w rekordach. Istnieje możliwość wykorzystania tej samej pamięci na przetrzymywane dane (wówczas jest niedostępne naraz tab i x) jak i oddzielnej (jest i x i tab)--Jest jeszcze jeden błąd ... :)
Apel: Piszcie w tematach o jaki język programowania chodzi np. : [Delphi], [C++], itp.
Dryobates napisał:
>jak i oddzielnej (jest i x i tab)
>
Jak? Myslalem ze tak dziala zwykly rekord, a wariantowy zawsze uzywa tej samej pamieci do poszczegolnych wariantow.--Pawel {Delphi 6 Personal}
Po pierwsze: naciśnij F1
pq napisał:
Jak? Myslalem ze tak dziala zwykly rekord, a wariantowy zawsze uzywa tej samej pamieci do poszczegolnych wariantow.
type
TToSamoMiejsceWPamieci = record
case Przelacznik: Boolean of *Zmienna o określonym typie
True: (X,Y: Integer);
False: (P: TPoint);
end;
type
TRozneMiejscaWPamieci = record
case Boolean of *Tylko typ
True: (X,Y: Integer);
False: (P: TPoint);
end;
var
A: TToSamoMiejsceWPamieci;
B: TRozneMiejscaWPamieci;
begin
ShowMessage('Rekord A zajmuje: ' + IntToStr(SizeOf(A)) + ^J'Rekord B zajmuje: ' + IntToStr(SizeOf(B)));
end;
--Jest jeszcze jeden błąd ... :)
Apel: Piszcie w tematach o jaki język programowania chodzi np. : [Delphi], [C++], itp.
Chyba nie masz racji. Roznica wielkosci wynika z koniecznosci zapamietania w rekordzie takze zmiennej przelacznik, a nie z zajmowania przez X, Y i P tej samej czy roznej pamieci. Roznica wynosi az 4 bajty z powodu wyrownywania pol. Jak dasz packed record, roznica bedzie 1.
A ze pamiec jest zawsze wspolna mozesz sie przekonac w nastepujacy sposob:
var
A: TToSamoMiejsceWPamieci;
B: TRozneMiejscaWPamieci;
begin
a.X:=10;
a.Y:=10;
a.P.X:=5;
a.P.Y:=5;
b.X:=20;
b.Y:=20;
b.P.X:=1;
b.P.Y:=1;
ShowMessage(IntToStr(A.X) + J+IntToStr(A.Y)+ J + IntToStr(B.X)+^J+IntToStr(B.Y));
end;
--Pawel {Delphi 6 Personal}
Po pierwsze: naciśnij F1
pq napisał:
Chyba nie masz racji. Roznica wielkosci wynika z koniecznosci zapamietania w rekordzie takze zmiennej przelacznik, a nie z zajmowania przez X, Y i P tej samej czy roznej pamieci. Roznica wynosi az 4 bajty z powodu wyrownywania pol. Jak dasz packed record, roznica bedzie 1.
A.P := Point(2,2);
A.X := 0;
A.Y := 1;
B.P := Point(2,2);
B.X := 0;
B.Y := 1;
ShowMessage('Suma pól w A: ' + IntToStr(SizeOf(A.X) + SizeOf(A.Y) + SizeOf(A.P) + SizeOf(A.Przelacznik)) + J'A zajmuje: ' + IntToStr(SizeOf(A)));
ShowMessage('Suma pól w B: ' + IntToStr(SizeOf(B.X) + SizeOf(B.Y) + SizeOf(B.P)) + J'B zajmuje: ' + IntToStr(SizeOf(B)));
Byćmoże pomyliłem i jest w odwrotnej kolejności (choć niekoniecznie). Stwierdzenie, że dane rekordu mogą zajmować to samo lub różne miejsce w pamięci nie jest moje. To pochodzi z książki (prawdopodobnie z : "Programowanie w Delphi" Taylor/ Mischel/Penman/Goggin wyd. The Corious Group, spolszczenie MIKOM).
Zauważ, że jeżeli w przypadku B zapiszemy coś w formacie X i Y, to nie możemy odczytać prawidłowej wartości z P. W przypadku A mamy dostępne zarówno X, Y i P.
ShowMessage('B.P.X: ' + IntToStr((B.P).X)+J'B.P.Y: ' + IntToStr((B.P).Y)+J'B.X: ' + IntToStr(B.X) + J'B.Y: ' + IntToStr(B.Y));
ShowMessage('A.P.X: ' + IntToStr((A.P).X)+J'A.P.Y: ' + IntToStr((A.P).Y)+J'A.X: ' + IntToStr(A.X) + J'A.Y: ' + IntToStr(A.Y));
Ale może coś źle zrozumiałem?--Jest jeszcze jeden błąd ... :)
Apel: Piszcie w tematach o jaki język programowania chodzi np. : [Delphi], [C++], itp.
Dryobates napisał:
>
>A.P := Point(2,2);
>A.X := 0;
>A.Y := 1;
>B.P := Point(2,2);
>B.X := 0;
>B.Y := 1;
>ShowMessage('Suma pól w A: ' + IntToStr(SizeOf(A.X) + SizeOf(A.Y) + SizeOf(A.P) + SizeOf(A.Przelacznik)) + J'A zajmuje: ' + IntToStr(SizeOf(A)));
>ShowMessage('Suma pól w B: ' + IntToStr(SizeOf(B.X) + SizeOf(B.Y) + SizeOf(B.P)) + J'B zajmuje: ' + IntToStr(SizeOf(B)));
Cos sie nie rozumiemy
powyzszy kod daje przy packed record: 17 9 dla A i 16 8 dla B.
>
>Byćmoże pomyliłem i jest w odwrotnej kolejności (choć niekoniecznie). Stwierdzenie, że dane rekordu mogą zajmować to samo lub różne miejsce w pamięci nie jest moje. To pochodzi z książki (prawdopodobnie z : "Programowanie w Delphi" Taylor/ Mischel/Penman/Goggin wyd. The Corious Group, spolszczenie MIKOM).
>
>Zauważ, że jeżeli w przypadku B zapiszemy coś w formacie X i Y, to nie możemy odczytać prawidłowej wartości z P. W przypadku A mamy dostępne zarówno X, Y i P.
>
u mnie to dziala:
a.X:=6;
a.Y:=3;
b.X:=2;
b.Y:=5;
ShowMessage('B.P.X: ' + IntToStr((B.P).X)+J'B.P.Y: ' + IntToStr((B.P).Y)+J'B.X: ' + IntToStr(B.X) + J'B.Y: ' + IntToStr(B.Y));
ShowMessage('A.P.X: ' + IntToStr((A.P).X)+J'A.P.Y: ' + IntToStr((A.P).Y)+J'A.X: ' + IntToStr(A.X) + J'A.Y: ' + IntToStr(A.Y));
jak rowniez moja wersja:
ShowMessage(IntToStr(a.p.X) + J+IntToStr(a.P.y)+J+
IntToStr(B.p.X) + ^J+IntToStr(B.P.y));
--Pawel {Delphi 6 Personal}
Po pierwsze: naciśnij F1
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.