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

Applications development, KoOS API questions
  • art_zh wrote:и чтоб чирикала
    Не чирикает. Чирикают воробьи, да еще гопнеги чирикают "Слышь, червонец одолжи а?" (червонец - чирик)
  • art_zh wrote:и крылышками махала...
    А в Колибри разве есть понятие курсора "песочные часы"? Всё и так летает, не?
  • Freeman wrote:
    art_zh wrote:и крылышками махала...
    А в Колибри разве есть понятие курсора "песочные часы"? Всё и так летает, не?
    В Колибри есть понятие - слишком много жрущих процессорное время приложений запущено, либо одно, которое написал больной на голову программист, которое ушло в вечный цикл перерисовки своего окна. Но система естественно такое не отслеживает - сервиса такого не предусмотрено.
  • Freeman wrote:В порядке общего бреда: только мне грезится курсор в виде колибри?
    Интересная идея, мне очень понравилась. :D Только врятли у меня получится нарисовать курсор в виде Колибри, но попробовать стоит. Image
  • Кто-то выкладывал на форуме векторный логотип. Из него и можно сделать. Только придётся развернуть в другую сторону. Стремление вперёд похвально, но мышиные стрелки пока ориентируется на правшей. :)
  • Искать надо. Ну я пока фейс переделываю, а стрелку делать буду скорее всего в последнюю очередь, поэтому пока не срочно. :?
  • Freeman wrote:Кто-то выкладывал на форуме векторный логотип.
    Rock_maniak_forever wrote:Искать надо.
    Логотип (и не только) в этой теме.
  • dunkaist wrote:Логотип (и не только) в этой теме.
    Image
  • Вопросы по C и libc.
    1) Имеется функция void __menuet__putimage(__u16 x1,__u16 y1,__u16 xsize,__u16 ysize,char * image).
    Она принимает на вход изображение в формате BBGGRR, если судить по коду в libc и описанию 7й системной функции.
    У меня имеется массив int m[300][300]. Я создаю переменную char data[300*300*3], и делаю вот так:

    Code: Select all

    for (x=0;x<300;x++) {for (y=0;y<300; y++) {if (m[x][y]!=1) {data[300*y+3*x]=0xFF; data[300*y+3*x+1]=0xFF; data[300*y+3*x+2]=0xFF;}}}
    
    Как мне казалось, этот код должен был изменить атрибуты красной, синей и зеленой составляющих на FF для всех точек исходного массива, не равных 1. Но на самом деле этот код выводит кашу. Видимо, с структурой изображения нужно работать как-то по-другому. Вопрос - как?
    И еще, наверное, вместо простого задания char data[300*300*3] правильнее работать через malloc? Как это нужно делать?

    2) Если в коде программы есть fopen (да и другие операции с ФС), то она отказывается собираться:

    Code: Select all

    /home/sourcerer/projects/me/lib/libc.a(remove.o): In function `remove':
    remove.c:(.text+0x9a): undefined reference to `__stack_chk_fail'
    /home/sourcerer/projects/me/lib/libc.a(doprnt.o): In function `exponentl':
    doprnt.c:(.text+0xbb): undefined reference to `__stack_chk_fail'
    /home/sourcerer/projects/me/lib/libc.a(doprnt.o): In function `_doprnt':
    doprnt.c:(.text+0x15d7): undefined reference to `__stack_chk_fail'
    
    Это проблема моей сборки libc, или так и должно быть? Как тогда собирается doom?
  • К сожалению, ни одна libc для Колибри мне не нравится. Поэтому ими не пользуюсь и конкретно посоветовать ничего не могу. Код вроде правильный (зачем только столько скобочек? :)). Предположение - попробовать заменить тип data с char на unsigned char. И второе - поменять x и y в индексе массива data. Но без полного исходника, входных и выходных данных сказать точно не могу.
  • Albom wrote:И второе - поменять x и y в индексе массива data
    там просто нужно умножить координату Y на 3, т. е.

    Code: Select all

    300*y+3*x ---> 3*(300*y+x)
    300*y+3*x+1 ---> 3*(300*y+x)+1
    300*y+3*x+2 ---> 3*(300*y+x)+2
  • Sorcerer wrote:2) Если в коде программы есть fopen (да и другие операции с ФС), то она отказывается собираться:
    Не знаю точно что с libc, сам я ради интереса занимался велосипедостроением. Вот несколько функций для чтения/записи файлов, если нужно. Не фонтан, но работали.
    Spoiler:

    Code: Select all

    #define FS_SUCCESS              (0)
    #define FS_NO_DISK              (1)
    #define FS_INCORRECT_OPERATION  (2)
    #define FS_UNKNOWN_FS_TYPE      (3)
    #define FS_RESERVED             (4)
    #define FS_FILE_NOT_FOUND       (5)
    #define FS_EOF                  (6)
    #define FS_BUFFER_OVERFLOW      (7)
    #define FS_DISK_FULL            (8)
    #define FS_FAT_INVALID          (9)
    #define FS_ACCESS_DENIED        (10)
    #define FS_DISK_ERROR           (11)
    #define FS_OUT_OF_MEMORY        (30)
    #define FS_NOT_EXEC             (31)
    #define FS_TO_MANY_PROCESSES    (32)
    
    typedef struct __attribute__((packed)) {
        unsigned nfunc;
        unsigned posl;
        unsigned posh;
        unsigned nbytes;
        void *buf;
        char zero;
        char *name;
    } ksys_file_info_t;
    
    static void ksys_assign (ksys_file_info_t *fh, char *name) {
        fh->zero = 0;
        fh->name = name;
    }
    
    static int ksys_rewrite (ksys_file_info_t *fh) {
        fh->nfunc = 2;
        fh->posl = 0;
        fh->posh = 0;
        fh->nbytes = 0;
        fh->buf = 0;
    
        unsigned int n;
        int return_code;
    
        __asm__ __volatile__ (
            "int $0x40"
            : "=a"(return_code), "=b"(n)
            : "0"((unsigned)70), "1"((void*)fh)
        );
    
        return return_code;
    }
    
    static int ksys_write (ksys_file_info_t *fh, void *buf, unsigned int size, unsigned int *err) {
        fh->nfunc = 3;
        fh->nbytes = size;
        fh->buf = buf;
    
        unsigned int n;
    
        __asm__ __volatile__ (
            "int $0x40"
            : "=a"(*err), "=b"(n)
            : "0"((unsigned)70), "1"((void*)fh)
        );
    
        fh->posl += n;
    
        return n;
    }
    
    static void ksys_reset (ksys_file_info_t *fh) {
        fh->posl = 0;
        fh->posh = 0;
    }
    
    static int ksys_read (void *ptr, int n, ksys_file_info_t *f) {
        int return_code, count = 0;
        f->nfunc = 0;
        f->nbytes = n;
        f->buf = ptr;
        f->zero = 0;
    
        __asm__ __volatile__ (
            "int $0x40"
            : "=a"(return_code), "=b"(count)
            : "0"(70), "1"(f)
            : "memory"
        );
    
        if (return_code == 0) {
            f->posl += count;
            return count;
        } else if (return_code == 6) { /*EOF*/
            f->posl += count;
            return count;
        } else {
            return -1;
        }
    }
  • Спасибо за помощь!
    Функции чтения/записи тоже имею, но из-за природной лени хотелось "родные" Сишные команды... Не привык я работать с аттрибутами, буферами. Ну что же, если выбора нет, придется учиться.
  • Sorcerer
    Собранная версия http://ftp.kolibrios.org/users/Asper/menuetlibc/.
  • Who is online

    Users browsing this forum: Google [Bot] and 12 guests