Общие вопросы по языку Си.

High-level languages programming questions
  • Code: Select all

    unsigned int img_len = (IMG_HEIGHT*IMG_WIDTH*3);
    unsigned int *p_img = NULL;
    Размер int 32 бита. Тебе надо использовать char.
    Я бы рекомендовал не мучиться с невыравненным доступом и использовать 32-х битный цвет и функцию Blit() для вывода.
  • Serge wrote:

    Code: Select all

    unsigned int img_len = (IMG_HEIGHT*IMG_WIDTH*3);
    unsigned int *p_img = NULL;
    Размер int 32 бита. Тебе надо использовать char.
    Большое спасибо за помощь, заработало. :D
    Ох уж эти типы данных, как же с ними трудно. Аж мозги кипят! Bash scripting значительно проще, имхо. :roll:
    Serge wrote:Я бы рекомендовал не мучиться с невыравненным доступом и использовать 32-х битный цвет и функцию Blit() для вывода.
    Спасибо. Буду разбираться. :)
    The Glass is Always Half Full! :mrgreen:
  • Прошу помощи. :roll: Опять ничего не получается. Никак не могу понять, в чём проблема. Наверно опять, что-то напутал с типами данных, но немогу понять, что именно. Сделал вывод в окно двух буферов, функцией Blit из newlib: первый буфер (p_img) залит красным цветом, второй (p_img2) жёлтым. В буфер залитый красным цветом хотел встроить изображение из второго буфера, просидел вчера целый день, но так ничего и не получилось. Написал функцию, которая неработает, с которой очень долго мучался, но позже понял, что дело не в функции. Закоментировал функцию и попробовал поместить в первый буфер два пикселя, жёлтого цвета. Но, получились теже яйца, только в профиль выводится красный прямоугольник с жёлтой полосой по вертикали, толщиной в два пикселя, а должен быть красный прямоугольник с желтой полосой по горизонтали, длиной в два пикселя. :(

    Что не так?

    Image

    Code: Select all

    #include <stdlib.h>
    #include <kos32sys.h>
    
    #define IMG_WIDTH   70
    #define IMG_HEIGHT  50
    #define IMG2_WIDTH  30
    #define IMG2_HEIGHT 20
    
    static char *title="Window";
    static char *text ="Program written in C language!";
    
    //unsigned int img_len = (IMG_HEIGHT*IMG_WIDTH*sizeof(int));
    static unsigned int img_len = (IMG_HEIGHT*IMG_WIDTH);
    static unsigned int *p_img = NULL;
    
    static unsigned int img2_len = (IMG2_HEIGHT*IMG2_WIDTH);
    static unsigned int *p_img2 = NULL;
    
    //void image_inject(int x, int y, int src_w, int src_h, void *src_img, int dst_w, int dst_h, void *dst_img);
    
    //void image_inject(int x, int y, int src_w, int src_h, int *src_img, int dst_w, int dst_h, int *dst_img){
    
    //int dst_offset = (dst_w * y) + x;
    
    //  for (unsigned int i = 0; i < 5; i++)
    //  {
    //    dst_img[dst_offset+i] = src_img[i];
    //  }
    
    //}
    
    void create_window(){
            BeginDraw();
            DrawWindow(100,100,400,200,title,0x80ffffff,0x13);
            EndDraw();
            Blit(p_img, 10, 30, 0, 0, IMG_WIDTH, IMG_HEIGHT, IMG_WIDTH, IMG_HEIGHT, 0);
            Blit(p_img2, 10, 90, 0, 0, IMG2_WIDTH, IMG2_HEIGHT, IMG2_WIDTH, IMG2_HEIGHT, 0);
    }
    
    int main(int argc, char** argv[])
    {
    
    p_img = (unsigned int*)malloc(img_len*4);
    if (p_img==NULL) exit (1);
    p_img2 = (unsigned int*)malloc(img2_len*4);
    if (p_img2==NULL) exit (1);
    
    for (unsigned int i = 0; i < img_len; i++)
    {
      p_img[i] = 0x00ff0000;
    }
    
    for (unsigned int i = 0; i < img2_len; i++)
    {
      p_img2[i] = 0x00ffff00;
    }
    
    p_img[0] = 0x00ffff00;
    p_img[1] = 0x00ffff00;
    
    // image_inject(2, 2, IMG2_WIDTH, IMG2_HEIGHT, p_img2, IMG_WIDTH, IMG_HEIGHT, p_img);
    
        create_window();
        for (;;)
        {
        switch(get_os_event())
    	{
    	case 1:
    	    create_window();
                continue;
    	case 2:
    	    get_key();
                continue;
    	case 3:
    	    // button pressed; we have only one button, close
                if(get_os_button()==1) return 0;
                continue;
    	}
        }
    }
    The Glass is Always Half Full! :mrgreen:
  • Странно, должен получиться красный прямоугольник с двумя первыми желтыми точками (
  • Всё, разобрался. Наконец программа заработала. :D Метадом тыка, понял в чём была проблема. Надо было, в последнем параметре функции Blit, указать ширину изображения умноженную на 4. Не понимаю, почему нельзя было сделать это умножение в ядре. :roll:
    The Glass is Always Half Full! :mrgreen:
  • JohnXenox wrote:ширину изображения умноженную на 4. Не понимаю, почему нельзя было сделать это умножение в ядре. :roll:
    Наверное, потому что Stride — это не всегда SrcWidth*4(почему это так — вопрос другой). А говоришь: "Разобрался".

    Вот тут что-то про Image Stride: https://msdn.microsoft.com/en-us/librar ... s.85).aspx
  • 0CodErr wrote:Наверное, потому что Stride — это не всегда SrcWidth*4(почему это так — вопрос другой). А говоришь: "Разобрался".
    Я имел ввиду, что разобрался с проблемой. :roll:
    0CodErr wrote:Вот тут что-то про Image Stride: https://msdn.microsoft.com/en-us/librar ... s.85).aspx
    Спасибо за ссылку, почитаю. :)
    The Glass is Always Half Full! :mrgreen:
  • Появились несколько вопросов:
    1. Можно ли как-то подцепить бинарник (написанный на FASM) в KTCC (средствами KTCC)?
    2. Кто-нибудь может подсказать, как грузить LIBIMG.OBJ в KTCC? Мне нужно сделать вывод картинок (.png, .jpg, .gif), а я не знаю как. Желательно средствами KTCC.
    The Glass is Always Half Full! :mrgreen:
  • JohnXenox wrote:2. Кто-нибудь может подсказать, как грузить LIBIMG.OBJ в KTCC? Мне нужно сделать вывод картинок (.png, .jpg, .gif), а я не знаю как. Желательно средствами KTCC.
    А ты знаешь, как загрузить произвольную obj-библиотеку (ф68.19), получить таблицу экспорта и связать ее с указателями на функции?
  • Посмотри по аналогии с загрузкой console.obj в tte.
    Недавно было обсуждение и коммит этого редактора.
    Из хаоса в космос
  • akron1 wrote:А ты знаешь, как загрузить произвольную obj-библиотеку (ф68.19), получить таблицу экспорта и связать ее с указателями на функции?
    Не знаю. Задаю вопросы по мере поступления.
    The Glass is Always Half Full! :mrgreen:
  • Leency wrote:Посмотри по аналогии с загрузкой console.obj в tte.
    Недавно было обсуждение и коммит этого редактора.
    Спасибо. Посмотрю.
    The Glass is Always Half Full! :mrgreen:
  • Не всё так просто.

    В библиотеке libimg.obj есть функция lib_init, которая принимает 4 параметра в регистрах eax, ebx, ecx, edx (указатели на функции):
    eax = malloc
    ebx = free
    ecx = realloc
    edx = dll_load
    эту функцию надо вызвать до первого использования библиотеки. Причем, функция dll_load довольно сложная: она принимает указатель на таблицу импорта, загружает библиотеку, получает таблицу экспорта и заполняет таблицу импорта данными из таблицы экспорта. А также вызывает функцию инициализации библиотеки.

    В библиотеке console.obj функции lib_init нет, и поэтому подцепить библиотеку console.obj проще.
  • JohnXenox wrote:Появились несколько вопросов:
    1. Можно ли как-то подцепить бинарник (написанный на FASM) в KTCC (средствами KTCC)?
    2. Кто-нибудь может подсказать, как грузить LIBIMG.OBJ в KTCC? Мне нужно сделать вывод картинок (.png, .jpg, .gif), а я не знаю как. Желательно средствами KTCC.
    Там есть готовый загрузчик.
    Делай по образцу из \libc\stdio\conio.c

    объявления импортов аналогично в conio.h
  • Who is online

    Users browsing this forum: No registered users and 2 guests