Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2002.08.29;
Скачать: [xml.tar.bz2];

Вниз

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

 
Сатир   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.006 c
6-95937
Fenix
2002-06-20 16:48
2002.08.29
Опять проблемы с сокетами...


14-95979
pusrg
2002-08-02 14:48
2002.08.29
Использование фреймов


1-95776
SERY
2002-08-18 19:25
2002.08.29
Не могу разобраться


4-96036
Proton
2002-06-23 19:40
2002.08.29
пункт меню help был прижат к правому краю


1-95900
Shrek
2002-08-18 19:57
2002.08.29
Размер приложения 2 мегабайта в место 300 КЛб!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский