
Alexen
17.10.2018
05:22:33
Это то с чем программисты никогда не взаимодействуют, а зря
User eXpirience
А - те кто писал софт, B - те кто его в основном используют, C - группа прочих пользователей

Alex
17.10.2018
05:48:30
Джентельмены, а правда что новые стандарты С не совместимы с С++?

Google

Assasin
17.10.2018
05:50:04
так и старые стандарты не 100% совместимы с C++

Vladislav
17.10.2018
06:00:34

Alex
17.10.2018
06:02:15
Я не имею ввиду всякие int class. Если что, то с минимальными правками и усилиями сишный код можно будет сбилдить С++ компилятором?

Anatoly
17.10.2018
06:03:32

Igor
17.10.2018
07:21:58

Anatoly
17.10.2018
07:22:46

Ilia
17.10.2018
07:25:13

Sanek
17.10.2018
07:27:32

Ilia
17.10.2018
07:27:45

Igor
17.10.2018
07:30:11
годная задачка, утащу в копилку вместе с void f(int& r, ...)
у нас ещё недавно всплывал майндфак на тему, почему успешно работает такое чудо
const char *input = "1 2 3 abcdef";
char data[30];
int x,y,z;
sscanf(input, "%d %d %d %s", &x, &y, &z, &data);

Grigor
17.10.2018
08:14:39
годная задачка, утащу в копилку вместе с void f(int& r, ...)
у нас ещё недавно всплывал майндфак на тему, почему успешно работает такое чудо
const char *input = "1 2 3 abcdef";
char data[30];
int x,y,z;
sscanf(input, "%d %d %d %s", &x, &y, &z, &data);
А что здесь не так?

Igor
17.10.2018
08:17:41
А что здесь не так?
последним параметром передается &data вместо data, казалось бы -- char**, адрес указателя вместо самого указателя, строчка явно должна писаться куда-то не туда и проезжаться где-то по памяти
ан нет, всё прекрасно работает

Google

Anatoly
17.10.2018
08:23:28

Igor
17.10.2018
08:25:41
в том плане что gcc плюётся предупреждением "у вас тут &s, а вы передаете char(*)[30] вместо char*" ?

Egor
17.10.2018
08:27:58
адрес разве не один и тот же? data и &data
просто тип другой как и пишет гцц

Sanek
17.10.2018
08:28:15
адрес один и тот же

Igor
17.10.2018
08:28:25

Alidrod
17.10.2018
08:29:25

Дмитрий
17.10.2018
08:29:35
Но именно пока у тебя, опять таки, тип с размером приехал.

Евгений
17.10.2018
08:30:30

Egor
17.10.2018
08:30:34

Igor
17.10.2018
08:32:01
&data[0] можно
да, это будет тот же самый data; вопрос к тому, что именно научились вычислять компиляторы
варнами о форматировании у нас весь код усеян к сожалению, и вот в какой-то момент мы решили его чуть раскопать, и натолкнулись

Дмитрий
17.10.2018
08:33:56

Igor
17.10.2018
08:34:12

Дмитрий
17.10.2018
08:34:44
Ну вот брать указатель на указатель плохой план по передаче буфера

Maxim
17.10.2018
08:35:20
Всем привет. Подскажите пожалуйста, как в CMake указать версию .netFramework?

Konstantin
17.10.2018
08:39:32
https://cmake.org/cmake/help/v3.13/prop_tgt/VS_DOTNET_TARGET_FRAMEWORK_VERSION.html

Maxim
17.10.2018
08:42:56

Роман
17.10.2018
08:45:14
Добрый день! кто поможет с программой? она работает, но есть некоторые неудобности, их нужно обойти...

Anatoly
17.10.2018
08:45:36

Google

Konstantin
17.10.2018
08:50:35

Igor
17.10.2018
08:52:09


Anatoly
17.10.2018
08:52:21
эээ, ты сейчас про void f(int&, ...) или про scanf("%s", &buf)?
годная задачка, утащу в копилку вместе с void f(int& r, ...) : UB
The contents of the header <cstdarg> are the same as the C standard library header <stdarg.h>, with
the following changes: The restrictions that ISO C places on the second parameter to the va_start macro
in header <stdarg.h> are different in this International Standard. The parameter parmN is the rightmost
parameter in the variable parameter list of the function definition (the one just before the ...).219 If the
parameter parmN is a pack expansion (17.5.3) or an entity resulting from a lambda capture (8.1.5), the
program is ill-formed, no diagnostic required. If the parameter parmN is of a reference type, or of a type that
is not compatible with the type that results when passing an argument for which there is no parameter, the
behavior is undefined.


Дмитрий
17.10.2018
08:55:39
А, оооо.
И логично, и вот же блин.

Anatoly
17.10.2018
08:58:47
И логично, и вот же блин.
когда стандартная библиотека не предпринимала никаких защит против этого кейса, это была песня:
void foo(int& r, ...) {.... using va_arg, va_end, va_start }
int r;
foo(r, "1"); // внутри попадали в чужой стек фрейм и читали мусор

Дмитрий
17.10.2018
08:59:25
А сча как?

Anatoly
17.10.2018
08:59:58
А сча как?
компиляторы ставят свои вычислители правильного положения в стеке параметра, являющегося ссылкой

Alex
17.10.2018
09:01:30
В примере выше int& - это же указанный явно параметр, не переданный через ...? Так в чём проблема?

Anatoly
17.10.2018
09:02:36
А сча как?
в реализации MSVC это запрещено вообще:
#define __crt_va_start(ap, x) ((void)(__vcrt_assert_va_start_is_not_reference<decltype(x)>(), __crt_va_start_a(ap, x)))
#define va_start __crt_va_start
то есть, даже не скомпилируется

Alex
17.10.2018
09:05:50
Не очевидно, почему это касается явного аргумента. Я бы понял, если бы функция была foo(...), и в неё передавалась ссылка, но здесь же не так

Anatoly
17.10.2018
09:06:26

Alex
17.10.2018
09:07:03
Хм. Спасибо за объяснение, почитаю, как это работает.

Anatoly
17.10.2018
09:07:04
поэтому нельзя определить функцию, как foo(...), поскольку ей не к чему привязаться.

Alex
17.10.2018
09:07:25
Понял
Никогда не писал таких функций, не знал, что один "нормальный" параметр обязан быть объявлен.

Anatoly
17.10.2018
09:08:54

Google

Alex
17.10.2018
09:09:10
ото ж

Alexey
17.10.2018
09:19:52
Не всегда
Варадики могут наплодить много инстанцирований
Иногда аргументы вообще не важны
sfinae на ... работает

Igor
17.10.2018
09:25:10
в условии нужно было задать более неординарный массив, навроде 3, 1, 0, 2 )
с -O2 тоже, ну это так на всякий случай, вдруг кто возмутится "вот опять ваше О3 код поломало"

Alexey
17.10.2018
09:29:22
а почему с -O2 размер 2 становится? что за оптимизация?

Spoonson
17.10.2018
09:29:38
потому что p не используется, значит его можно удалить

Yarique
17.10.2018
09:29:51

Alexey
17.10.2018
09:30:18
ну значит тогда можно переписать так чтобы использовалась ))

Anatoly
17.10.2018
09:30:43

Spoonson
17.10.2018
09:30:44
он ее тогда местами переставить может с массивом
нет гарантии что они будут на стеке в том же порядке, да и вообще понятия стека то в стандарте кажется вообще нет

A.D.
17.10.2018
09:31:35
ну, вариант с UB гуглится, раз уж мы начали постить решения:
https://wandbox.org/permlink/q3QjmJrhwGF4vQOA

Spoonson
17.10.2018
09:32:23

Anatoly
17.10.2018
09:32:36

A.D.
17.10.2018
09:32:54

Anatoly
17.10.2018
09:33:16

Alexey
17.10.2018
09:34:08

Google

Anatoly
17.10.2018
09:34:23

Spoonson
17.10.2018
09:34:28
было что-то в стандарте по поводу элемента на 1 дальше крайнего в массиве, что с его адресом можно оперировать