Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2017.04.02;
Скачать: CL | DM;

Вниз

TypeCast: Set Of TEnum~ -> Cardinal   Найти похожие ветки 

 
Сергей   (2015-07-29 10:21) [0]

Уточнял тут, но почему-то внезапно закрыли: http://delphimaster.net/view/2-1396021466/

> [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 10:26) [1]

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


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

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

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


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


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

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


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

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


 
sniknik ©   (2015-07-29 14:32) [5]

> И компилятор отказывается кастовать 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 14:55) [6]

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

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

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


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


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


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


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

а так как множество растет снизу вверх, то можно тупо нацелить 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;



Страницы: 1 вся ветка

Текущий архив: 2017.04.02;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.005 c
2-1438148217
Alex_C
2015-07-29 08:36
2017.04.02
Как правильно "убить" зависший Thread


15-1459891805
Юрий
2016-04-06 00:30
2017.04.02
С днем рождения ! 6 апреля 2016 среда


2-1438182677
Pavelnk
2015-07-29 18:11
2017.04.02
Нажать Enter


3-1313067737
amamed_3071
2011-08-11 17:02
2017.04.02
Upgate SQL 2005 Expression to SQL 2005 Enterprice


2-1438154511
Сергей
2015-07-29 10:21
2017.04.02
TypeCast: Set Of TEnum~ -> Cardinal