Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TypeCast: Set Of TEnum~ -> Cardinal [D7, XP]


Сергей ©   (2015-07-29 10:21:00) 

Уточнял тут, но почему-то внезапно закрыли: http://www.delphimaster.ru/cgi-bin/forum.pl?n=18&id=1396021466&p=3

> [57] А зачем ты в чужой ветке создаешь свои посты ? Создай свою ветку.

Да потому что вопрос можно сказать идентичен. Ну ок, как скажете, создаю свою ветку, точно такую же. Давайте плодить одинаковые темы. =/

В чужих классах есть read-only property, которые возвращают Set Of TEnum***.
Есть функция экспортированная из чужой DLL, принимающая одним из входящих Cardinal. Требуется передавать туда эти property.
У одного класса SizeOf(property)=4. И прекрасно работает приведение типа через Integer(AnObject.property).
У другого класса SizeOf(property)=1. У третьего SizeOf(property)=2. И тогда выдаёт "[Error] Invalid typecast".

Как мне сделать typecast?

> [53] Что-то не смог нагуглить термин "стриминг сета/множества"... Что вы имели ввиду?


кгшзх   (2015-07-29 15:39:00) [1]

а так как множество растет снизу вверх, то можно тупо нацелить PCardinal на адрес сета.

на примере множества длиной 8

type
TMyEnum = (me0,me1,me2,me3,me4,me5,me6,me7);
PMySet  = ^TMySet;
TMySet = set of TMyEnum;

procedure TForm1.Button1Click(Sender: TObject);
var ms : TMySet; pms : PMySet; me : TMyEnum; pb : PByte; b : byte;
begin
for me := Low(TMyEnum) to High(TMyEnum) do
 Include(ms,me);
//исключаем одного
Exclude(ms,me5);

pb := @ms;
ShowMessage(IntToStr(pb^));

//Копируем
b := pb^;
//Приводим
pms := @b;

//Проверяем
if not (me5 in pms^) then
 ShowMessage('ку ку!');
end;


Игорь Шевченко   (2015-07-29 15:24:00) [2]


> Надо приводить то что есть к Cardinal или к Integer.


http://stackoverflow.com/questions/9553510/how-to-save-load-set-of-types


кгшзх   (2015-07-29 14:55:00) [3]

ох... 32 байта - это максимальная вместимость сета.

не пойму, ты наркоман штоли?
твой сет с последним членом 31 имеет мощность 32
твой енум, если вывести всем его элементам ord(),  покажет 0..32
в сете (в любом) эти элементы будут отображаться на непрерывный кусок битов, и битов этих будет ровно 32.
и все эти биты влезают в кардинал.

что тебе и надо проделать.


sniknik   (2015-07-29 14:32:00) [4]

> И компилятор отказывается кастовать 1 байт сета в 4 байта Cardinal.
не преобразованием единым... главное самому не влезть в "не свои" байты, там продолжение переменных/код/что угодно

procedure TForm1.Button1Click(Sender: TObject);
var
 a: TAnchors;
 i: Cardinal absolute a;
begin
 a:= Form1.Anchors;

 Memo1.Text:= IntToStr(SizeOf(a)) + ' ' + IntToStr(SizeOf(i)) + ' - ' + IntToStr(i);
end;


Сергей   (2015-07-29 13:53:00) [5]

ох... 32 байта - это максимальнаявместимость сета. Взятый для примера "TForm.Anchors" лежит в одномбайте. И компилятор отказывается кастовать 1 байт сета в 4 байта Cardinal.
При том что 4 байта сет (например "TOpenDialog.Options") спокойно кастуются и в Cardinal и в Integer.


кгшзх   (2015-07-29 12:54:00) [6]

биты которые раньше лежали в сете (в 32 байтах) - перетащить в кардинал (32 бита)


Сергей   (2015-07-29 12:48:00) [7]

Конечно чужой. Просто как пример возьмём - "TForm.Anchors". Его SizeOf() равен 1. Я могу влезть в описание типа TAnchors и добавить "z_last=31"? Вообще теоретически-то могу, но это будет очень неправильно.
Примерно такая же ситуация у меня. Поменять описание множества я не могу. Менять заголовок функции в DLL тоже. Надо приводить то что есть к Cardinal или к Integer.
Хочется обойтись без костылей, и как-то красиво учинить TypeCast, без доп.функций, доп.переменных, Case'ов и прочего.

> Rouse_ ©   (25.07.15 17:57) [51]
> Как вариант, можно делать стриминг сета и передавать его, тогда обойдещь проблему с размерностью


Не понял термина, нагуглить по этим словам не смог. Поясните пожалуйста, что вы имели ввиду?


Игорь Шевченко   (2015-07-29 10:26:00) [8]

Что-то у тебя все чужое...А Enum-то большой чужой ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо