Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.08.29;
Скачать: CL | DM;

Вниз

Неизвествая конструкция, помогите понять   Найти похожие ветки 

 
Сатир   (2002-08-02 14:52) [0]

XA_EnvironmentInfo = record
name: PChar;
case Integer of
0: (integer_value: LongInt);
1: (string_value: PChar);
end;
что в данном примере обозначает case Integer of?


 
Виктор Щербаков ©   (2002-08-02 14:54) [1]

начало вариантной части записи.
См в хэлпе: variant parts in records,


 
MBo ©   (2002-08-02 14:57) [2]

это вариантная запись. см. Variant parts in records

только записывается, если не ошибаюсь
XA_EnvironmentInfo = record
name: PChar;
case AnotherField:Integer of
0: (integer_value: LongInt);
1: (string_value: PChar);
end;
есть и другие варианты синтаксиса


 
PVOzesrski   (2002-08-02 15:18) [3]

2 MBo © (02.08.02 14:57):
>case AnotherField:Integer of
Такой вариант конструкции более "классический", но он подразумевает, что запись имеет поле AnotherField, работающее переключателем. Стандартный (не-Борландовский) Паскаль должен контролировать при обращении к вариантным полям значение этого переключателя и генерить ошибку при его несоответствии. У Borland такого контроля нет, более того, возможны (и широко используются) фиктивные переключатели (подобно тому как в начальном вопросе ветки), под которые не резервируется память. Ближайший аналог такой конструкции в Си - union.


 
PVOzerski ©   (2002-08-02 15:20) [4]

Сорри, подписался с ошибкой, так я - это всё-таки я...


 
Сатир   (2002-08-02 15:39) [5]

2PVOzerski © (02.08.02 15:20)
объясните тогда, если не сложно, как производится доступ к данному полю? если можно, с примером

2MBo © (02.08.02 14:57)
>только записывается, если не ошибаюсь...
данный код взят с одного работающего исходника



 
Виктор Щербаков ©   (2002-08-02 15:42) [6]


> данный код взят с одного работающего исходника

Хэлп всё же надо было посмотреть. Возможны оба варианта записи Ваш и MBo ©.

А доступ к вариантным полям производится также как и к обычным (по синтаксису).


 
MBo ©   (2002-08-02 15:51) [7]

>Сатир
можно и так и так, PVOzerski прав.

var x:XA_EnvironmentInfo;

можно
x.integer_value:=3;
и
x.stringvalue:="qq";


 
PVOzerski ©   (2002-08-02 16:07) [8]

>объясните тогда, если не сложно, как производится доступ к
>данному полю? если можно, с примером

Синтаксис использования тот же самый, надо только понимать, что вариантные поля перекрываются в памяти.
Вот пример, как подобная конструкция может быть использована для определения значений каждого из 2 байтов переменной типа word.

{$apptype console}
var
r:packed record
case integer of
0:(w:word);
1:(b:array[0..1]of byte);
end;
begin
readln(r.w);
writeln(r.b[0]," ",r.b[1]);
end.

Как видите, декларированные для фиктивного переключателя состояния 0 и 1 никак не используются (да это и невозможно).

Идеологически приведенный record по внутренней реализации аналогичен другой Борланд-паскальной конструкции:

var
w:word;
b:array[0..1]of byte absolute w;

И еще один момент. После вариантной части record"а он должен заканчиваться, дальше полей быть не может.


 
Anatoly Podgoretsky ©   (2002-08-02 16:18) [9]

По имени вариантной части


 
Сатир   (2002-08-02 17:19) [10]

2Anatoly Podgoretsky ©
имя вариантной части - это integer_value и string_value в примере?

2PVOzerski © (02.08.02 16:07)
>b:array[0..1]of byte absolute w;
кстати, замечено, что в некоторых исходниках, в частности в библиотеке DelphiX при компиляции в 6-м контсрукция типа
переменная:тип absolute 0;
является ошибочной, с чего бы это?

>r:packed record
а здесь случайно не r=packed record?

сколько типов можно упаковать в case? то есть, можно ли продолжить
2:(имя_переменной_2:тип_2)
3:(имя_переменной_2:тип_3)
....
n:(имя_переменной_n:тип_n)

можно ли в case вместо Integer использовать другой тип, напр., String?



 
PVOzerski ©   (2002-08-02 19:45) [11]

>кстати, замечено, что в некоторых исходниках, в частности в библиотеке DelphiX при
>компиляции в 6-м контсрукция типа
>переменная:тип absolute 0;
>является ошибочной, с чего бы это?
Вообще-то это говорит о несовместимости версий Delphi. Но резон тому есть.
В приложениях для Win32 абсолютная адресация (по физическим адресам) не
предусмотрена. Однако переменная absolute адрес и
переменная absolute другая переменная - вещи разные.

>>r:packed record
> а здесь случайно не r=packed record?
Было бы в разделе описаний типов - был бы знак равенства. А у меня-то
в разделе описаний переменных.

>сколько типов можно упаковать в case? то есть, можно ли продолжить
Можно.

>можно ли в case вместо Integer использовать другой тип, напр., String?
Пользуйтесь перечислимыми типами. Хотя это и формальность, компилятор
это проверяет.


 
Anatoly Podgoretsky ©   (2002-08-02 20:06) [12]

Или w, b в другом примере, разрешается на этапе компиляции


 
Сатир   (2002-08-04 17:45) [13]

PVOzerski ©
Anatoly Podgoretsky ©
MBo ©
спасибо-спасибо



Страницы: 1 вся ветка

Текущий архив: 2002.08.29;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.013 c
3-95636
exciter_
2002-08-07 15:34
2002.08.29
IB6. Доступ к таблице в другой GDB.


1-95786
AL2002
2002-08-19 20:06
2002.08.29
Вариантов много. Функции две


1-95892
Cr@sh
2002-08-18 17:12
2002.08.29
Как сделать фон текста в Image`e прозрачным?


1-95753
кондратий
2002-08-19 10:47
2002.08.29
DLL / Units


3-95632
j_onion
2002-08-06 04:09
2002.08.29
Перенос BDE