@ProCxx

Страница 2442 из 2477
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. Если что, то с минимальными правками и усилиями сишный код можно будет сбилдить С++ компилятором?

Igor
17.10.2018
07:21:58
int a[] = {1, 2, 3}; вычисли размер массива, используя указатели
что-то я почитал ваше обсуждение и вконец запутался представленной в этом посте информации достаточно для нахождения размера? предполагается что массив не нужно заворачивать в структуры, и объявлять перед-после переменные?

Ilia
17.10.2018
07:25:13
что-то я почитал ваше обсуждение и вконец запутался представленной в этом посте информации достаточно для нахождения размера? предполагается что массив не нужно заворачивать в структуры, и объявлять перед-после переменные?
Я вот тоже в недоумении... Можно просто вычесть адрес первого члена из адреса последнего, но это алгебраически сводится к указанию в вычислении размера константой. Я конечно могу последний элемент найти кодом , по его значению. Но не понятно, можно ли использовать код (цикл).

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);

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

Google
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
адрес разве не один и тот же? data и &data
ага вот это слегка подорвало всем шаблон почему-то

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

Евгений
17.10.2018
08:30:30
адрес один и тот же
Ага, было бы странно, если бы каждый & перед переменной давал новый адрес)

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

Но именно пока у тебя, опять таки, тип с размером приехал.
в смысле что тип — не гццшное struct S { int a[0]; } ?

Дмитрий
17.10.2018
08:33:56
в смысле что тип — не гццшное struct S { int a[0]; } ?
И не деградировавший int[] или int*

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
https://cmake.org/cmake/help/v3.13/prop_tgt/VS_DOTNET_TARGET_FRAMEWORK_VERSION.html
так не получается, делаю set(VS_DOTNET_TARGET_FRAMEWORK_VERSION v4.5), но он все равно ставит версию 4.0

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

Anatoly
17.10.2018
08:45:36
в том плане что gcc плюётся предупреждением "у вас тут &s, а вы передаете char(*)[30] вместо char*" ?
они умеют вычислять правильное положение в стеке параметра являющегося ссылкой, но это попрежнему UB

Google
Konstantin
17.10.2018
08:50:35
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
В примере выше int& - это же указанный явно параметр, не переданный через ...? Так в чём проблема?
раньше va_start был реализован через взятие адреса, а когда ты берешь адрес у ссылки, то получаешь не текущий стекфрейм, а тот, где размещена реальная переменная, использованная при инициализации ссылки. вроде бы это очевидно. нет?

А сча как?
в реализации 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
Не очевидно, почему это касается явного аргумента. Я бы понял, если бы функция была foo(...), и в неё передавалась ссылка, но здесь же не так
последний аргумент до эллипсиса - это твой якорь, благодаря которому ты определяешь стекфрейм, в который положены параметры, после обязательного параметра.

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

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

Alex
17.10.2018
09:07:25
Понял

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

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
а почему с -O2 размер 2 становится? что за оптимизация?
Переменная не используется, вот и компилятор выкинул её

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

Anatoly
17.10.2018
09:30:43
ну значит тогда можно переписать так чтобы использовалась ))
только в стеке между arr и p может быть куча мусора, так что не знаю, что мы обсуждаем

Spoonson
17.10.2018
09:30:44
он ее тогда местами переставить может с массивом

нет гарантии что они будут на стеке в том же порядке, да и вообще понятия стека то в стандарте кажется вообще нет

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

Anatoly
17.10.2018
09:32:36
ну, вариант с UB гуглится, раз уж мы начали постить решения: https://wandbox.org/permlink/q3QjmJrhwGF4vQOA
вот хороший вопрос, UB в данном случае имеет ли негативные последствия?

A.D.
17.10.2018
09:32:54
а почему это UB?
ну, мол, разыменование адреса, по которому ничего нет.

Anatoly
17.10.2018
09:33:16
ну, мол, разыменование адреса, по которому ничего нет.
мы разыменовываем его, чтобы сразу получить адрес на его первый элемент, то есть, компилятор это делает без разыменования как такового

Alexey
17.10.2018
09:34:08
только в стеке между arr и p может быть куча мусора, так что не знаю, что мы обсуждаем
как тогда например msvc в дебаг билде проверки на переполнения стека делает? разве не какими-то magic значениями заполняет память и проверяет, на месте ли они?)

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

Страница 2442 из 2477