Потому что вы сделали массив массивов бит.
потому что тип BitArray присутствует в uses System.Collections; вот и использовал.
Благодарю, Сработало!
получается моя ошибка была в круглых скобках,
в место new BitArray[8]
нужно new BitArray(8)
и убрать array of.
у меня было подозрение, но я их поставил по хелпу.
Как написать правильно чтоб массив брало, а не только переменные ?
//=========================================
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;
//=========================================
попробуй задать границы для массива, что то вроде этого:
data: array[1..100] of integer;
пробовал, даже тип создавал, и через new и как только не извращался, не могу массив использовать.
Статичный массив в PascalABC.Net это костыльная башня стоящая на динамичных массивах. Это отдельный класс, который генерируется во время компиляции, и с которым атрибуты динамичных массивов работать не будут.
Если вам нужно чтоб можно было по индексу получить значение поля - делайте индексное свойство.
А атрибут MarshalAs
это для вызова функций из неуправляемого кода, и он часто не работает для полей. Зато для параметров методов он работает почти всегда.
а выделить место для массива в структуре не пробовали? А то там смещение 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.
ничего не знаю вопрос был как впихнуть массив в данную конкретную структуру… И как теперь с этим жить пусть думает автор вопроса
Конечно, потому что вы убрали самую важную часто которую хотел ТС. Для data
проигнорировался MarshalAs
, как я и сказал. Поэтому оно заняло 32/64 бита (в зависимости от битности системы), в виде ссылки, а не своего содержимого. И x
с y
в итоге не перекрывают первые 2 элемента этого массива.
Это так же будет работать если заменить массив на динамический и убрать MarshalAs
.
Задача заключается в том чтобы реализовать наложение переменных на массив по смещению.
Тут же переменные можно накладывать, а массив нет.
//=========================================
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());
//=========================================
да я это уже понял, я просто пропустил пару постов в начале обсуждения и не сразу въехал в суть задачи.
К сожалению в PascalABC.Net мне это сделать не удалось. Все попытки заканчиваются тем что компилятор либо не дает это сделать либо крашится
А вот отсюда по подробнее. Крашится не должен, всегда должен давать понятную ошибку. Приведите примеры кода где крашится.
а какова глобальная цель? оптимизация памяти и ресурсов? Или просто нужно чтобы при изменении переменной менялись данные в массиве и наоборот?
если первый вариант, то будем ждать что подскажут мастера паскаля.нет. Если второй то это легко решается с помощью свойств класса.
были бы прямые ручки, а закрашить можно что угодно
А давайте всё же пример. Потому что “всё плохо” проблему не исправит, а по конкретной ситуации можно сделать баг репорт.
я не говорил что “все плохо” Я уже не помню что конкретно делал. Вечером попробую повторить и скину краш-тест.
по идее мне нужно работать с битовыми полями, по удобству мне нравится UNION объединение в С++ но он отсутствует в С#. А, эта тема просто зацепила, потому как в стандартах управляемого кода она присутствует, а тут нет… Было бы шикарно если бы UNION был организован в PascalABC, да еще бы с возможностью смещать поля в UNION. Быстрая и удобная штука для экспериментов этот PascalABC.NET код которого легко можно перекинуть на С# и C+/CLR, и обратно…))
Ну, вам ничего не мешает написать кусок кода на C++ и подключить его через external
. И вот так уже тестировать.
Вангую: в PascalABС.NЕТ никаких UNION’ов не появится. Это пережиток конца 80-х годов, когда о гигабайте оперативной памяти даже мечтать не могли. Зачем нужна в строго типизированном языке возможность одну и ту же область памяти рассматривать в различных ипостасях? Это просто грязный трюк, чуждый .NET-идеологии.
ух ты какой дерзкий, прям уж так пережиток прошлого… Альтернативу покажи ? а языком я тоже могу болтать про будущее бесконечно…))