![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
TarasBer |
![]()
Сообщение
#1
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
Я не понял, как именно надо использовать пакет System.Storage_Elements
Итак, задача такая, у меня есть тип
У него есть метод:
Последняя функция не компилируется. Что надо сделать, чтобы она скомпилировалась? Кстати, здесь мне очень важна скорость, с точностью до лишних тактов и копирований чисел туда-сюда. -------------------- |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Как память выделяется под TBitmap.Mem, можно посмотреть? По-моему, ты избрал неправильный путь...
|
TarasBer |
![]()
Сообщение
#3
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
> Как память выделяется под TBitmap.Mem, можно посмотреть?
> По-моему, ты избрал неправильный путь... Хочешь сказать, что раз у меня есть DC, то я могу использовать стандартные библиотеки? Нестандартные графические вещи мне тоже нужны. -------------------- |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
А, то есть, ты не сам выделяешь место под этот массив, а это делает сторонняя API-шная процедура? Тогда надо проверять. Или сегодня поздно вечером, или завтра (когда буду под Windows), попробую пошаманить... Я думал, ты выделяешь сам, тогда я бы описывал тип так:
type AColor_Array is array (Natural range <>) of aliased AColor;, а если выделяет CreateDIBSection - это надо смотреть, как оно описано, и что оно делает, может быть, можно и так сделать, как я выше показал, а может и нельзя, надо экспериментировать. |
-TarasBer- |
![]()
Сообщение
#5
|
Гость ![]() |
> тогда я бы описывал тип так:
А инициализировать как? Чтобы DC был связан именно с этим участком памяти. Чтобы можно было использовать как ГДИ, так и прямое обращение к пикселам. |
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
Так... До винды я так и не добрался, но фиг бы с ним. Насколько я помню, CreateDIBSection своим четвертым параметром возвращает указатель на массив пикселей (а не на массив указателей на пиксели). Тогда что-то в таком роде попробуй:
type TColor is new Interfaces.Unsigned_32; |
-TarasBer- |
![]()
Сообщение
#7
|
Гость ![]() |
> Насколько я помню, CreateDIBSection своим четвертым параметром возвращает указатель на массив пикселей (а не на массив указателей на пиксели).
Да, поэтому надо указатель на пиксел передать по указателю. Двойной указатель получается. out-параметры в функциях, ага. > function To_PTColorArray is new Ada.Unchecked_Conversion (Win32.PVOID, PTColor_Array); Это же скомпилится в перекидывание из регистра в регистр, что при оптимизации вообще изчезнет, я так понимаю? И если возвращать сам пиксел, то тогда и отдельно надо писать процедуру установки цвета, а тогда
приведёт к тому, что адрес будет считаться дважды, вместо
А брать указатели на элементы массива в Аде нельзя, я так понял. Вообще, типичный пример цикла, ради которого я всё это обсуждаю:
Оптимизация очень важна тут. На Д7, к сожалению, много обращений к вершине стека, по регистрам хреново разруливает, правда, скорость меня устраивает в режиме 800х600 на селероне 600МГЦ. Да, я знаю, что умные дяди в таких случаях используют ОткрытыйГЛ и ПрямойХ, но тёплый ламповый софтрендер всё равно выглядит по другому и узнаваемо, для меня это важно. |
volvo |
![]()
Сообщение
#8
|
Гость ![]() |
Ну, тогда работай с непрерывным массивом данных (или как он называется, я о flat array). Больше ничего тебе предложить не могу. Пойми: Ада создавалась для безопасного решения задач, а ты всеми путями пытаешься сделать работу как можно более опасной. В идеале я бы запрещал даже использование того блока памяти, который был выделен CreateDIBSection, любыми НЕ WinAPI-шными функциями, негоже руками туда лазить. Мало ли. Вот работает оно, работает, "потом бац, вторая смена" (С), в смысле, MS взяла и изменила формат. Безопасно? Ни в коем случае. Зато быстро. Нужна скорость в ущерб безопасности - тебе в сторону С. Из Ады наоборот убирают адресную арифметику (в Ada 83 она была, в 95 тоже, хотя и в более урезанном виде, в 2005 ее почти нет), ибо это непереносимо, и в общем случае будет работать только у тебя на машине, на другом процессоре или на другой версии ОС работоспособность не гарантируется, могут быть другие размеры, другие выравнивания, и т.д. Ты пробовал свои программы запускать на 64-битных ОСях? На WinXP x64 Edition, например? Я уж не спрашиваю про Win7...
Если интересно, как организовать flat array - то вот так: Max_X : constant Integer := 1024; -- какие-то значения, заведомо бОльшие |
TarasBer |
![]()
Сообщение
#9
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
> В идеале я бы запрещал даже использование того блока памяти, который был выделен CreateDIBSection, любыми НЕ WinAPI-шными функциями, негоже руками туда лазить.
Игрострой идёт лесом? А как же "язык общего назначения"? К счастью, во всех языках все подобные запреты со временем наоборот, отмирают, потому что некоторые возможности вроде как не нужны, но иногда без них просто нельзя. > Нужна скорость в ущерб безопасности - тебе в сторону С. Да, нужна. Си не нужен, там опасные вещи можно натворить совершенно случайно. Нужна осознанная возможность делать некоторые операции. Пусть даже для этого надо написать что-то типа Pragma Unsafe(GetPixel). > Ты пробовал свои программы запускать на 64-битных ОСях? На WinXP x64 Edition, например? Я уж не спрашиваю про Win7... Не, у знакомых ни у кого нету. Вот через WINE под линуксом запускаются, нормально всё. > -- только следи за границами, а то такого натворить можно... Я очень слежу, модуль для графики я отлаживал долго. Да, в нём всего пара функций, но он работает стабильно, в левые адреса не лезет. Народ мою игру тестировал, много человек, в конкурсной версии багов не нашли, хотя там велосипедом был почти весь код. -------------------- |
volvo |
![]()
Сообщение
#10
|
Гость ![]() |
Ну, раз за границами следишь - вот тебе еще информация к размышлению:
with System; use System;После запуска, как и ожидалось: 0 0 0 , но с такими вещами надо обращаться очень аккуратно... |
TarasBer |
![]()
Сообщение
#11
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
> array(1 .. 10) of aliased
Странно, почему у меня это раньше не получалось... Какая-то ошибка выдавалась, что нельзя сюда aliased писать. Насколько я понял из примера, элементы массива идут в памяти подряд, без выравнивания на 4 байта, странно. -------------------- |
volvo |
![]()
Сообщение
#12
|
Гость ![]() |
А, да. Я забыл про это упомянуть. Выравнивания - они от ОС зависят. У меня сейчас = 1 по умолчанию. Если у тебя будет больше, или сам выставишь, скажем:
type my_rec is record, то естественно, надо пересчитывать смещения по-другому: SizeR : constant Integer := Unsigned_16'Size;, теперь это будет правильно работать при любом выравнивании. |
![]() ![]() |
![]() |
Текстовая версия | 22.07.2025 2:33 |