Swamp Board
система конференций сети SWAMP
 



 
 Новости  FAQ  Поиск  Закладки  Пользователи  Группы   Профиль  Войти и проверить личные сообщения  Вход 

RSS
» Добро пожаловать!
Сообщения без ответов
Корень форума > Delphi > аналог Union (из Си) или Absolute внутри Record
Предыдущая тема :: Следующая тема  
Нaчaть нoвую тeму   Отвeтить нa тeму
Распечатать тему
Buletz Moderator


avatar

Moderator
  Цитировать Профиль  Сообщение  e-mail  

Почему-то не компилится такой кусок:

type
Tvar = record
aa: array[1..4] of byte;
bb: array[1..2] of word absolute aa;
end;



Если же сделать так:
var
aa: array[1..4] of byte;
bb: array[1..2] of word absolute aa;


То компилится все ок.
Я так понимаю absolute не работает внутри структуры (record)?

По идее в Сишнике это реализуется с помощью Union. А как быть с паскалем ? *Sad*

» Добавлено: Пн Май 14, 2007 4:09 pm
Buletz Moderator


avatar

Moderator
  Цитировать Профиль  Сообщение  e-mail  

к вышесказанному:
------------------------------------------------------
var
aa: array[1..4] of byte;
bb: array[1..2] of word absolute aa;
------------------------------------------------------
означает, что bb будет храниться, начиная с того же адреса что и aa.
Т.е. фактически можно обращаться к одним и тем же данным но используя различные типы (в данном случае байт или пара байт=слово).

В сишнике то что мне нужно было бы так:
------------------------------------------------------
union tt {
unsigned char aa[4];
unsigned int bb[2];
};
------------------------------------------------------

» Добавлено: Пн Май 14, 2007 4:12 pm
Buletz Moderator


avatar

Moderator
  Цитировать Профиль  Сообщение  e-mail  

похоже я нашел ответ на свой вопрос

вот здесь:
http://forum.sources.ru/index.php?showtopic=126896&view=showall

пример:

type
some_struct_s = record
case byte of
0: (a1: record x1: integer; end);
1: (a2: record x2: double; end);
end;

var r: some_struct_s;
begin
r.a1.x1 := ...; // изменяешь содержимое a1
r.a2.x2 := ...; // изменяешь содержимое a2
...
end.

» Добавлено: Пн Май 14, 2007 4:32 pm
Buletz Moderator


avatar

Moderator
  Цитировать Профиль  Сообщение  e-mail  

для анналов истории, union для типа Float и представления его в виде байтов будет такой:

type
TFloatUnion = record
case byte of
0: (bytes: array [0..3] of byte);
1: (float: single);
end;

» Добавлено: Пт Сен 30, 2011 4:04 pm
Нaчaть нoвую тeму   Отвeтить нa тeму
Распечатать тему
Показать сообщения:   

 
Перейти:   
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы можете скачивать файлы


Powered by phpBB 0.99 beta © 2001, 2002 phpBB Group