если просто вручную написать обращение по индексу, то всё работает корректно
Почему такое может быть
avr-gcc -mmcu=atmega2560 -DF_CPU=8000000 -fverbose-asm -S test.c
), то можно увидеть, что он не обращается к массиву power_5v
, а все константы просто подставлены как непосредственные значения в инструкции. Я думаю, что по этой причине.как это исправить
struct message{ int id; char* data; }; … send(fds[i].fd, &msg, sizeof(msg), 0)
// Add new socket to poll array fds[nfds].fd = new_socket; fds[nfds].events = POLLIN; nfds++; } // Check for data from clients for (int i = 1; i < nfds; i++) { if (fds[i].revents & POLLIN) {
struct pollfd fds[1]; fds[0].fd = sock; fds[0].events = POLLOUT; if (poll(fds, 1, -1) <= 0) { perror("poll failed"); exit(EXIT_FAILURE); } if (!(fds[0].revents & POLLOUT)) { perror("connect failed"); exit(EXIT_FAILURE); } // Receive message from server while ((valread = read(sock, &msg, sizeof(msg))) == -1 && errno == EAGAIN);
как это можно попробовать подебажить понять что не так, что происходит
На что он ругается?
norm_b_square
, а в цикле работаешь с *norm_b_square
. А если ты имел в виду одноимённый norm_b_square
из функции main
, то нет, нельзя так сослаться на автоматическую переменную из другой функции.После ввода Ctrl+Z и нажатия Enter, если я правильно понимаю, в потоке появляется только EOF и символ новой строки.
end-of-file, that is, no more input from a stream
. Это значит, что ни EOF
как символ, ни что бы то ни было после конца файла прочитано быть не может. Если чтение работает (т.е. функции чтения не возвращают ошибок, либо ошибки не указывают на конец файла), то конец файла не достигнут.Ctrl+Z
в cmd
не вызывает закрытие потока ввода для процесса. почему так происходит?
str
и word
-- это переменные размером в один символ, а в строке char delimeters[6] = " .,!?;"
отсутствует 0-терминатор. Поэтомуscanf("%s", &str);
вылезет за пределы str
если ввести здесь что угодно.strcat(&word, &c);
вылезет за пределы word
если в c
будет не пустая строка. А в c
будет неизвестно что, потому что c = getchar()
не добавляет в эту строку 0-терминатор.strchr(delimeters, c);
может вернуть что угодно, если c
не входит в delimiters
. Почему компиляторы не используют инструкции повторения 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--)