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));
}
компилируется, но не работает. Как исправить, чтобы работала?
Помогите пожалуйста.
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.
Большое спасибо за помощь, заработало.
Ох уж эти типы данных, как же с ними трудно. Аж мозги кипят! Bash scripting значительно проще, имхо.
Serge wrote:Я бы рекомендовал не мучиться с невыравненным доступом и использовать 32-х битный цвет и функцию Blit() для вывода.
Спасибо. Буду разбираться.
Re: Общие вопросы по языку Си.
Posted: Mon Jun 26, 2017 5:19 pm
by JohnXenox
Прошу помощи.
Опять ничего не получается. Никак не могу понять, в чём проблема. Наверно опять, что-то напутал с типами данных, но немогу понять, что именно. Сделал вывод в окно двух буферов, функцией Blit из newlib: первый буфер (p_img) залит красным цветом, второй (p_img2) жёлтым. В буфер залитый красным цветом хотел встроить изображение из второго буфера, просидел вчера целый день, но так ничего и не получилось. Написал функцию, которая неработает, с которой очень долго мучался, но позже понял, что дело не в функции. Закоментировал функцию и попробовал поместить в первый буфер два пикселя, жёлтого цвета. Но,
получились теже яйца, только в профиль выводится красный прямоугольник с жёлтой полосой по вертикали, толщиной в два пикселя, а должен быть красный прямоугольник с желтой полосой по горизонтали, длиной в два пикселя.
Что не так?
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
Всё, разобрался. Наконец программа заработала.
Метадом тыка, понял в чём была проблема. Надо было, в последнем параметре функции Blit, указать ширину изображения умноженную на 4. Не понимаю, почему нельзя было сделать это умножение в ядре.
Re: Общие вопросы по языку Си.
Posted: Tue Jun 27, 2017 6:10 am
by 0CodErr
JohnXenox wrote:ширину изображения умноженную на 4. Не понимаю, почему нельзя было сделать это умножение в ядре.
Наверное, потому что
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(почему это так — вопрос другой). А говоришь: "Разобрался".
Я имел ввиду, что разобрался с проблемой.
Спасибо за ссылку, почитаю.
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