Пишу ОС (важно, не выйдет использовать stdarg)
А если вызывать такую функцию (с аргументами "test", 'q'):
void test(char* format, ...) { char* ptr = format; for (int i = -10; i < 10; i++) { putc(*(ptr+i)); } }
Ожидания были таковы, что хотя бы где-то должна была появиться буква q, чего не произошло.
void test(char* format, ...)
{
char *ptr = (char *)&format;
for (int i = -10; i < 10; i++)
{
putc(*(ptr+i));
}
}
Как работает while ( !feof ( cfPtr ) )?
FILE * cfPtr = fopen( "test.txt", "rb" );
char temp;
for (;;) {
int read = fread( &temp, sizeof( char ), 1, cfPtr );
if (read == 1) {
printf("%c\n", temp);
} else {
if (feof(cfPtr)) {
/*случился конец файла*/
} else if (ferror(cfPtr)) {
/* случилась ошибка */
}
break;
}
}
Это присваивание адреса первого байта массива {0, 0, 0, 0} указателю float?
что будет в i, после данных действий?
float* arr = (float []){0, 0, 0, 0};
int i = *((int*)arr);
проинтерпретирует память первого элемента массива как целое число и присвоит его значение i. По стандарту ieee754 нулевое значение типа float представляется в памяти как 4 нулевых байта, соответственно в i будет записан 0. как при работе с функциями из библиотеки GMP, считывать и сохранять данные в файл (и читать из файла) например используя Массивы?
как реализовать то что можно делать в командной строке:
ls > file1 > file2
ls | tee file1 file2
Единственно что мне приходит в голову...вручную записывать в каждый fd.
Первые два работают нормально, но когда доходит до 3, он не выполняется и длина выводится 0?
scanf("%d", &n);
зачитывает только один int из стандартного ввода. Если ты вводишь число и жмёшь enter, то конец строки остаётся в потоке ввода и читается gets'ом.scanf("%d ", &n);
#include <pty.h>
#include <unistd.h>
#include <thread>
#include <future>
#include <iostream>
#include <string>
ssize_t sz = 1;
int main()
{
int mfd;
pid_t pid_fork = forkpty(&mfd, NULL, NULL, NULL);
if (!pid_fork) {
// Дочерний процесс
execl("/bin/sh", "-", NULL);
} else {
// Родительский процесс
char buf[1024];
// Async
auto future = std::async(std::launch::async, [mfd]() {
std::string line;
while (sz) {
std::getline(std::cin, line);
line = line + "\n";
write(mfd, line.c_str(), line.size()); // Нужно направить в дочерний процесс как stdin
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
});
while (sz = read(mfd, buf, sizeof(buf))) {
write(STDOUT_FILENO, buf, sz); // Вывод из дочернего процесса stdout
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
exit(0);
}
}
...
#include <sys/ioctl.h>
...
struct winsize ws, *pws = NULL;
if (ioctl(1, TIOCGWINSZ, &ws) >= 0)
pws = &ws;
pid_t pid_fork = forkpty(&mfd, NULL, NULL, pws);
char * suit [4] = { "Hearts", "Diamonds", "Clubs", "Spades" };
Как изменить строку, инициализированную при объявлении массива символьных указателей, с помощью scanf?
Как добавить программу на Си в автозагрузку Windows?
И еще: как искать информацию на ответы по Си, если я пишу в гугле "Си как добавить программу в автозагрузку", но везде появляется только С++? Нереально найти ответ.
Почему результат вывода именно такой?
After a successful return from one of these system calls, the old
and new file descriptors may be used interchangeably. They refer
to the same open file description (see open(2)) and thus share file
offset and file status flags; for example, if the file offset is modified
by using lseek(2) on one of the descriptors, the offset is also
changed for the other.
printMAS (&MAS);//будет ошибкой! Почему?
&MAS
-- int (*)[5]
. Значение же адреса будет одним и тем же.Вот такие инструкции же работают...
...
и интерпретируется внутри как void *
, т.е. тип исходного адреса больше не имеет значения. Нужно ли вообще очищать память в старом указателе?
Как не сложно заметить при большой точности, мой результат отличается от результата библиотечного printf.
0,0000000000000012300000000000000679
-- это всё что имеет смысл печатать, и эта часть одинакова в выводе printf и ft_printf. Всё что идёт дальше -- это мусор, который не содержится в исходном числе.long double tt = 0.00000000000000123;
Где можно почитать почему так происходит, почему такие разные вариации записи одно числа в шестнадцатеричной системе исчисления?
A double argument representing a floating-point number is converted in the
style [−]0xh.hhhh p±d, where there is one hexadecimal digit (which is
nonzero if the argument is a normalized floating-point number and is
otherwise unspecified) before the decimal-point character...
char str1[5]; char str2[3]; fgets(str1,5,stdin); fgets(str2,3,stdin);
Я ожидаю, что при запуске введу слово из 5 букв, потом слово из 3
fgets() reads in at most one less than size characters from stream
and stores them into the buffer pointed to by s.
Reading stops after an EOF or a newline.
If a newline is read, it is stored into the buffer.
!quit
, потому что quit не меняется в этой функции и в функциях вызываемых из неё.Может стоит вынести флаг в параметры потока
while(!quit) { if(difftime(time(NULL), last_cycle) > 30) { last_cycle = time(NULL); // Тут мои грязные дела } }
sleep
или что-нибудь типа pthread_mutex_timedlock
/pthread_cond_timedwait
.#include <sys/time.h>
#include <pthread.h>
#include <stdbool.h>
#include <string.h>
#include <stdio.h>
struct thread1 {
pthread_mutex_t lock;
pthread_cond_t cond;
bool quit;
};
static void* thread_process(void *p) {
struct thread1 *arg = p;
for (;;) {
bool quit;
pthread_mutex_lock(&arg->lock);
if (!arg->quit) {
struct timeval now;
struct timespec ts;
gettimeofday(&now, NULL);
ts.tv_sec = now.tv_sec + 30;
ts.tv_nsec = now.tv_usec * 1000;
pthread_cond_timedwait(&arg->cond, &arg->lock, &ts);
}
quit = arg->quit;
pthread_mutex_unlock(&arg->lock);
if (quit)
return NULL;
// Тут мои грязные дела
}
return NULL;
}
int main() {
pthread_t th;
struct thread1 arg = {
.lock = PTHREAD_MUTEX_INITIALIZER,
.cond = PTHREAD_COND_INITIALIZER,
.quit = false,
};
pthread_create(&th, NULL, thread_process, &arg);
char cmd[16];
while(true) {
scanf("%s", cmd);
if(!strcmp(cmd, "quit")) {
pthread_mutex_lock(&arg.lock);
arg.quit = true;
pthread_cond_broadcast(&arg.cond);
pthread_mutex_unlock(&arg.lock);
break;
}
// остальные команды
}
pthread_join(th, NULL);
return 0;
}
x = float(a) / 4.;