Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.07.2014, 11:55   #1
beringoff
Пользователь
 
Регистрация: 17.04.2014
Сообщений: 16
Вопрос Запись с вариантом

Не могу врубиться, ужо скока лет.

Вот это понятно:
Код:
type 
  Zap= record
    case I: integer of
      0: A:integer;
      1: A:real;
    end;
А вот это ни фига:
Код:
type 
  Zap= record
    case integer of
      0: A:integer;
      1: A:real;
    end;
как определить значение селектора, что тут вообще является селектором?
если имеем, например, переменные:
I:integer;
R:real;
то как определить, когда будет правильно:
I:=Zap.A;
а когда:
R:=Zap.A;

Последний раз редактировалось Stilet; 03.07.2014 в 17:40.
beringoff вне форума Ответить с цитированием
Старый 03.07.2014, 12:37   #2
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,894
По умолчанию

Цитата:
как определить значение селектора, что тут вообще является селектором?
1. Во втором варианте селектора просто нет.
2. В записи не может быть двух полей с одинаковым именем.
northener вне форума Ответить с цитированием
Старый 03.07.2014, 12:46   #3
beringoff
Пользователь
 
Регистрация: 17.04.2014
Сообщений: 16
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
1. Во втором варианте селектора просто нет.
В чем тогда смысл?
beringoff вне форума Ответить с цитированием
Старый 03.07.2014, 12:55   #4
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,894
По умолчанию

Цитата:
Сообщение от beringoff Посмотреть сообщение
В чем тогда смысл?
Смысл чего? Вариантной записи?
Или строки
Код:
case integer of
?
Если второе, то это просто формальность. Надо было хоть как-то дать компилятору понять что запись вариантная. Если первое, то это в двух словах не скажешь.
northener вне форума Ответить с цитированием
Старый 03.07.2014, 13:02   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,528
По умолчанию

Цитата:
то как определить, когда будет правильно:
если программист не предусмотрел поля для фиксации типа содержимого (case I:integer), то никак.

Код:
type
RZap= record
case integer of
0: (A: integer;);
1: (A: real;);
end;
 [Error] Unit1.pas(32): Identifier redeclared: 'A'

RZap= record
case integer of
0: (A: integer;);
1: (B: real;);
end;

X:=R.A;
Y:=R.B;
Как обратишься так и получишь, а уж что там будет ведает только программист(и программа) который заполняет.
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 03.07.2014, 13:42   #6
beringoff
Пользователь
 
Регистрация: 17.04.2014
Сообщений: 16
По умолчанию

Сенька, так я и думал.
Фича бесполезная, заморачиваться не буду.
beringoff вне форума Ответить с цитированием
Старый 03.07.2014, 13:59   #7
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,894
По умолчанию

Цитата:
Сообщение от beringoff Посмотреть сообщение
Фича бесполезная, заморачиваться не буду.
Программирование вообще вещь бесполезная. От него ничего хорошего не получишь окромя геморроя.
northener вне форума Ответить с цитированием
Старый 03.07.2014, 15:02   #8
beringoff
Пользователь
 
Регистрация: 17.04.2014
Сообщений: 16
По умолчанию

Кроме геморроя оно еще и денюшку иногда приносит, а также удовольствие от красивого кода.

Просто встретил в книжке вот такое:

Код:
   in_addr = record
    case Integer of
    0: (S_un_b: SunB);
    1: (S_un_w: SunW);
    2: (S_addr: u_long);
   end;
   TInAddr = in_addr;
 
   sockaddr_in = record
    case Integer of
    0: (
     sin_family: u_short;
     sin_port: u_short;
     sin_addr: TInAddr;
     sin_zero: array[0..7] of Char);
    1: (
     sa_family: u_short;
     sa_data: array[0..13] of Char);
   end;
   TSockAddrIn = sockaddr_in;
   TSockAddr = sockaddr_in;
Таким образом, типы TSockAddr и TSockAddrIn — это синонимы типа sockaddr_in (но не того sockaddr_in, который имеется в стандартной библиотеке сокетов, а типа sockaddr_in, описанного в модуле WinSock). А тип sockaddr_in из WinSock является вариантной записью, и в случае 0 соответствует типу sockaddr_in из стандартной библиотеки сокетов, а в случае 1 — sockaddr из этой же библиотеки.
Захотелось разобраться до конца. Откуда же эти и в случае 0 соответствует типу sockaddr_in из стандартной библиотеки сокетов, а в случае 1 — sockaddr из этой же библиотеки. берутся.

Последний раз редактировалось Stilet; 03.07.2014 в 17:41.
beringoff вне форума Ответить с цитированием
Старый 03.07.2014, 15:21   #9
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,894
По умолчанию

Цитата:
Сообщение от beringoff Посмотреть сообщение
Просто встретил в книжке вот такое:
Захотелось разобраться до конца. Откуда же эти берутся.
Ниоткуда. Просто такая форма указания вариантов наглядна для программиста. А все варианты существуют всегда и одновременно. И только программист определяет каким из вариантов воспользоваться в каждом конкретном случае.
northener вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Тип запись. Объявление типа запись. Маленыч Паскаль, Turbo Pascal, PascalABC.NET 1 11.05.2012 20:42
запись любого целого числа n (n<3999) арабскими цифрами перевести в запись римскими цифрами (на языке C) qazse Помощь студентам 1 24.11.2011 12:05
Используя процедуры общего назначения, составить программы для решения задач с заданным вариантом условия Васильева Зинаида Помощь студентам 1 19.11.2010 02:39
Запись в БД Vitaliy3009 БД в Delphi 6 09.10.2009 14:43
запись CD chekanoff Общие вопросы Delphi 2 10.04.2008 00:04