Попробовал git rebase -i HEAD~5
но если в открывшемся списке напротив "коммит 4" ставлю флаг "s"
то у меня объединяются почему-то "фикс 4-го коммита" и "коммит 1"
squash
объединяет коммит на котором он стоит с предыдущим в этом списке. в чем ее суть
как с ней бороться
if(rank == 0){
for(size_t i = 1; i < size; i++){
size
частей, и скорректировать для size - 1
. Почему можно не указывать virtual в файле реализации?
Почему виснет программа на MPI?
if(rank == 0){
for(int i = 0; i < VEC_SIZE; i++){
…
}
for (int i = 1; i < size; ++i) {
int q = -1;
MPI_Send(&q, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
}
}else{
for (;;) {
int index;
MPI_Status status;
MPI_Recv(&index, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
if (index < 0)
break;
…
}
};
for(size_t i = 0; i < VEC_SIZE; i++){ size_t num_process = (i % (size - 1)) + 1; MPI_Send(&i, 1, MPI_INT, static_cast<int>(num_process), 0, MPI_COMM_WORLD);
size_t i
может отличаться от размера int
, подразумеваемого типом MPI_INT
. Этот код точно будет работать неправильно на big-endian архитектурах с LP64 ABI. Как увеличить FPS в системе?
Основной способ стандартный -- не перерисовывать всё, если можно этого избежать.
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
. Если локаль во время выполнения не будет соответствовать кодировке исходника, код всё равно будет работать.