Pytanie

0

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?

0

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.

0

Dryobates napisał:

&gtjak i oddzielnej (jest i x i tab)
&gt

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

0

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.

0

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

0

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.

0

Dryobates napisał:
&gt
&gtA.P := Point(2,2);
&gtA.X := 0;
&gtA.Y := 1;
&gtB.P := Point(2,2);
&gtB.X := 0;
&gtB.Y := 1;
&gtShowMessage('Suma pól w A: ' + IntToStr(SizeOf(A.X) + SizeOf(A.Y) + SizeOf(A.P) + SizeOf(A.Przelacznik)) + J'A zajmuje: ' + IntToStr(SizeOf(A)));
&gtShowMessage('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.

&gt
&gtByć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).
&gt
&gtZauważ, ż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.
&gt

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

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