Текущий архив: 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.47 MB
Время: 0.007 c