VIDEO_BUFFER_SEGMENT = 0xA000
VIDEO_BUFFER_OFFSET = 0xFA00
VIDEO_SEGMENT = 0xA000
VIDEO_OFFSET = 0x0000
diff --git a/lib/video.inc b/lib/video.inc
index 3a26f43e2f79..d7054e194da9 100644
--- a/lib/video.inc
+++ b/lib/video.inc
@@ -3,8 +3,8 @@ VIDEO_INC equ 0
include "memory.inc"
-VIDEO_BUFFER_SEGMENT = 0xA000
-VIDEO_BUFFER_OFFSET = 0xFA00
+VIDEO_BUFFER_SEGMENT = 0x6000
+VIDEO_BUFFER_OFFSET = 0x0000
VIDEO_SEGMENT = 0xA000
VIDEO_OFFSET = 0x0000
VIDEO_SIZE_DB = 0xFA00
@@ -79,11 +79,11 @@ macro video!flip {
mov ax, VIDEO_SEGMENT
mov bx, VIDEO_BUFFER_SEGMENT
mov es, ax
- mov ds, ax
+ mov ds, bx
mov cx, VIDEO_SIZE_DB
cld
mov si, VIDEO_BUFFER_OFFSET
- xor di, VIDEO_OFFSET
+ mov di, VIDEO_OFFSET
rep movsb
pop ds es
}
diff --git a/os.asm b/os.asm
index 1949e95b4e99..e5ebb3d280aa 100644
--- a/os.asm
+++ b/os.asm
@@ -91,9 +91,9 @@ kernel.routine.startup:
kernel.routine.video:
cli
video!fill 0x4E
- ;video!window 30, 40, 100, 60, 0x1A, 0xFF, 13 , 0x1F
- ;video!cursor
- ;video!flip
+ video!window 30, 40, 100, 60, 0x1A, 0xFF, 13 , 0x1F
+ video!cursor
+ video!flip
sti
ret
mov al, [bp+12] mov bl, al mov cl, 3 shl al, cl sbb dh, dh cbw mov dl, [bp+8] mov al, [bp+10]
kernel.routine.mouse.init:
push es bx
int 0x11
test ax, 4
jz kernel.routine.mouse.init.error
mov ax, 0xC205
mov bh, 3
int 0x15
jc kernel.routine.mouse.init.error
mov ax, 0xC203
mov bh, MOUSE_RESOLUTION
int 0x15
jc kernel.routine.mouse.init.error
Не работает деструктор
что я делаю не так?
strlen(source)
байт для вывода, а потом находишь compSize
, который может быть и больше чем strlen(source)
. Ты не возвращаешь compSize
после вызова compress
, а он может измениться. Ты возвращаешь только char*
, как будто это строка, но это не строка, там могут быть нулевые байты.uncompress_char
почти те же самые ошибки. Плюс какая-то путаница между length
, compSize
и ucompSize
. На вход uncompress
в параметре compSize
должен попасть настоящий размер сжатых данных, а не догадка о нём на основе вызова compressBound
.char* compress_char(const char* source, size_t *outCompSize, size_t *outUcompSize)
{
uLong ucompSize = strlen(source) + 1;
uLong compSize = compressBound(ucompSize);
char* bytes = malloc(compSize);
compress((Bytef *)bytes, &compSize, (Bytef *)source, ucompSize);
*outCompSize = compSize;
*outUcompSize = ucompSize;
return bytes;
}
char* uncompress_char(const unsigned char source[], size_t inCompSize, size_t inUcompSize)
{
uLong ucompSize = inUcompSize;
uLong compSize = inCompSize;
char* message = malloc(ucompSize);
uncompress((Bytef *)message, &ucompSize, (Bytef *)source, compSize);
return message;
}
void foo(void)
{
size_t a, b;
char *p = compress_char("{\"a2\":\"b\"}", &a, &b);
char *p1 = uncompress_char(p, a, b);
printf("%s, %zd -> %zd\n", p1, b, a);
}
compress
/uncompress
. У меня есть 8-битный bmp, 320х200 пкс. Мне нужно форматировать его в бинарный файл (1 байт = один пиксель) для линейного буфера по адресу 0хА0000.
Вот целевая палитра
У меня есть код на C++, который использует zlib. Я хочу на линуксе его скомпилировать в .so библиотеку, но чтобы команда ldd не показывала libz.so или libz.so.1 (чтобы zlib был встроен в .so).
-Bstatic
и -Bdynamic
можно переключать режим линковки библиотек:g++ -shared foo.cc -o libfoo.so -Wl,-Bstatic -lz -Wl,-Bdynamic
-fpic
. Как правильно посчитать время выполнения fread/fwrite
Нужно посчитать время чтения и время записи одинакого размера блока данных на диск.
Причем, время момента, когда данные окажутся на диске
Я правильно понимаю, что fclose(f) закрывает файловый дескриптор f после того как данные записаны на диск?
Note that fflush() flushes only the user-space buffers provided
by the C library. To ensure that the data is physically stored
on disk the kernel buffers must be flushed too…
нужна функция get_time_func()
создать интерфейсы приложение не может т.к. не хватает привилегий.
sudo: not found
. Т.е. скрипт рассчитывает выполнить привилегированную часть с помощью sudo, но его (sudo) нет.Полагаю, необходимо дать права пользователю 1000:1000 на хосте, не совсем понятно какие и на какие файлы.
Верно ли я понимаю, что первый scanf читает поток и останавливается на \n , после чего каждый последующий вызов scanf начинает чтение с этого же символа (\n) и, следовательно, моментально останавливается
%[^\n]s
содержит символ s
который никогда не заматчится, потому что %[^\n]
останавливается на символе '\n'. Логично было бы заменить её на %[^\n]%*c
чтобы работало так, как было задумано. С чего начинать разбираться?
while (scanf("%f %f %f", &a, &b, &c) != 1 || ...
float
, чтобы формат %f
scanf
работал правильно.если сначала ввести 1 2 3, то приложение выведет "Ошибка. Введите снова: "
как это исправить?
scanf
возвращает число успешно отсканированных полей, возвращаемое scanf
значение надо сравнивать с 3 в условии цикла. как это работает
%c
выводит только один. Если на одном выведенном байте остановиться -- получится фигня с вопросом. Но если вывести подряд все байты многобайтового символа -- получится этот символ.как исправить
mblen
, типа того:#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char *a = "Привет, мир";
int s;
setlocale(LC_ALL, "");
for (; *a != '\0'; a+=s) {
s = mblen(a, strlen(a));
printf("%.*s-", s, a);
}
return 0;
}
setlocale
нужен для того, чтобы mblen
понял, в какой кодировке символы на входе. Локаль в момент выполнения должна быть совместимой с кодировкой исходника в момент компиляции, если это условие не выполняется, работать будет неправильно. wchar_t
:#include <locale.h>
#include <stdio.h>
#include <stddef.h>
int main() {
wchar_t *a = L"Привет, мир";
setlocale(LC_ALL, "");
for (; *a != '\0'; a++) {
printf("%lc-", *a);
}
return 0;
}
setlocale
нужен для другого: он говорит внутренностям printf
в какую локаль выполняется вывод чтобы в неё конвертировать wchar_t
. Если локаль во время выполнения не будет соответствовать кодировке исходника, код всё равно будет работать. При повторной итерации read, по идее, должен вернуть 0, так как все прочитано
read
или вернуть из неё -1 (и установить errno
, например, в EINTR
). Асинхронный сокет вернёт из read
-1 и установит errno
в EAGAIN
или EWOULDBLOCK
.Connection: Keep-Alive
или отсутствию заголовка Connection: close
в его ответе если это HTTP/1.1
. Его можно попросить закрыть соединение после ответа, послав запрос с заголовком Connection: close
или можно избежать блокировки в read
прочитав только данные ответа размер которых прислан в заголовке ответа Content-Length
. Что не так с процедурой?
stdcall test_proc, 11 … proc test_proc, ms … mov rbx, qword ptr ms
403004: 48 c7 c1 0b 00 00 00 mov $0xb,%rcx
40300b: e8 19 00 00 00 callq 0x403029
…
40307b: 48 8b 5d 10 mov 0x10(%rbp),%rbx
дамп postgres, после чего, если комманда с дампом выполнилась…
pg_dump -U postgres zkgu | gzip > /mnt/NStore/1c-sqldump/$n$d.gz EXIT_STATUS=$? if [[$EXIT_STATUS -eq "0"]]
if pg_dump -U postgres zkgu | gzip > /mnt/NStore/1c-sqldump/$n$d.gz
$?
-- это статус завершения последней команды, а у вас там пайплайн и последняя команда -- gzip
. Статус завершения именно pg_dump
не проверяется, ни первым вариантом, ни вторым. Последняя кавычка ни в какую не хочет убираться, не могу понять, в чем дело
std::string variable_value = var.substr(variable_value_start + 1, variable_value_end - 1);
std::string::substr
-- это длина выделяемой подстроки, а не индекс конца.std::string variable_value = var.substr(variable_value_start + 1,
variable_value_end - variable_value_start - 1);
for (int i = 0; i<2; i++){ group.PutCar(i,Car(marks[i],powers[i],costs[i],displaces[i])); }
group[2].Print();
void Group::Print(){
for (int i = 0; i<sizeof(array); i++){
array[i].Print();
}
};
operator double (){
int summ = 0;
for(int i = 0; i < sizeof(array); i++){
summ += array[i].getCost();
}
цифра три на левой части дисплея имеет код 9Е и чтобы вывести результат сложения 1 + 2 мне надо 3 как-то преобразовать в 9Е
0xfa, 0x0a, 0xb6, 0x9e, 0x4e, 0xdc, 0xfc, 0x8a, 0xfe, 0xde
.