Помогите новичку
-
Вчера сделал (для своей макро-библиотеки) вывод 24-ёх и 32-ух битной картинки при помощи 1-ой функции размером 10х10 (зарисовка была не видна), потом попробовал картинку 200х200 и окозалось что картинка (в реальной системе) выводится очень медленно, заметна зарисовка, а в эмуляторе KolInWin вообще тормоза(на полную зарисовку уходит примерно 4 секунды). Собственно поэтому, я решил сделать прямой вывод графики, при помощи 61 функции. Кто нибудь может объяснить, как вывести пиксель при помощи неё. Я непонял как манипулировать селектором gs. Если не трудно дайте примерчик.
Rock_maniak_forever
Рисование при помощи ф.1 самый тормозной способ.
Для вывода картинок есть функции 7 и 65. ф.65 предпочтительнее потому что работает с 32 bpp. Если тебе надо рисовать попиксельно делай это в ОЗУ а потом сбрасывай на экран.
Рисование при помощи ф.1 самый тормозной способ.
Для вывода картинок есть функции 7 и 65. ф.65 предпочтительнее потому что работает с 32 bpp. Если тебе надо рисовать попиксельно делай это в ОЗУ а потом сбрасывай на экран.
Вопрос по 3 функции: как преобразовывать возвращаемое число в нормальный форма времени (ЧЧ : ММ : СС) Может где в примерах есть?
kogemyaka
посмотри предыдущую страницу этой темы
посмотри предыдущую страницу этой темы
Есть ли способ вывести часть текста (см. рис.) ? Может есть какие режимы наподобие xor (для виндовс константа R2_XORPEN в BitBlt) ? Может какой буфер временный делать в памяти, но тогда в него системной функцией не влезешь ... Просто не хочется откидывать целую строку текста в случае, когда надо вывести часть букв ...
- Attachments
-
-
draw_text.png (8.8 KiB)Viewed 5562 times
-
Ну можно вывести текст, а потом зарисовать ненужную часть.
Понял, значит функция 36.
IgorA
Как вариант можно самому глифы накладывать и выводить 65 функцией, только муторно это.
Как вариант можно самому глифы накладывать и выводить 65 функцией, только муторно это.
Я не совсем новичёк, но всё же нуждаюсь в помощи. Пытаюсь использовать Libck, но ничего не получается.
ld выдаёт ошибку:
main.o(.text+0x7):main.c: undefined reference to `_ksys_exit@0'
GNU ld version 2.13.90 20030111
gcc (GCC) 3.2.3 (mingw special 20030504-1)
Я подозреваю, что это из-за разных форматов объектных файлов (ELF и COFF).
ld выдаёт ошибку:
main.o(.text+0x7):main.c: undefined reference to `_ksys_exit@0'
GNU ld version 2.13.90 20030111
gcc (GCC) 3.2.3 (mingw special 20030504-1)
Я подозреваю, что это из-за разных форматов объектных файлов (ELF и COFF).
- Attachments
-
-
my.zip (19.07 KiB)Downloaded 194 times
-
В твой библиотеке libck.a сборная из эльфов и коффов. Советую пересобрать библиотеку так, чтобы там были только файлы формата MS COFF.
Чтобы посмотреть формат файлов в libck.a разархивируй её например при помощи 7Zip'а в какую-нибудь папку.
kfar'ом например можешь посмотреть содержимое *.o файлов. Эльфы начинаются сигнатурой ELF , а коффы начинаются с буквы L.
Выкинь всех эльфов и перекомпилируй соответствующие *.c файлы.
Компилируй *.c файлы следующей строкой
Code: Select all
gcc -c my_file.c -o my_file.o -O2 -nostdinc -fno-builtin -fno-common -fomit-frame-pointer
Code: Select all
ld -nostdlib -T kolibri.ld -o my.kex -L C:\Temp\kollibc-mingw-src\my\ -l ck start.o main.o
Code: Select all
ld -nostdlib -T kolibri.ld -o my.kex start.o main.o -L C:\Temp\kollibc-mingw-src\my\ -l ck
Также совет, когда получаешь ошибку линковщика типа undefined reference to some_function и при этом ты уверен, что реализация some_function у тебя есть в одном из линкуемых файлов посмотри тем же kfar'ом объектные файлы где some_function реализуется и где вызывается, поищи строку some_function в обоих файлах название функции должно полностью совпадать. Возможно такое, что в одном файле будет например _some_function, а в другом _some_function@4 или в одном файле _some_function а в другом __some_function, эта ситуация возникает, потому что различные компиляторы могут подставлять различное количество подчеркиваний и указывать или нет объем передаваемых функции аргументов. Соответственно если имена различаются в объектных файлах, то линковщик и выдаёт ошибку undefined reference to some_function.
Вот и у тебя вызывается функция _ksys_exit();, которая в main.o превращается в __ksys_exit@0 , а в libck.a у тебя есть _ksys_exit и _ksys_exit@0. Если распаковать libck.a, то в exit.o находится _ksys_exit.
Теперь небольшой эксперимент
1. Изменим имя функции _ksys_exit(); на ksys_exit(); в файлах main.c и kolibrisys.h.
2. Скомпилируем main.c нашей "волшебной строкой"
Code: Select all
gcc -c main.c -o main.o -O2 -nostdinc -fno-builtin -fno-common -fomit-frame-pointer
Code: Select all
ld -nostdlib -T kolibri.ld -o my.kex start.o main.o exit.o
objcopy my.kex -O binary
Asper
спасибо за ответ. попробую скомпилировать с ключём -fno-builtin -fno-common -fomit-frame-pointer...
спасибо за ответ. попробую скомпилировать с ключём -fno-builtin -fno-common -fomit-frame-pointer...
Пожалуйста, срочно помогите отловить клавишу ALT, очень надо. Делаю макрос полноценного MENUBAR'а, в нём должна клавиша ALT подсвечивать первую кнопку с надписью на экране. Пробовал код приведённый ниже, но в нём реакция на клавишу ALT происходит только после того, как я нажму какую ни-будь клавишу, а мне надо чтобы сразу. Причём чтобы была реакция при нажатии на любую клавишу ALT, как на правую, так и на левую. Скажите что не так, или если не трудно напишите пример.
Заранее спасибо.
Если надо, исходник прикреплён.
Заранее спасибо.
Code: Select all
key:
; Логика кода:
; ------------
; 1. Отловить нажатие клавиш ALT, левой или правой.
; 2. Если была нажата любая из этих клавиш, зарисовать прямоугольник, иначе ничего не рисовать.
mov eax,66d ; ФУНКЦИЯ 66: установить режим ввода с клавиатуры..
mov ebx,1d ; в регистр ebx помещаем номер подфункции.
mov ecx,1d ; включаем режим сканкода.
int 0x40 ; вызываем системное прерывание.
mov al,2d ; считываем код нажатой клавиши. Возвращен в ah.
int 0x40 ; Клавиша должна быть прочитана для очистки системной очереди.
cmp ah,0x38 ; сравниваем значение в регистре со скан кодом клавиши ALT.
jne @f ; если не равно, то пропускаем зарисовку прямоугольника.
pushad ; сохраняем все регистры.
mov eax,13d ; ФУНКЦИЯ 13: зарисовать прямоугольник.
mov ebx,100d ; помещаем в регистр ebx координату по оси x.
shl ebx,16d ; умножаем на 65536.
add ebx,60d ; прибовляем размер по оси x.
mov ecx,80d ; помещаем в регистр ebx координату по оси y.
shl ecx,16d ; умножаем на 65536.
add ecx,40d ; прибовляем размер по оси y.
mov edx,0x00ff0000 ; помещаем в регистр edx цвет прямоугольника (красный цвет).
int 0x40 ; вызываем системное прерывание.
popad ; восстанавливаем все регистры.
@@:
cmp ah,KEY_ESCAPE
je close_program
jmp event_wait ; возврат к event_wait
Last edited by Rock_maniak_forever on Fri Feb 12, 2010 4:00 am, edited 1 time in total.
Ну дык переводить в режим сканкодов нужно один раз в начале программы или, во всяком случае, до момента отлавливания клавиш. Потому как действия при нажатии на клавишу зависят от режима, в котором в данный момент находится приложение, а не от режима, который установят когда-то в будущем.
Ушёл к умным, знающим и культурным людям.
Спасибо, попробую.diamond wrote:Ну дык переводить в режим сканкодов нужно один раз в начале программы или, во всяком случае, до момента отлавливания клавиш. Потому как действия при нажатии на клавишу зависят от режима, в котором в данный момент находится приложение, а не от режима, который установят когда-то в будущем.
Очень нубский вопрос, пожалуй.
Подскажите, пожалуйста Как мне ввести число, используя консоль?
То есть я в принципе знаю, что нужно ввести строку (или же используя con_getch считывать символы).И даже могу отрубить ненужное - то есть оставить строку, состоящую только из цифр.
Как перевести всё это дело в число?
Интересно и для целых чисел, и особенно для float-point..
Подскажите, пожалуйста Как мне ввести число, используя консоль?
То есть я в принципе знаю, что нужно ввести строку (или же используя con_getch считывать символы).И даже могу отрубить ненужное - то есть оставить строку, состоящую только из цифр.
Как перевести всё это дело в число?
Интересно и для целых чисел, и особенно для float-point..
Who is online
Users browsing this forum: No registered users and 0 guests