e.data.fd = cfd; e.data.ptr = (void*)cfd;
typedef union epoll_data {
void *ptr;
int fd;
uint32_t u32;
uint64_t u64;
} epoll_data_t;
struct epoll_event {
uint32_t events; /* Epoll events */
epoll_data_t data; /* User data variable */
};
в документации сказано, что там должен быть дескриптор серверного сокета
l=[a_1,..,a_n] – некоторый список элементов типа T, а f:T→T, то:
map(f,l)↦[f(a_1 ),..,f(a_n )]
Не понятно что она делает и как ее реализовать.
#include <stddef.h>
struct list {
struct list *next;
};
struct list *map(void f(struct list *p), struct list *l)
{
struct list *i;
for (i = l; i != NULL; i = i->next)
f(i);
return l;
}
struct list_int {
struct list list;
int i;
};
void process_int(struct list *l)
{
struct list_int *p = (struct list_int *)l;
++p->i;
}
int main()
{
struct list_int l[] = {
[0] = {
.list.next = &l[1].list,
.i = 1,
},
[1] = {
.i = 2,
},
};
map(process_int, &l[0].list);
}
Из за чего это ?
offsetof(struct my_struct_in, addr)
чтобы в этом убедиться.uint32_t addr
, если имелся в виду IP адрес). Паковать структуры (если выравнять нельзя), либо располагать поля согласно их натуральному выравниванию. Как на Си вывести флаги в том же формате, что делает команда objdump?
static void
dump_bfd_header (bfd *abfd)
{
char *comma = "";
printf (_("architecture: %s, "),
bfd_printable_arch_mach (bfd_get_arch (abfd),
bfd_get_mach (abfd)));
printf (_("flags 0x%08x:\n"), abfd->flags & ~BFD_FLAGS_FOR_BFD_USE_MASK);
#define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
PF (HAS_RELOC, "HAS_RELOC");
PF (EXEC_P, "EXEC_P");
PF (HAS_LINENO, "HAS_LINENO");
PF (HAS_DEBUG, "HAS_DEBUG");
PF (HAS_SYMS, "HAS_SYMS");
PF (HAS_LOCALS, "HAS_LOCALS");
PF (DYNAMIC, "DYNAMIC");
PF (WP_TEXT, "WP_TEXT");
PF (D_PAGED, "D_PAGED");
PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
printf (_("\nstart address 0x"));
bfd_printf_vma (abfd, abfd->start_address);
printf ("\n");
}
void get_disks(char * allDisks[]) { char buf[128]; ... for (char *s = buf; *s; s += strlen(s) + 1) { ... allDisks[i] = s; ... allDisks[7] = "ABC"; allDisks[8] = "DEF"; } }
После прохождения массива функцией get_files список дисков исчезает, но "ABC" и "DEF" остаются.
Подскажите, почему так происходит, куда теряются первые строки и как исправить?
allDisks
указатели на стековый массив buf
, который разрушается после выхода из функции get_disks
. А строчки "ABC" и "DEF" -- константные строчки, существуют всё время выполнения программы.allDisks
:void get_disks(char * allDisks[])
{
char buf[128];
int i = 0;
GetLogicalDriveStringsA(sizeof(buf), buf);
for (char *s = buf; *s; s += strlen(s) + 1)
{
if (GetDriveTypeA(s) == 2 || GetDriveTypeA(s) == 3)
{
allDisks[i] = strdup(s);
++i;
allDisks[7] = "ABC";
allDisks[8] = "DEF";
}
}
}
почему я неправильно ссылаюсь к указателю в структуре?zmienna_strukt.a=NULL; ... scanf("%s", wsk->a);
struct morgan zmienna_strukt;
struct morgan *wsk;
unsigned char buf[100];
wsk=&zmienna_strukt;
printf("Впиши значение: ");
fflush(stdout);
scanf("%d", &zmienna_strukt.b);
printf("%d \n\n", zmienna_strukt.b);
zmienna_strukt.a=buf;
buf[0] = 0;
printf("%s \n\n", zmienna_strukt.a);
printf("Впиши значение: ");
fflush(stdout);
scanf("%s", wsk->a);
printf("%s \n\n", wsk->a);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static int cmp_min(const void *a, const void *b)
{
int va = *(const char *)a;
int vb = *(const char *)b;
return va - vb;
}
static int minimize(int v)
{
char str[sizeof(int) * 3 + 1];
int i;
sprintf(str, "%d", v);
qsort(str, strlen(str), 1, cmp_min);
if (str[0] == '0') {
for (i = 0; str[i]; ++i) {
if (str[i] != '0') {
str[0] = str[i];
str[i] = '0';
break;
}
}
}
sscanf(str, "%i", &v);
return v;
}
static int cmp_max(const void *a, const void *b)
{
int va = *(const char *)a;
int vb = *(const char *)b;
return vb - va;
}
static int maximize(int v)
{
char str[sizeof(int) * 3 + 1];
sprintf(str, "%d", v);
qsort(str, strlen(str), 1, cmp_max);
sscanf(str, "%i", &v);
return v;
}
int main()
{
int a, b;
int result_a, result_b;
scanf("%i %i", &a, &b);
result_a = a < 0 ? -minimize(-a) : maximize(a);
result_b = b < 0 ? -maximize(-b) : minimize(b);
printf("%d\n", result_a - result_b);
return 0;
}
sum_of = sum(matrix[][]);
sum_of = sum(n, matrix);
int sum (int n, int matrix[n][n]) { int sum = 0; for (int j = 0; j < n; ++j){ for (int i = 0; i < n; ++i){ if (j == i){ sum += matrix[j][i]; } } } return sum; }
int sum (int n, int matrix[n][n])
{
int sum = 0;
for (int i = 0; i < n; ++i) {
sum += matrix[i][i];
}
return sum;
}
float del (float a, float b)
{
float res;
...
res = ...;
....
return res;
}
....
float result = del (num1, num2);
что делает "return res" во втором куске кода? То есть в переменную res записывается деление числа А и Б. А потом оно куда-то там возвращается..
Подскажите как можно реализовать программно текстовый протокол SCPI?
Есть синонимы команд, есть не обязательные параметры, параметры могут быть, могут не быть, может быть сразу несколько. Как это всё обрабатывать и проверять не пытается ли пользовать ввести несуществующую команду?
for(char* pnew_char = new_char; *pnew_char++ = *--pchar;);
for(; *pchar; ++length, ++pchar);
for(char* pnew_char = new_char; *pnew_char++ = *--pchar;);
В каком месте может быть ошибка?
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
int main(int argc, char **argv) {
int fd0[2], fd1[2], n;
char c;
pipe(fd0);
pipe(fd1);
if (!fork()) {
close(fd0[0]);
close(fd1[1]);
write(fd0[1], "c", 1);
sleep(1);
if ((n = read(fd1[0], &c, 1)) != 1) {
printf("Дочерний процесс. Результат чтения: %d\n", n);
exit(0);
}
printf("Дочерний процесс прочитал: %c\n", c);
exit(0);
}
close(fd1[0]);
close(fd0[1]);
write(fd1[1], "p", 1);
if ((n = read(fd0[0], &c, 1)) != 1) {
printf("Родительский процесс. Результат чтения: %d\n", n);
exit(0);
}
printf("Родительский процесс прочитал: %c\n", c);
exit(0);
return 0;
}
printf("something\n")
, без точки с запятой -- это expression, а именно вызов функции) и "statement" (например if (expression) statement
-- это statement), а иногда expression может быть statement'ом (например, printf("something\n");
, с точкой с запятой), это называется "expression statement".
Как называть по-человечески строчки:if ( a > b ) printf("something\n");
if
с единственной инструкцией-выражением.А такое:if(condition) { printf("something1\n"); printf("something2\n"); }
if
с составной инструкцией содержащей две инструкции-выражения. float b; ... if (b == b)
Two values (other
than NaNs) with the same object representation compare equal, but values that compare
equal may have different object representations.
. Как это усовершенствовать?
An optional 'm' character. This is used with string conversions (%s, %c, %[), and relieves the caller of the need to allocate a corresponding buffer to hold the input: instead, scanf() allocates a buffer of sufficient size, and assigns the address of this buffer to the corresponding pointer argument, which should be a pointer to a char * variable (this variable does not need to be initialized before the call). The caller should subsequently free(3) this buffer when it is no longer required.
#include <stdio.h>
int main()
{
char *chars;
scanf("%m[^\n]",&chars);
printf("%s\n", chars);
}
Что происходит в данном случае
int ** ptr = &arr;
initialization from incompatible pointer type
.Получается что далее ptr == arr == &arr
==
использованное в смысле "численно равно" действительно имеет место. Но типы этих трёх значений разные: int **
/int[4]
/int (*)[4]
Почему нельзя получить указатель на указатель на массив в данном случае?
#include <stdio.h>
int main(void)
{
int arr[4] = {1, 2, 3, 4};
int *pa = arr;
int ** ptr = &pa;
printf("%d", **ptr); // 1
return 0;
}
Почему если считывать число как long double, то результат получается нормальным,
input 2 => output 8.000000 (%lf)
%lf
-- это не long double, а просто double. %f
-- это float, а long double -- это %Lf
. См. man scanf.