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

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

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

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

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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.07.2013, 12:48
Ответы с готовыми решениями:

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

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

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

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

51
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
03.07.2013, 13:10 2
Цитата Сообщение от 120° Посмотреть сообщение
но у него нет имени
ну так она же его и не использует просто не именованный параметр к которому так же можно "достучаться"
2
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
03.07.2013, 13:13 3
Цитата Сообщение от Croessmah Посмотреть сообщение
ну так она же его и не использует
Это-то да.
C++
1
2
3
4
5
6
7
8
9
10
11
void f(int)
{
    cout << "Hello world!";
}
 
int main()
{
    //int n = 10;
    f(NULL);
    return 0;
}
Но нельзя ли каким-либо образом получить из функции переданное таким образом в нее значение?
2
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
03.07.2013, 13:13 4
Цитата Сообщение от Croessmah Посмотреть сообщение
к которому так же можно "достучаться"
как?
на уровне ассемблера представляю
а штатными средствами языка нет
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
03.07.2013, 23:23 5
ValeryS, например такой хак http://ideone.com/kJqD9A
1
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
03.07.2013, 23:37 6
Цитата Сообщение от Tulosba Посмотреть сообщение
например такой хак
посмотрел
именно хак, для работы его нужен размер int 4 байта и параметры через стек
примерно 32 битная винда, может Линукс
за Мак не уверен тем более за какие нибудь микроконтроллеры
кстати я это и называю уровень ассемблера
когда ты знаешь как устроен стек, как передаются параметры, т.е много чего "железного"
что на уровне прикладника не всегда известно
например как передать из значение из функции в функцию
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int fnc1()
{
int a=90;
return a;
}
int fnc2()
{
int b;
return b;
}
 
.........
fnc1();
int s=fnc2();
есть вероятность что в s будет 90 ( b ляжет на место a)
но гарантировать никто не может, оптимизатор может легко заменить
return a; на return 90
или вообще выкинуть эти функции
1
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
04.07.2013, 08:39 7
Цитата Сообщение от ValeryS Посмотреть сообщение
int 4 байта
32 битная винда
Не очень.
Название: 1111.JPG
Просмотров: 148

Размер: 15.7 Кб
1
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
04.07.2013, 08:53 8
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Не очень.
ну видишь ли если в дебиг режиме
про все компиляторы не знаю скажу про Visual C
в дебиг режиме он между аргументами и локальными переменными кладет "подушку безопасности" байт этак на 100
вот в нее видать ты и попал
1
12 / 10 / 0
Регистрация: 01.07.2013
Сообщений: 62
04.07.2013, 09:06  [ТС] 9
А как можно просмотреть память от начала функции? Я пытаюсь вот таким способом, но программа не компилится
C++
1
2
3
4
5
void f(int)
{
    for (int i = 0; i <= 20; ++i)
        std::cout << *(f+i) << std::endl;  // выражение должно представлять собой указатель на полный тип объекта
}
0
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
04.07.2013, 09:11 10
ValeryS, это напоминает мне как я по указателю размер массива вычислял.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
04.07.2013, 09:18 11
Цитата Сообщение от 120° Посмотреть сообщение
Я пытаюсь вот таким способом, но программа не компилится
ты пытаешься взять адрес функции ( самой реализации) а не данных
Цитата Сообщение от 120° Посмотреть сообщение
А как можно просмотреть память от начала функции?
ну можно попробовать так
C++
1
2
3
4
5
6
7
void f(int)
{
unsigned char b=0x55;
 
for (int i = -20; i <= 20; ++i)
 printf("%02x ",*(&a+i));
}
printf взял чтобы вывести нормально HEX значения у cout для char не выводит приходится к int приводить
не проверял так мысли вслух
1
12 / 10 / 0
Регистрация: 01.07.2013
Сообщений: 62
04.07.2013, 09:47  [ТС] 12
ValeryS, ваша программа не работает. что такое a в цикле? а я уже поспешил поставить вам плюсик

Добавлено через 11 минут
все, разобрался. это вместо a должна стоять b
спасибо
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
04.07.2013, 09:51 13
Цитата Сообщение от Tulosba Посмотреть сообщение
ValeryS, например такой хак http://ideone.com/kJqD9A
Это не хак, а $рань господня, которая будет работать исключительно на твоём компиляторе, т.к. твой "хак" ты подогнал под поведение конкретно своего компилятора
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
04.07.2013, 09:52 14
когда ты знаешь как устроен стек, как передаются параметры, т.е много чего "железного"
От размера int'а данный пример не зависит, а вот от calling convetions зависит, железного тут мало.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.07.2013, 10:32 15
Цитата Сообщение от Evg Посмотреть сообщение
Это не хак, а $рань господня, которая будет работать исключительно на твоём компиляторе, т.к. твой "хак" ты подогнал под поведение конкретно своего компилятора
Уважаемый Evg, не горячитесь так. Никто не утверждал, что этот код будет переносимым. Если Вам известны какие-то иные способы получения значения безымянного параметра, было бы интересно посмотреть.
1
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
04.07.2013, 10:51 16
Сами выдумали себе проблему, сами и мучайтесь.

Идёте берёте руководство по конкретному компилятору. Смотрите, какой протокол вызова он выберет для этой конкретной функции и понимаете, что аргумент засунут в регистр, а то и вовсе был вычислен и забыт достаёте свой аргумент.
0
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
04.07.2013, 11:08 17
OhMyGodSoLong, короче все как обычно свелось к реализации конкретного компилятора и панацеи не существует? Худо.
Тогда зачем вообще оставили такую возможность?
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
04.07.2013, 11:27 18
Цитата Сообщение от 120° Посмотреть сообщение
все, разобрался. это вместо a должна стоять b
ну да опечатка сори
Цитата Сообщение от Герц Посмотреть сообщение
От размера int'а данный пример не зависит,
серьезно?
а откуда взялось красивое число 5???
Цитата Сообщение от Герц Посмотреть сообщение
железного тут мало.
кроме процессоров Intel и платформы PC есть еще куча изделий
перенеси мне пожалуйста этот код хотя бы на ATMega 8535 или STM
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
достаёте свой аргумент.
или не достаете потому что компилятор забыл его положить
0
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
04.07.2013, 12:04 19
интересная тема.
Случается, в вызове функции стоит большее число параметров, чем на самом деле функция использует (причины могут быть разные, но речь сейчас не о них). В этом случае можно не указывать имя ненужного параметра при определении функции. Сравните
C++
1
2
3
int f(int x, int y, int z) {
  return x+z;
}
и
C++
1
2
3
int f(int x, int, int z) {
  return x+z;
}
В последнем варианте тому, кто смотрит код, сразу ясно - о втором параметре функции не забыли, его не используют намеренно.
отсюда

может все-таки кто-нибудь поделиться причинами?
мне приходит на ум только то, что функция была виртуальной в базовом классе, но разве нельзя было просто ее перегрузить? отгрузить)))
1
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
04.07.2013, 12:09 20
Цитата Сообщение от AntonChik Посмотреть сообщение
может все-таки кто-нибудь поделиться причинами?
причинами чего? ну не нужен нам 2-й аргумент и все тут
0
04.07.2013, 12:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.07.2013, 12:09
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru