0 / 0 / 0
Регистрация: 28.10.2018
Сообщений: 4
|
|||||||||||
1 | |||||||||||
Функции с переменным количеством параметров30.06.2021, 14:00. Показов 2689. Ответов 19
Метки нет (Все метки)
Почему не работает следующий код (gcc 9.3.0; Ubuntu 20.04):
А так работает:
0
|
30.06.2021, 14:00 | |
Ответы с готовыми решениями:
19
Написание функции с переменным количеством параметров Возвращение массива в функции с переменным количеством параметров Функция с переменным количеством параметров Функция с переменным количеством параметров |
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
30.06.2021, 14:29 | 3 |
Потому что он неверный.
Так делать нельзя. Язык не дает никаких гарантий, что такой хак будет работать. А этот код верный. Так делать правильно.
0
|
Злостный нарушитель
9547 / 5176 / 1182
Регистрация: 12.03.2015
Сообщений: 24,445
|
|
30.06.2021, 14:34 | 4 |
Ну зря ты так, чувак просто хочет знать, как этот механизм работает.
Мне, кстати, тоже интересно. Короче, переменные параметры компайлер пихает в размер указателя (для 64 битного компайлера это 8 байт). Я этого не знал. Прибил гвоздями везде 8-байтные типы данных и заработало. Канешна, лучше так не делать. Особенно когда пишешь чонить кроссплатформенное. Эти макросы (va_xxx()) не просто так придумали.
1
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|||||||||||
30.06.2021, 14:59 | 5 | ||||||||||
Сообщение было отмечено _dalex как решение
Решение
Так это и не так нифига.
Вообще не так. Если у человека вопрос по конкретной реализации, то начинать надо с того, что озвучить платформу и версию компилятора. Тебе бы это тоже не помешало сделать, т.к. сейчас ты просто наделал ложных выводов из частной ситуации. На 64-битной платформе первые аргументы вообще могут передаваться НЕ через стек, как например происходит здесь:
Полный пример здесь: https://godbolt.org/z/faa1jexMb
1
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
30.06.2021, 15:05 | 7 |
На 64-битной платформе вообще нет никаких calling convention (кроме основной, которая работает по умолчанию), если ты думаешь, что это как-то повлияет
Добавлено через 48 секунд Verevkin, так ты напишешь название платформы и версию своего инструментария, или нет?
0
|
DrOffset
|
30.06.2021, 15:21
#9
|
Не по теме: Verevkin, автор отметил ответ, поздравляю, уши еще одного новичка успешно завешаны лапшой :)
0
|
Злостный нарушитель
9547 / 5176 / 1182
Регистрация: 12.03.2015
Сообщений: 24,445
|
|
30.06.2021, 15:28 | 10 |
Я просто высказал свою точку зрения. Она, чо, не имеет права быть неправильной? На чём я, кстати, и не настаиваю.
Если тебе это не нравится, напиши свою. У нас тут цензура есть, но плюрализм мнений никто не запретил (пока). Для частного случая так себе обсуждение...
0
|
DrOffset
|
30.06.2021, 15:35
#11
|
Не по теме: Verevkin, мне скорее не нравится реакция автора.
0
|
0 / 0 / 0
Регистрация: 28.10.2018
Сообщений: 4
|
||||||
30.06.2021, 15:35 [ТС] | 12 | |||||
Ubuntu 20.04 (64bit) gcc 9.3.0
и так не работает:
0
|
Злостный нарушитель
9547 / 5176 / 1182
Регистрация: 12.03.2015
Сообщений: 24,445
|
|
30.06.2021, 15:44 | 13 |
Ну это ж неправда, я такого не говорил. И рассматривал только конкретный частный случай с тем компилятором, который у меня есть.
Ты не смотри, чо тебе на консоль вываливается. Смотри в дебаггере значения и память по указателю. Иначе так можно в угадайку играть, пока солнце не погаснет.
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
30.06.2021, 15:56 | 14 |
Так я и не говорю, что это ты говорил.
Это псевдоцитата на то, как поставлен вопрос в теме. Он поставлен именно с таким акцентом.
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
30.06.2021, 16:13 | 16 |
Сообщение было отмечено _dalex как решение
Решение
Не работает.
Потому что (вот дали вы платформу и можно уже конкретно разговаривать), на Ubuntu действует System V ABI, который предполагает передачу первых аргументов функции в регистрах. Т.е. прогуляться по регистрам, как по стеку через указатели не получится никак. Еще более конкретно, идете вот в этот документ https://uclibc.org/docs/psABI-x86_64.pdf И читаете параграфы 3.5.7 Variable Argument Lists и A.2.1 Calling Convention, там есть абсолютно все про вашу конкретную ситуацию. Добавлено через 7 минут
2
|
0 / 0 / 0
Регистрация: 28.10.2018
Сообщений: 4
|
|
30.06.2021, 16:37 [ТС] | 17 |
Ok. Спасибо. Теперь понятно! Когда у меня не получилось, пройтись по стеку, я подумал, что здесь параметры передаются не через стек, а в книге по которой я учу Си, про передачу параметров функции через регистры процессора ни чего не сказано. Еще раз большое спасибо за разъяснение.
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
30.06.2021, 17:10 | 18 |
0
|
0 / 0 / 0
Регистрация: 28.10.2018
Сообщений: 4
|
|
30.06.2021, 17:18 [ТС] | 19 |
Нет, там как раз второй вариант описывается с использованием stdarg.h, а первый это мое поделие думал можно просто брать параметры из стека зная из количество и типы.
0
|
Вездепух
12785 / 6663 / 1794
Регистрация: 18.10.2014
Сообщений: 16,854
|
|
30.06.2021, 22:23 | 20 |
А почему он вдруг должен работать? Очередная чушь с попыткой доступа к переменным параметрам без использования
<stdarg.h> .
0
|
30.06.2021, 22:23 | |
30.06.2021, 22:23 | |
Помогаю со студенческими работами здесь
20
Функция с переменным количеством параметров Написать функцию с переменным количеством параметров Разработать функцию с переменным количеством параметров Разработать функцию с переменным количеством параметров Разработать функцию с переменным количеством параметров Не получается создать функцию с переменным количеством параметров Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |