Помогите новичку

Applications development, KoOS API questions
  • Rock_maniak_forever

    Рисование при помощи ф.1 самый тормозной способ.
    Для вывода картинок есть функции 7 и 65. ф.65 предпочтительнее потому что работает с 32 bpp. Если тебе надо рисовать попиксельно делай это в ОЗУ а потом сбрасывай на экран.
  • Вопрос по 3 функции: как преобразовывать возвращаемое число в нормальный форма времени (ЧЧ : ММ : СС) Может где в примерах есть?
  • kogemyaka
    посмотри предыдущую страницу этой темы
  • Есть ли способ вывести часть текста (см. рис.) ? Может есть какие режимы наподобие xor (для виндовс константа R2_XORPEN в BitBlt) ? Может какой буфер временный делать в памяти, но тогда в него системной функцией не влезешь ... Просто не хочется откидывать целую строку текста в случае, когда надо вывести часть букв ...
    Attachments
    draw_text.png
    draw_text.png (8.8 KiB)
    Viewed 5562 times
  • Ну можно вывести текст, а потом зарисовать ненужную часть.
  • Понял, значит функция 36.
  • IgorA
    Как вариант можно самому глифы накладывать и выводить 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).
    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
    
    Во-вторых в compile.bat строку

    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
    
    start.o является заглушкой и он должен подаваться линковщику первым, чтобы после работы objcopy у тебя получился правильный исполняемый файл Колибри.

    Также совет, когда получаешь ошибку линковщика типа 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
    3. Скопируем к нам в папку файл exit.o из libck.a и соберём исполняемый файл

    Code: Select all

    ld -nostdlib -T kolibri.ld -o my.kex start.o main.o exit.o
    objcopy my.kex -O binary
    
    [/color]
  • Asper
    спасибо за ответ. попробую скомпилировать с ключём -fno-builtin -fno-common -fomit-frame-pointer...
  • Пожалуйста, срочно помогите отловить клавишу ALT, очень надо. Делаю макрос полноценного MENUBAR'а, в нём должна клавиша ALT подсвечивать первую кнопку с надписью на экране. Пробовал код приведённый ниже, но в нём реакция на клавишу ALT происходит только после того, как я нажму какую ни-будь клавишу, а мне надо чтобы сразу. Причём чтобы была реакция при нажатии на любую клавишу ALT, как на правую, так и на левую. Скажите что не так, или если не трудно напишите пример.

    Заранее спасибо. :D

    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..
  • Who is online

    Users browsing this forum: No registered users and 0 guests