Объединение переменных и битовые поля как в С++ UNION


#23

Потому что вы сделали массив массивов бит.


#24

потому что тип BitArray присутствует в uses System.Collections; вот и использовал.


#25
Благодарю, Сработало!
получается моя ошибка была в круглых скобках, 

 в место       new BitArray[8]      
нужно      new BitArray(8)
и убрать  array of.

у меня  было подозрение, но я их поставил по хелпу.

#26

Как написать правильно чтоб массив брало, а не только переменные ?

//=========================================

 type
[StructLayout(LayoutKind.&Explicit, Size = 8)]
VECTOR2 = record
    [FieldOffset(0)]
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
    data: array of integer; //ПОЧЕМУ МАССИВ НЕ БЕРЕТ, КАК СДЕЛАТЬ ПРАВИЛЬНО ????????
    [FieldOffset(0)]
    x:integer;
    [FieldOffset(4)]
    y:integer;
 end;

//=========================================


#27

попробуй задать границы для массива, что то вроде этого:

data: array[1..100] of integer;

#28

пробовал, даже тип создавал, и через new и как только не извращался, не могу массив использовать.


#29

Статичный массив в PascalABC.Net это костыльная башня стоящая на динамичных массивах. Это отдельный класс, который генерируется во время компиляции, и с которым атрибуты динамичных массивов работать не будут.

Если вам нужно чтоб можно было по индексу получить значение поля - делайте индексное свойство.

А атрибут MarshalAs это для вызова функций из неуправляемого кода, и он часто не работает для полей. Зато для параметров методов он работает почти всегда.


#30

а выделить место для массива в структуре не пробовали? А то там смещение 0…

вот у меня запустился твой пример:

uses System.Runtime.InteropServices;
 
type
    [StructLayout(LayoutKind.&Explicit, Size = 8)]
    VECTOR2 = record
        [FieldOffset(0)]
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
        data: array[1..100] of integer; //ПОЧЕМУ МАССИВ НЕ БЕРЕТ, КАК СДЕЛАТЬ ПРАВИЛЬНО ????????
        [FieldOffset(8)]
        x:integer;
        [FieldOffset(12)]
        y:integer;
    end;
 
begin
    var i : VECTOR2;
    for var j := 1 to 100 do i.data[j] := j;
    writeln(i.data[1]);
    writeln(i);
end.

ничего не знаю :slight_smile: вопрос был как впихнуть массив в данную конкретную структуру… И как теперь с этим жить пусть думает автор вопроса :slight_smile:


#31

Конечно, потому что вы убрали самую важную часто которую хотел ТС. Для data проигнорировался MarshalAs, как я и сказал. Поэтому оно заняло 32/64 бита (в зависимости от битности системы), в виде ссылки, а не своего содержимого. И x с y в итоге не перекрывают первые 2 элемента этого массива.

Это так же будет работать если заменить массив на динамический и убрать MarshalAs.


#32
Задача заключается в том чтобы реализовать наложение переменных на массив по смещению.
Тут же переменные можно накладывать, а массив нет.

//=========================================

    type
         [StructLayout(LayoutKind.&Explicit)]
        VECT = record
            [FieldOffset(0)]
            data: array[0..1] of integer; //ПОЧЕМУ МАССИВ НЕ БЕРЕТ, КАК СДЕЛАТЬ ПРАВИЛЬНО ????????
            [FieldOffset(0)]
            x:integer;
            [FieldOffset(0)]
            y:integer;
        end;

    //=========================================

   // использование:

        var i : VECT;
            i.x:= 12;
            i.y:= 23;
            for var j:integer := 0 to 1 do 
            begin
            richTextBox1.AppendText(#10#13 + i.data[j].ToString);
            end;
            richTextBox1.AppendText(#10#13 + 'x = ' + i.x.ToString());
        richTextBox1.AppendText(#10#13 + 'y = ' + i.y.ToString());

//=========================================

#33

да я это уже понял, я просто пропустил пару постов в начале обсуждения и не сразу въехал в суть задачи.

К сожалению в PascalABC.Net мне это сделать не удалось. Все попытки заканчиваются тем что компилятор либо не дает это сделать либо крашится :frowning:


#34

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


#35

а какова глобальная цель? оптимизация памяти и ресурсов? Или просто нужно чтобы при изменении переменной менялись данные в массиве и наоборот?

если первый вариант, то будем ждать что подскажут мастера паскаля.нет. Если второй то это легко решается с помощью свойств класса.


#36

были бы прямые ручки, а закрашить можно что угодно :slight_smile:


#37

А давайте всё же пример. Потому что “всё плохо” проблему не исправит, а по конкретной ситуации можно сделать баг репорт.


#38

я не говорил что “все плохо” :slight_smile: Я уже не помню что конкретно делал. Вечером попробую повторить и скину краш-тест.


#39

по идее мне нужно работать с битовыми полями, по удобству мне нравится UNION объединение в С++ но он отсутствует в С#. А, эта тема просто зацепила, потому как в стандартах управляемого кода она присутствует, а тут нет… Было бы шикарно если бы UNION был организован в PascalABC, да еще бы с возможностью смещать поля в UNION. Быстрая и удобная штука для экспериментов этот PascalABC.NET код которого легко можно перекинуть на С# и C+/CLR, и обратно…))


#40

Ну, вам ничего не мешает написать кусок кода на C++ и подключить его через external. И вот так уже тестировать.


#41

Вангую: в PascalABС.NЕТ никаких UNION’ов не появится. Это пережиток конца 80-х годов, когда о гигабайте оперативной памяти даже мечтать не могли. Зачем нужна в строго типизированном языке возможность одну и ту же область памяти рассматривать в различных ипостасях? Это просто грязный трюк, чуждый .NET-идеологии.


#42

ух ты какой дерзкий, прям уж так пережиток прошлого… Альтернативу покажи ? а языком я тоже могу болтать про будущее бесконечно…))