Page 1 of 3

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

Posted: Sat Jun 17, 2017 7:42 pm
by JohnXenox
Я только учусь и в связи с этим, есть несколько воросов по языку Си.

1. Не могу понять как залить буфер 3-х байтовым цветом (красным цветом).
Делаю так:

Code: Select all

#define IMG_WIDTH  70
#define IMG_HEIGHT 50

unsigned int img_len = (IMG_HEIGHT*IMG_WIDTH*3);
unsigned int *p_img = NULL;

p_img = (unsigned int*)malloc(img_len);
if (p_img==NULL) exit (1);

for (unsigned int i; i < img_len; )
{
  p_img[i++] = 0x00;
  p_img[i++] = 0x00;
  p_img[i++] = 0xff;
}
но не получается... Какая-то сетка получается. Использую функцию для вывода изображения определённую в "newlib", как "draw_bitmap" в файле "kos32sys.h".

2. Как оформить код заливки в функцию, чтобы можно было передать 3-х байтовый цвет в аргумент функции? Может сделать аргумент данных с типом данных void? Чего-то понять немогу.

3. Как сделать рабочую функцию 65 на Си.
Сделал так:

Code: Select all

static inline void draw_image(unsigned int x, unsigned int y, unsigned int w, unsigned int h, unsigned int bpp, void *img)
{
    __asm__ __volatile__(
    "int $0x40"
    ::"a"(65), "b"(img),
    "c"((w << 16) | h),
    "d"((x << 16) | y),
    "S"(bpp),
    "D"(0),
    "ebp"(0));
}
компилируется, но не работает. Как исправить, чтобы работала?

Помогите пожалуйста. :roll:

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

Posted: Sat Jun 17, 2017 9:45 pm
by Serge

Code: Select all

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

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

Posted: Sat Jun 17, 2017 11:01 pm
by JohnXenox
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() для вывода.
Спасибо. Буду разбираться. :)

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

Posted: Mon Jun 26, 2017 5:19 pm
by JohnXenox
Прошу помощи. :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;
	}
    }
}

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

Posted: Mon Jun 26, 2017 6:17 pm
by Siemargl
Странно, должен получиться красный прямоугольник с двумя первыми желтыми точками (

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

Posted: Tue Jun 27, 2017 12:21 am
by JohnXenox
Всё, разобрался. Наконец программа заработала. :D Метадом тыка, понял в чём была проблема. Надо было, в последнем параметре функции Blit, указать ширину изображения умноженную на 4. Не понимаю, почему нельзя было сделать это умножение в ядре. :roll:

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

Posted: Tue Jun 27, 2017 6:10 am
by 0CodErr
JohnXenox wrote:ширину изображения умноженную на 4. Не понимаю, почему нельзя было сделать это умножение в ядре. :roll:
Наверное, потому что Stride — это не всегда SrcWidth*4(почему это так — вопрос другой). А говоришь: "Разобрался".

Вот тут что-то про Image Stride: https://msdn.microsoft.com/en-us/librar ... s.85).aspx

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

Posted: Tue Jun 27, 2017 7:28 am
by JohnXenox
0CodErr wrote:Наверное, потому что Stride — это не всегда SrcWidth*4(почему это так — вопрос другой). А говоришь: "Разобрался".
Я имел ввиду, что разобрался с проблемой. :roll:
0CodErr wrote:Вот тут что-то про Image Stride: https://msdn.microsoft.com/en-us/librar ... s.85).aspx
Спасибо за ссылку, почитаю. :)

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

Posted: Wed Oct 03, 2018 2:49 pm
by JohnXenox
Появились несколько вопросов:
1. Можно ли как-то подцепить бинарник (написанный на FASM) в KTCC (средствами KTCC)?
2. Кто-нибудь может подсказать, как грузить LIBIMG.OBJ в KTCC? Мне нужно сделать вывод картинок (.png, .jpg, .gif), а я не знаю как. Желательно средствами KTCC.

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

Posted: Wed Oct 03, 2018 4:09 pm
by akron1
JohnXenox wrote:2. Кто-нибудь может подсказать, как грузить LIBIMG.OBJ в KTCC? Мне нужно сделать вывод картинок (.png, .jpg, .gif), а я не знаю как. Желательно средствами KTCC.
А ты знаешь, как загрузить произвольную obj-библиотеку (ф68.19), получить таблицу экспорта и связать ее с указателями на функции?

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

Posted: Wed Oct 03, 2018 4:41 pm
by Leency
Посмотри по аналогии с загрузкой console.obj в tte.
Недавно было обсуждение и коммит этого редактора.

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

Posted: Wed Oct 03, 2018 4:53 pm
by JohnXenox
akron1 wrote:А ты знаешь, как загрузить произвольную obj-библиотеку (ф68.19), получить таблицу экспорта и связать ее с указателями на функции?
Не знаю. Задаю вопросы по мере поступления.

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

Posted: Wed Oct 03, 2018 4:55 pm
by JohnXenox
Leency wrote:Посмотри по аналогии с загрузкой console.obj в tte.
Недавно было обсуждение и коммит этого редактора.
Спасибо. Посмотрю.

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

Posted: Wed Oct 03, 2018 5:30 pm
by akron1
Не всё так просто.

В библиотеке 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 проще.

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

Posted: Wed Oct 03, 2018 6:14 pm
by Siemargl
JohnXenox wrote:Появились несколько вопросов:
1. Можно ли как-то подцепить бинарник (написанный на FASM) в KTCC (средствами KTCC)?
2. Кто-нибудь может подсказать, как грузить LIBIMG.OBJ в KTCC? Мне нужно сделать вывод картинок (.png, .jpg, .gif), а я не знаю как. Желательно средствами KTCC.
Там есть готовый загрузчик.
Делай по образцу из \libc\stdio\conio.c

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