__________________
http://www.moddb.com/mods/monorail-quest
Отправлено XaeroX 10-03-2019 в 13:05:
Я не знаю способа так сделать. Если узнаешь - напиши.
Но вообще говоря, если ты хочешь передавать аргументы в функцию как массив, то и надо передавать массив, можно даже compile time (std::array).
Идея вариативных шаблонов в том, чтобы поддерживать произвольное число аргументов у функции, а у тебя число аргументов фиксированное.
__________________
Отправлено ~ X ~ 11-03-2019 в 09:20:
thambs here, I googled that for you https://embeddedartistry.com/blog/2...unctions-c-vs-c
может, там найдутся варианты.
Добавлено 11-03-2019 в 12:20:
https://stackoverflow.com/questions...c-function-in-c
в ответах нашлись вроде.
__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]
Отправлено XaeroX 11-03-2019 в 15:35:
~ X ~ стесняюсь спросить, а по каким именно ключевым словам ты гуглил? Вроде бы это вообще не по теме.
__________________
Отправлено ~ X ~ 11-03-2019 в 18:38:
Тебе зайцев не жалко? И постыдился, и спросил 
А я, похоже, не понял его вопроса.
__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]
Отправлено Дядя Миша 14-03-2019 в 21:55:
Зачем битовые сдвиги оформляют в табличку? Неужели такой подход даёт хоть какой-то выигрыш в производительности? В качестве примера вальвовский bistream buffer.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено thambs 27-03-2019 в 21:58:
А вот поясните мне, что-то я совсем запутался с тем как c++ осуществляет неявное преобразование типов.
C++ Source Code:
3 | typedef std::complex<float> cfloat; |
4 | int main(int argc, char **argv){ |
5 | int i,n; constexpr cfloat _coeff(0, (-4)*atan2(1,1)); |
6 | cfloat x = exp(_coeff * cfloat(i)/cfloat(n)); //fine |
7 | cfloat y = exp(_coeff * i/cfloat(n)); //fail |
Собственно, почему в этом выражении не происходит неявного приведения типов, в чём дело?__________________
http://www.moddb.com/mods/monorail-quest
Отправлено nemyax 27-03-2019 в 22:29:
Ну а слеш перегружен для такой пары типов?
Отправлено nemyax 21-08-2019 в 15:44:
Не знаю даже, с чего начать свой нубский вопрос. Столкнулся с порчей памяти, которую никак не могу отдебажить. Проявляется в FLTK-поделке при повторении операций undo-redo, реализованных через перезапись структов их сохранёнными состояниями (сейчас через приведение, но через мемкпю тоже делал, разницы нету). Поправил все невысвобождения, какие смог найти, проверил аллоцируемые размеры. В результате под линуксом уже не валится, но под вендой продолжает. Самое интересное, данные в слепках структов верные, и анду-реду даёт ожидаемые результаты. Но на какой-то по счёту тудымсюдым (причём это число воспроизводимое) память оказывается перепаханной.
Когда у вас, опытные товарищи, начинается чертовщина с порчей памяти, где кроме аллокации-высвобождения вы ищете её причины?
Отправлено XaeroX 21-08-2019 в 16:51:
nemyax
У нас кастомные аллокаторы с сентинелями.
Кажется, в CRT дебажный аллокатор тоже умеет проверять на предмет порчи, но я им не пользовался.
Проверь все массивы, нет ли выхода за границу.
Если порча у класс-мембера, проверь, нет ли перезаписи за пределы другого класс-мембера.
Попробуй комментировать memcpy и смотреть, пропадает ли баг.
Цитата:
nemyax писал:
причём это число воспроизводимое
Ну это вообще самый идеальный и лёгкий для дебага вариант.__________________
Отправлено nemyax 21-08-2019 в 17:10:
Цитата:
XaeroX писал:
Проверь все массивы, нет ли выхода за границу.
Попроверяю ещё, конечно. Но кабут всё укладывается в выделенные размеры на куче. А если выясняется, что размер данных малый, то и вовсе обхожусь массивом на стеке без кучы.
Цитата:
XaeroX писал:
У нас кастомные аллокаторы с сентинелями.
Не на асме же вы их пишете. Небось оборачиваете стандартные средства под конкретную задачу.
Насколько вообще надёжно перетирать структы, хранящие указатели?
Отправлено XaeroX 21-08-2019 в 17:53:
Цитата:
nemyax писал:
Насколько вообще надёжно перетирать структы, хранящие указатели?
Ты бы код показал, что ли, а то сеанс телепатической связи отнимает очень много энергии.__________________
Отправлено nemyax 21-08-2019 в 18:32:
Структы такого рода:
C++ Source Code:
19 | union {float xyz[3]; vec3 coords;}; |
49 | char state1[Undo_slot_size]; |
50 | char state2[Undo_slot_size]; |
51 | undo_chunk *smaller; // in terms of memory address |
52 | undo_chunk *greater; // in terms of memory address |
Перезапись состояний в таком духе:
C++ Source Code:
1 | void history::change_state(undo_buffer *b, void (*fun)(undo_chunk*)) |
4 | int count = bak->count; |
5 | if (bak->root == NULL) {return;} |
6 | undo_chunk **stack = NULL; |
9 | undo_chunk *s[Small_tree]; |
10 | stack = (undo_chunk**)s; |
12 | else {stack = (undo_chunk**)malloc(sizeof(undo_chunk*) * count);} |
14 | undo_chunk *ch = bak->root; |
22 | if (gr != NULL) {stack[pos++] = gr;} |
23 | if (sm != NULL) {stack[pos++] = sm;} |
27 | if (!Is_small(count)) {free(stack);} |
Отправлено XaeroX 21-08-2019 в 18:36:
Ух... кондовый такой си. 
Ты указатели чтоли сохраняешь, а не сами данные? Оно так разве будет работать?
__________________
Отправлено nemyax 21-08-2019 в 18:42:
Вот я и говорю, под линуксом просто работает. Под вендой (компилятор vc9) тоже работает, но начинается наркомания после энного повторения.
Отправлено Дядя Миша 21-08-2019 в 18:58:
Цитата:
nemyax писал:
Когда у вас, опытные товарищи, начинается чертовщина с порчей памяти, где кроме аллокации-высвобождения вы ищете её причины?
Странная постановка вопроса. Ни аллокация ни высвобождение память не портят. Очевидно она портится во время использования. А высвобождение просто фиксирует этот факт. Ну это как ключи потерять где угодно, а искать возле фонаря, потому что там светлее.
Добавлено 21-08-2019 в 21:58:
Поглядел код. Если уж сохранять что-то с указателями, то логично кусок памяти выделять так чтобы в него попала структура + то что мы хотели сохранить. И тада уже можно с этим иметь дело. И не использовать явные указатели, а что-то типа (struct + 1). Ну это так, к слову.
Тут помойму проблема в самой задумке. Это вообще не будет нормально работать.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено nemyax 21-08-2019 в 19:07:
Хорошо, скажем иначе: где кроме ошибочных аллокации-освобождения?
Добавлено 21-08-2019 в 22:07:
Цитата:
Дядя Миша писал:
Это вообще не будет нормально работать
Почему? Что может заставить систему похерить выделенные данные с того места, где она их выделила?
Отправлено Дядя Миша 21-08-2019 в 19:42:
Систему - ничего. Ты сам там что-то херишь, но скорее всего просто не понимаешь этого. Это самый частый сценарий. Ты думаешь что всё в порядке, а сам что-то портишь. Я за все годы программирования один единственный раз столкнулся, когда мне система в штаны насрала - тот известный случай, когда в libc и msvcrt разная реализация atof. А всё остальное - это уже сам себе.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено nemyax 21-08-2019 в 19:48:
Цитата:
Дядя Миша писал:
Ты сам там что-то херишь, но скорее всего просто не понимаешь этого. Это самый частый сценарий.
Вот и я о чём. Система ведь единожды выделив память сама собой не переместит её содержимое. По крайней мере мы на это рассчитываем, когда пользуемся языком без сборщика мусора. Она даже течку допустит, но занятое место не тронет. Ну по идее.
Отправлено Дядя Миша 21-08-2019 в 19:58:
Во-во, я ж и говорю что ты не о том думаешь. У тебя там что-то с указателями, скорее всего. Память-то на старом месте, а вот на что указатели указывают, это другое дело.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено nemyax 21-08-2019 в 20:18:
То, что я где-то написал фигню, не означает, что общая задумка работать не будет в принципе.
Меня плющит, что коллапс созревает постепенно к четвёртому-пятому анду-реду и только при использовании компилятора микрософта.
Отправлено Дядя Миша 21-08-2019 в 21:39:
Компилятор тут точно непричём. Значит где-то посадил UB. Накопительный баг. Надо там хотя бы алертов понтаыкать и посмотреть чо происходит.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено nemyax 26-08-2019 в 18:23:
Всё-таки нашёл одну течку. Заткнул, и порча снята.
Отправлено nemyax 23-09-2019 в 22:32:
Микрософт опубликовал свой STL под лицензией Apache: https://devblogs.microsoft.com/cppb...cing-msvcs-stl/
Добавлено 24-09-2019 в 01:32:
На ЛОРе профессионалы наорудовали, что там не только STL, но и либстдц++ как таковой. Не знаю, правда ли.
Отправлено Дядя Миша 24-09-2019 в 06:08:
STL это вообще удивительная вещь. Её сделал наш, а гордость почему-то никто не испытывает. Подозрительно.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено XaeroX 24-09-2019 в 07:07:
Дядя Миша
Ну потому что он не совсем наш. Вернее, совсем не наш. Наш - это сам знаешь что, на букву К.
__________________
Отправлено thambs 15-10-2019 в 14:06:
Вот ещё вопрос возник про vardic templates.
Например, если мне нужна функция переменной арности от однотипных аргументов, то я могу записать
C++ Source Code:
1 | template<typename ...ids> |
2 | void foo (const ids&... args){ |
3 | for(auto& arg: {args...}){ |
А можно ли эту конструкцию как-то специализировать для конкретного нетривиального типа под многоточием? Например, я хочу передавать в функцию, пускай, tuple<int,char*,float> — можно-ли написать это в единой конструкции, без привлечения прокси-шаблонов?__________________
http://www.moddb.com/mods/monorail-quest
Отправлено Дядя Миша 15-10-2019 в 14:17:
О! Шаблоны позволяют var args? Хотя в шестёрке небось не сработает.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено thambs 30-11-2019 в 01:44:
А может кто ни будь пояснить, почему ptr не изменяется в результате?
C++ Source Code:
1 | /* relink data <- ptr */ |
5 | ptr = self.data + self.offset[0]; |
6 | printf("relink %p -> %p\n", self.data, ptr); |
Вызывается, например:
C++ Source Code:
А в результате:
C++ Source Code:
relink (nil) -> 0x445c0000 |
При этом, если возвращать изменённый указатель из функции, то он снаружи нормально присваивается безо всяких проблем. В чём тут дело?
Добавлено 30-11-2019 в 04:44:
ps: или я идиот, или одно из двух...__________________
http://www.moddb.com/mods/monorail-quest
Отправлено XaeroX 30-11-2019 в 01:51:
thambs
Потому что ты передаёшь указатель по значению, а не по указателю.
Функция должна иметь сигнатуру
C++ Source Code:
со всеми вытекающими модификациями.__________________
Отправлено thambs 30-11-2019 в 02:01:
XaeroX
Посыпаю голову пеплом, я точно идиот — слона не углядел.
Вот так, можно
C++ Source Code:
__________________
http://www.moddb.com/mods/monorail-quest
Отправлено XaeroX 30-11-2019 в 02:44:
Цитата:
thambs писал:
Вот так, можно
Так, безусловно, тоже можно, но выглядит менее красиво, и сложнее для пони-мания.__________________
Отправлено thambs 30-11-2019 в 03:00:
XaeroX
По-моему лучше, так rvalue туда не пропихнёшь.
__________________
http://www.moddb.com/mods/monorail-quest