Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.69/29: Рейтинг темы: голосов - 29, средняя оценка - 4.69
12 / 10 / 0
Регистрация: 01.07.2013
Сообщений: 62

Безымянный аргумент функции

03.07.2013, 12:48. Показов 7276. Ответов 51
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
функция принимает аргумент, но у него нет имени

C++
1
2
3
4
5
6
7
8
9
10
11
void f(int)
{
    cout << "Hello world!";
}
 
int main()
{
    int n = 10;
    f(n);
    return 0;
}
Добавлено через 13 минут
...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.07.2013, 12:48
Ответы с готовыми решениями:

Вычислить значение функции аргумент которой вычисляется из другой кусочно заданной функции
Решите программу то я не знаю как:hysteric: Вычислить значение y в зависимости от выбранной функции \varphi (x), аргумент которой...

Беззнаковый аргумент функции
Всем привет. Есть вопрос по уточнению типа аргументов функций. К примеру, есть функция: unsigned long int factorial(unsigned int x)...

Не читается аргумент функции
void recursReverse(char* str, size_t len) { static size_t len2 = len; while (len2 &gt; 1) { std::swap(*str, *(str + len2 - 1)...

51
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
04.07.2013, 19:20
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от ValeryS Посмотреть сообщение
Вот вам еще одно баловство
доступ к приватной переменной
Я не уверен точно, но, думаю, стандарт никак не гарантирует, что компилятор не перемешает блоки public и private частей и расположит поля именно в том порядке, в котором они записаны в исходнике

Цитата Сообщение от Герц Посмотреть сообщение
На Mac OS X, например, я не нашел такого смещения, которое дало бы адрес неименованного аргумента. Пробовал от -512 байт до 512
Потому что параметр лежал на регистре, а не в стеке

Цитата Сообщение от Tulosba Посмотреть сообщение
так ищется оно просто
Когда ты берёшь указатель на параметр "a", то компилятор в принудительном порядке откачает его с регистра в стек. Так что ты в памяти по сути дела находишь копию параметра, а не истинный параметр, т.к. истинный параметр мог быть на регистре. В случае безымянного параметра ты взять адрес на него не сможешь, а потому с регистра в стек его никто не переложит
1
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
04.07.2013, 19:26
Цитата Сообщение от Evg Посмотреть сообщение
Я не уверен точно, но, думаю, стандарт никак не гарантирует,
про стандарт не знаю, как то не было задачи не интересовался
но эмпирическим путем замечено, что в памяти переменные лежат в том порядке в каком объявили
компиляторы Борланд, Визуал
это так, опыт дизасемблирования
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
04.07.2013, 19:30
Цитата Сообщение от Evg Посмотреть сообщение
Когда ты берёшь указатель на параметр "a", то компилятор в принудительном порядке откачает его с регистра в стек. Так что ты в памяти по сути дела находишь копию параметра, а не истинный параметр, т.к. истинный параметр мог быть на регистре. В случае безымянного параметра ты взять адрес на него не сможешь, а потому с регистра в стек его никто не переложит
Бред. Указатель должен указывать непосредственно на сущность, иначе это не указатель на неё, такое поведение неизбежно запрещено стандартом. Регистр может быть временным местом хранения данного, в том числе параметра, на время вычисления с ним, или перед помещением в стек, но потом всякое имеющее адрес данное будет сохранено в оперативу. Получается, что само звятие адреса запрещает передачу через параметр, но для анонима такой подход не возможен и запретить можно только явным выбором соглашения о вызове.
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
04.07.2013, 20:36
Я не уверен точно, но, думаю, стандарт никак не гарантирует, что компилятор не перемешает блоки public и private частей и расположит поля именно в том порядке, в котором они записаны в исходнике
Именно так (9.2 item 13 ISO C++):
The order of allocation of non-static data
members with different access control is unspecified (Clause 11).
Однако для Standard-Layout классов как в примере все именно так.
0
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
04.07.2013, 20:49
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Причинами того, что, случается, в вызове функции стоит большее число параметров, чем на самом деле функция использует.
Если я правильно понял, то вот:
Предположим, что ты написал функцию MyFunc (int a, int b, int С). В ходе долгих переработок и уточнений ты понял, что переменную С мало смысла использовать, но твоей функцией уже пользуются люди и, чтобы не потерять функционал кода этих людей, ты пишешь MyFunc (int a, int b, int), чтобы поддержать использование твоей функции старой версии. Тем самым ты просто не используешь последнюю переменную.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.07.2013, 21:41
Цитата Сообщение от Evg Посмотреть сообщение
Так что ты в памяти по сути дела находишь копию параметра, а не истинный параметр, т.к. истинный параметр мог быть на регистре.
Т.е. соглашение вызова (cdecl в данном случае) как бы не причем, по-Вашему?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
04.07.2013, 23:09
Цитата Сообщение от Tulosba Посмотреть сообщение
Т.е. соглашение вызова (cdecl в данном случае) как бы не причем, по-Вашему?
Согласно соглашению параметр приходит на таком-то регистре или стеке, но потом компилятор вправе переложить это значение в другое место. Со стека на стек перекладывать смысла нет. А вот с регистра на стек перекладывают.

Если я правильно понимаю, то cdecl означает, что все параметры будут через стеке. Так что конкретно в этом случае ты прав. Но на 100% гарантировать нельзя, т.к. компилятор в теории может переложить в другое место стека (ну захотелось так ему, в отладочных целях)
0
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
05.07.2013, 05:18
Цитата Сообщение от Tulosba Посмотреть сообщение
условную компиляцию никто не отменял. #ifdef в руки и вперед
ну это понятно. не совсем понятно только как это прикрутить.
Цитата Сообщение от Evg Посмотреть сообщение
Что конкретно ты подразумеваешь под "веткой"?
допустим у меня есть два компилятора и один исходник, в который я уже не могу вносить изменения.

C++
1
2
3
4
5
6
7
8
#define ???
 
#ifdef COMPILER1
//... код1
#endif
#ifdef COMPILER2
//... код2
#endif
осознает ли компилятор сам себя каким-либо образом?) как каждому из двух дать понять какая ему предназначена ветка кода
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
05.07.2013, 07:49
Цитата Сообщение от Evg Посмотреть сообщение
Но на 100% гарантировать нельзя, т.к. компилятор в теории может переложить в другое место стека
Предлагаю еще раз обратить внимание на сообщение #15.

Цитата Сообщение от AntonChik Посмотреть сообщение
как каждому из двух дать понять какая ему предназначена ветка кода
Вот тут можно кое-что почерпнуть.
1
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
05.07.2013, 08:01
Цитата Сообщение от Tulosba Посмотреть сообщение
Т.е. соглашение вызова (cdecl в данном случае) как бы не причем, по-Вашему?
А где в исходнике хоть слово про cdecl?

Добавлено через 1 минуту
Цитата Сообщение от Evg Посмотреть сообщение
Согласно соглашению параметр приходит на таком-то регистре или стеке,
cdecl[править]
Основной способ вызова для Си (отсюда название, сокращение от «c-declaration»). Аргументы передаются через стек, справа налево. Очистку стека производит вызывающая программа. Это основной способ вызова функций с переменным числом аргументов (например, printf(…))
О регистре ни слова. Передача и через стек, и через регистры - это fastcall.
fastcall[править]
Передача параметров через регистры, обычно самая быстрая; если все параметры и промежуточные результаты умещаются в регистрах, манипуляции со стеком вообще не нужны.
Fastcall не стандартизирован, поэтому используется только в функциях, которые программа не экспортирует наружу и не импортирует извне.
В компиляторе Borland, для соглашения __fastcall, называемого также register,[1] параметры передаются слева направо в eax, edx, ecx и, если параметров больше трёх, в стеке, также слева направо. Указатель стека на исходное значение возвращает вызываемая подпрограмма.
Fastcall Borland применяется по умолчанию в Delphi.
Соглашение __fastcall Microsoft, также называемое __msfastcall, в 32-хразрядной версии компилятора Microsoft,[2] а также компилятора GCC,[3] определяет передачу первых двух параметров слева направо в ecx и edx, а остальные параметры передаются справа налево в стеке. Очистку стека производит вызываемая подпрограмма.
Для x64 целей компилятор Microsoft VisualStudio 2010 CL принимает данное соглашение по умолчанию, остальные игнорируются, даже если заданы явно. Передача параметров в данном случае происходит при помощи 4х 64х разрядных регистра: rcx, rdx, r8, r9. В случае если параметров больше — остальные передаются через стек.
. В случае одного целого fascall гарантирует передачу через регистр, но только если не параметру не нужен адрес.

Добавлено через 57 секунд
Кстати, очень подозреваю, что здесь неявный fascall.

Добавлено через 3 минуты
Цитата Сообщение от Evg Посмотреть сообщение
Это не хак, а $рань господня, которая будет работать исключительно на твоём компиляторе, т.к. твой "хак" ты подогнал под поведение конкретно своего компилятора
Грязный хак как раз и должен быть не переносимым и подгоняться под конкретное сочетание компилятора, IDE, целевой опеационки и целевого "железа".
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
05.07.2013, 08:04
Цитата Сообщение от taras atavin Посмотреть сообщение
А где в исходнике хоть слово про cdecl?
Было указание на VS2012. Предлагаю собрать консольный проект и убедиться, что там cdecl.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
05.07.2013, 14:45
AntonChik, см. Есть ли стандартные значения для препроцессора для разных операционных систем?

Цитата Сообщение от Tulosba Посмотреть сообщение
Предлагаю еще раз обратить внимание на сообщение #15
Ещё раз повторюсь, что нормальных способов нет. Всякие читерские приёмы, которые работают в рамках одного компилятора мне ни разу не интересно обсуждать, т.к. ответ на них будет примерно такой, что залезь в отладчик и посмотри на то место, где по программным соглашениям должен лежать параметр
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.07.2013, 14:45

Непонятный аргумент функции
Кто-нибудь может подсказать, что принимает такая функция в качестве аргумента? void foo(int (**i)(double)) { ..... }

Передача функции в аргумент
Есть три функции: void MainMenu(); void MainMenu_MilkMenu(); bool ErrorMenu(void (*pf)()); Все прототипы находятся в...

Класс как аргумент функции
Доброго времени суток:) Набрёл на такой пример в openGL и не могу понять как он робит, подскажите. Вот описание ф-ции: void...

Не правильно передаю аргумент функции
Как такое возможно? printf(&quot;V0=%d\n&quot;,vectorSize(&amp;vector)); vectorPop(&amp;vector,i); void vectorPop(const Vector *v,...

Локальные переменные в функции и её аргумент
Привет! Пишу функцию перевода десятичного числа в текст (не обсуждайте зачем и правильно ли я делаю) Суть такова, начало функции: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
52
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru