|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
19.09.2016, 15:41 | #11 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
20.12.2016, 11:36 | #12 |
Пользователь
Регистрация: 13.09.2016
Сообщений: 16
|
Есть функция, которая принимает массив строк (указателей на строки) переменной длины. Признак конца - нулевой указатель. Макросы va_arg не использую в академических целях - хочу глубже понять механизм передачи параметров и работать с параметрами непосредственно.
Код:
|
20.12.2016, 11:41 | #13 | |
Вредный кошак
Участник клуба
Регистрация: 14.10.2012
Сообщений: 1,159
|
Цитата:
|
|
20.12.2016, 12:07 | #14 |
Пользователь
Регистрация: 13.09.2016
Сообщений: 16
|
Вполне даже предсказуем. Благодаря тому, что решил копнуть поглубже как оно происходит, а не слепо скопировать конструкции va_list и т. д. я понял как формируется кадр стека, какие параметры и как фактически передаются при вызове функции. В каком случае мы получаем segfault при работе с такими функциями, а в каких случаях можно безопасно работать с параметрами. Само собой, для вызова такой функции лучше использовать макрос, который добавляет 0 последним параметром, чтобы избежать потенциальных ошибок при вызове подобной функции (макросы va_arg от таких ошибок тоже не страхуют).
|
20.12.2016, 12:18 | #15 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,330
|
|
20.12.2016, 12:43 | #16 | |
Пользователь
Регистрация: 13.09.2016
Сообщений: 16
|
Цитата:
Еще раз подчеркну - пример академический. Я полностью отдаю себе отчёт в том, что в коммерческом коде такие велосипеды недопустимы. |
|
20.12.2016, 14:22 | #17 | |
Вредный кошак
Участник клуба
Регистрация: 14.10.2012
Сообщений: 1,159
|
Цитата:
Как раз те самые макросы и призваны обеспечить правильность операций. Что касается кастов, то что-то у Вас не так с ними. Зачем Вы кастите к uintptr_t*, а затем обратно к WCHAR*? Последний раз редактировалось Croessmah; 20.12.2016 в 14:32. |
|
20.12.2016, 14:32 | #18 |
Вредный кошак
Участник клуба
Регистрация: 14.10.2012
Сообщений: 1,159
|
Код:
Но если собрать другим компилятором, то оно может и не заработать. Например, сейчас попробовал с MinGW. С опцией -O1 работает, с опцией -O2 - нет. VC не имею, но может и там будет зависеть от опций. Последний раз редактировалось Croessmah; 20.12.2016 в 14:47. |
20.12.2016, 14:45 | #19 |
Вредный кошак
Участник клуба
Регистрация: 14.10.2012
Сообщений: 1,159
|
Проверил приведенный Вами код.
Работает и на MinGW, но если MessageBox поменять на wprintf, то оно перестает работать в MinGW уже с опцией -O2. Так что Вы там говорили о предсказуемости? Последний раз редактировалось Croessmah; 20.12.2016 в 14:48. |
20.12.2016, 15:35 | #20 | |
Пользователь
Регистрация: 13.09.2016
Сообщений: 16
|
Потому что, хоть и первоначальный код:
Код:
Цитата:
Гениально! Вот та конструкция, до которой я самостоятельно не додумался, и начал придумывать вариант с указателем на массив параметров и кастами, а затем создал эту тему. Это то, что я хотел. Большое спасибо! Признаюсь, видел эту конструкцию уже в какой-то книге, но одно дело когда читаешь, всё кажется очевидным и понятным, другое - когда садишься кодить. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
первые шаги в андройде | Виталий.Ч . | Помощь студентам | 2 | 11.03.2016 16:19 |
Первые шаги к свободе | 13th | Свободное общение | 15 | 19.01.2012 00:58 |
Первые шаги в QBasic | teeshka2 | Помощь студентам | 2 | 23.08.2010 14:47 |
первые шаги в с++ | ploik | Общие вопросы C/C++ | 2 | 16.07.2010 23:35 |
Первые шаги | trave1er | Общие вопросы C/C++ | 2 | 10.09.2008 20:32 |