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


Гость






Ну, раз за границами следишь - вот тебе еще информация к размышлению:

with System; use System;
with System.Storage_Elements;
with System.Address_To_Access_Conversions;
with Interfaces; use Interfaces;

with Ada.Text_IO;

procedure Main is

type my_rec is record
R, G, B : Interfaces.Unsigned_8;
end record;
my_arr : array(1 .. 10) of aliased my_rec := (others => (others => 0));

package RecPtr is new System.Address_To_Access_Conversions (My_Rec);
PArr : RecPtr.Object_Pointer;

subtype Offset is System.Storage_Elements.Storage_Offset;
function "+" (A : System.Address; I : Offset ) return Address
renames System.Storage_Elements."+";

begin
for i in my_arr'Range loop
Ada.Text_IO.Put_Line(
Unsigned_8'Image(my_arr(i).R) & " " &
Unsigned_8'Image(my_arr(i).G) & " " &
Unsigned_8'Image(my_arr(i).B) & " "
);
end loop;

PArr := my_arr(1)'Unchecked_Access;
for i in my_arr'Range loop
parr.all.R := parr.all.R + 10;
parr := RecPtr.To_Pointer(RecPtr.To_Address(PArr) + 3); -- Обе эти функции - Intrinsic
end loop;

for i in my_arr'Range loop
Ada.Text_IO.Put_Line(
Unsigned_8'Image(my_arr(i).R) & " " &
Unsigned_8'Image(my_arr(i).G) & " " &
Unsigned_8'Image(my_arr(i).B) & " "
);
end loop;
end Main;
После запуска, как и ожидалось:

 0  0  0 
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
10 0 0
10 0 0
10 0 0
10 0 0
10 0 0
10 0 0
10 0 0
10 0 0
10 0 0
10 0 0

, но с такими вещами надо обращаться очень аккуратно...
 К началу страницы 
+ Ответить 

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


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

 





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