IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Арифметика указателей, АДА
сообщение
Сообщение #1


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Я не понял, как именно надо использовать пакет System.Storage_Elements
Итак, задача такая, у меня есть тип

type TColor is new Interfaces.Unsigned_32;
type AColor is access all TColor;

type TBitmap is new Controlled with record
Handle : HBITMAP;
DC : HDC;
Mem : aliased AColor; -- или удобнее aliased PVOID?
SizeX, SizeY, Depth : integer;
end record;


У него есть метод:

function Get_Pixel(B: TBitmap; X, Y: integer) return AColor;
-- возвращает указатель на пиксел с данными координатами
pragma Inline(Get_Pixel);

function Get_Pixel(B: TBitmap; X, Y: integer) return AColor is
begin
Assert((X >= 0) and (X < B.SizeX) and (Y >= 0) and (Y < B.SizeY));
return B.Mem + X + Y * B.SizeX;
end;



Последняя функция не компилируется. Что надо сделать, чтобы она скомпилировалась?
Кстати, здесь мне очень важна скорость, с точностью до лишних тактов и копирований чисел туда-сюда.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Ну, тогда работай с непрерывным массивом данных (или как он называется, я о flat array). Больше ничего тебе предложить не могу. Пойми: Ада создавалась для безопасного решения задач, а ты всеми путями пытаешься сделать работу как можно более опасной. В идеале я бы запрещал даже использование того блока памяти, который был выделен CreateDIBSection, любыми НЕ WinAPI-шными функциями, негоже руками туда лазить. Мало ли. Вот работает оно, работает, "потом бац, вторая смена" (С), в смысле, MS взяла и изменила формат. Безопасно? Ни в коем случае. Зато быстро. Нужна скорость в ущерб безопасности - тебе в сторону С. Из Ады наоборот убирают адресную арифметику (в Ada 83 она была, в 95 тоже, хотя и в более урезанном виде, в 2005 ее почти нет), ибо это непереносимо, и в общем случае будет работать только у тебя на машине, на другом процессоре или на другой версии ОС работоспособность не гарантируется, могут быть другие размеры, другие выравнивания, и т.д. Ты пробовал свои программы запускать на 64-битных ОСях? На WinXP x64 Edition, например? Я уж не спрашиваю про Win7...

Если интересно, как организовать flat array - то вот так:

   Max_X : constant Integer := 1024;  -- какие-то значения, заведомо бОльшие
Max_Y : constant Integer := 1024; -- чем максимальный размер секции.
procedure Do_It (B : TBitmap) is
type Flat_Type is array(1 .. Max_X * Max_Y) of TColor;
Flat_Array : Flat_Type;
for Flat_Array'Address use B.Mem; -- Absolute, ага...
begin
-- ... А тут тебе карт-бланш, работай с массивом по индексу, как тебе угодно
-- только следи за границами, а то такого натворить можно...
end Do_It;
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 17.06.2024 5:54
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name