Почему компиляторы не используют инструкции повторения REP movs?
Она должна быть в миллиард раз быстрее
asm volatile ("int3");
и это тоже вызовет доставку сигнала, останов и трассировку последующих вызовов write. обработчик динамически ищет и выполняет функцию
Как правильно посчитать время выполнения 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()
Верно ли я понимаю, что первый 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
. Почему вместо строки появляется мусор?
size_t xpath_formatted_size = vsnprintf(NULL, 0, xpath, arguments); char* xpath_formatted = malloc(xpath_formatted_size); vsnprintf(xpath_formatted, xpath_formatted_size, xpath, arguments);
vsnprintf(…, arguments)
меняет arguments
.Как это исправить?
char* xpath_format(const char* xpath, ...)
{
va_list arguments;
va_start(arguments, xpath);
size_t xpath_formatted_size = vsnprintf(NULL, 0, xpath, arguments) + 1;
va_end(arguments);
va_start(arguments, xpath);
char* xpath_formatted = malloc(xpath_formatted_size);
vsnprintf(xpath_formatted, xpath_formatted_size, xpath, arguments);
va_end(arguments);
return xpath_formatted;
}
d
не инициализирован, а в том, что колическтво итераций цикла вывода массива d
не зависит от того, сколько элементов было занесено в этот массив. Правильным решением было бы как-то их связать, например так:int i = 0, n;
while (piece != NULL)
{
d[i] = piece;
piece = strtok(NULL, " ");
i++;
}
n = i;
for (i = 0; i < n; i++) {
if(i%2==0)
printf("%s ",d[i]);
}
ошибка возникает на моменте сдвига элементов. Как ее исправить?
data = (Student*)realloc(data, count * sizeof(Student)); for (int i = count; i > offset; i--) { data[i] = data[i - 1]; }
count
элементов, то последний имеет индекс count - 1
. Этот цикл должен быть таким: for (int i = count - 1; i > offset; i--)
в функции main, почему то выводит мусор
%32[^,]
может записать до 33 байт (32 символа из файла + 0), что не влезет в такое поле: char title[32];
. Если файл в кодировке utf-8, то байтов в полях может быть больше чем символов. Почему-то как я не стараюсь всё записывается только в sportsmens[i].full_name,
fscanf
, а поля в твоём файле разделены пробелами, формат fscanf
должен включать в себя пробелы чтобы избавиться от разделителей. Кроме того, имеет смысл проверить, что setlocale
возвращает не-NULL, иначе он не повлияет на десятичный разделитель (и %f
не сможет прочитать число с плавающей точкой записанное как 12,12). Но не получается
zeroCounter
как я понял нужен для реализации шага "Remove leading "0" from X'", но эта реализация неправильная. К тому же она находится вне цикла while ( X != "0" )
.for (b in bits of X) // msb to lsb
говорит о том, что b должен пробегать двоичные цифры, от старшего разряда к младшему, в формуле R = 2*R + b
фигурирует значение разряда, а не его индекс, как в твоём коде.R, как я понимаю, должна быть очередная десятичная цифра получающегося числа?
Почему возникает ошибка
scanf("%d", *(b+i));
b = (int*) malloc(a * sizeof(int));
) и даже пытается её возращать, но неправильным типом и main это значение не использует. А поэтому в main b как был NULL так и остаётся. По-хорошему надо как-то так:int * input_array(int a){
int *b = (int*) malloc(a * sizeof(int));
for (int i = 0; i < a; ++i) {
printf("array[%d] = ", i);
scanf(" %d", b+i);
}
return b;
}
int main() {
...
printf("Введите длину массива:");
scanf(" %d", &a);
int *b = input_array(a);
min = find_min(b, a);
max = find_max(b,a);
average = average_function(min, max);
...
}
Если я использую printf("asd"), то весь текст в кавычках будет выведен на экран и записан в лог файл. Вот такая команда: './a.out > file.log'.
./a.out > file.log
не выведет ничего на экран, всё будет перенаправлено в файл. но 2) сам printf об этом ничего не знает. Он выводит данные в поток стандартного вывода, куда они перенаправляются потом -- не его дело. 3) оператор >
перенаправляющий вывод -- это инструкция командной оболочке как запускать программу, к самой программе отношения не имеет.Есть ли какая другая команда вывода, которая будет текст выводить только в терминал, без записи в файл?
./a.out
, без каких-либо изменений в коде. гугля, находил предложения с LD_LIBRARY_PATH=... . Но разве флаг -L при компиляции не служит той же самой цели?
-L
говорит о том, где искать любые библиотеки во время линковки приложения. LD_LIBRARY_PATH
говорит о том, где искать динамические библиотеки во время выполнения. Информация из -L
со времени линковки нигде не сохраняется. Можно зашить в слинкованный бинарник пути к библиотекам, но это делается другими опциями (см. опцию линкера -rpath
). Во время выполнения динамические библиотеки могут быть где угодно, не обязательно там, где они были во время линковки.Как создать динамическую библиотеку, которая зависит от другой библиотеки?
readelf -d libwindow.so | grep NEEDED
то там должна быть ссылка на libSDL. Твоя проблема в том, что сама libwindow.so не найдена. return x | y;
, то она не может никогда вызвать send
, а программа-сервер должна просто завершаться после расчёта НОД.recv
, но поскольку ты её не обрабатываешь, то дальше она будет пытаться выводить ответ из буфера в который не было ничего принято.не знаю, как правильно найти НОД в данном случае:
return x | y
нужно просто использовать x | y
в itoa
. Res и всё что с ним связано можно выкинуть, поскольку оно всё равно никак не используется.char *str = malloc(0);
Правильно ли я понимаю, что в str находится начало выделянно памяти на 0 байт
If the size of the space requested is zero, the behavior is implementation-
defined: either a null pointer is returned, or the behavior is as if the size were some
nonzero value, except that the returned pointer shall not be used to access an object.
а дальше идет запись символов в память, которая для нас не предназначалась?