12 / 10 / 0
Регистрация: 01.07.2013
Сообщений: 62
1

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

03.07.2013, 12:48. Показов 5315. Ответов 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
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.07.2013, 12:11 21
Author24 — интернет-сервис помощи студентам
AntonChik, собственно для перегрузки такое и делают в частности. Например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
using namespace std;
 
int f(int x, int, int z) {
  return x+z;
}
 
int f(int x, double, int z) {
  return x*z;
}
 
int main() {
    cout << f(1,0,2) << endl;
    cout << f(1,0.,2) << endl;
        return 0;
}
https://ideone.com/pM8Yp9
2
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
04.07.2013, 12:11 22
Цитата Сообщение от Jupiter Посмотреть сообщение
причинами чего?
Причинами того, что, случается, в вызове функции стоит большее число параметров, чем на самом деле функция использует.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
04.07.2013, 12:24 23
Цитата Сообщение от Tulosba Посмотреть сообщение
Уважаемый Evg, не горячитесь так. Никто не утверждал, что этот код будет переносимым. Если Вам известны какие-то иные способы получения значения безымянного параметра, было бы интересно посмотреть.
Вместо того, чтобы городить кучу дополнительного кода в функции, могу предложить изящное решение - дать имя параметру.

Цитата Сообщение от SatanaXIII Посмотреть сообщение
Причинами того, что, случается, в вызове функции стоит большее число параметров, чем на самом деле функция использует.
Например, ты встраиваешься в чужую систему, которая пишется как универсальная на все случаи жизни. Поэтому ты обязан написать именно такой прототип функции, как требует того система. Поскольку система универсальная, а твой случай - частный, то тебе какие-то параметры могут и не понадобиться
2
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
04.07.2013, 12:24 24
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Причинами того, что, случается, в вызове функции стоит большее число параметров, чем на самом деле функция использует.
и чё? я вызываю функцию и мне пофигу что там используется, а что нет. если не я эту функцию писал
0
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
04.07.2013, 12:52 25
Цитата Сообщение от Evg Посмотреть сообщение
встраиваешься в чужую систему
Цитата Сообщение от Jupiter Посмотреть сообщение
и чё?
Не, не, не, господа. Мы говорим о случае, когда у нас есть именно такая функция. Перефразировав специально для Jupiter, зачем вы написали именно такую функцию?

Это все понятно, что, если это нас не касается, то и хрен с ним. Но охота разобраться зачем оно вообще.

Цитата Сообщение от Evg Посмотреть сообщение
дать имя параметру
А-а.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int WithName(int x, bool b)
{
  return x;
}
int WithoutName(int x, bool)
{
  return x;
}
 
int main()
{
  cout << WithName(9, NULL);
  cout << WithoutName(9, NULL);
 
  return 0;
}
Результат один и тот же.
Вопрос по прежнему открыт. Зачем существуют параметры без имени?
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
04.07.2013, 13:10 26
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Зачем существуют параметры без имени?
Просто так. Чтобы не заводить лишнее имя в процедуре, если параметр должен быть, но он не используется. Никаких других причин нет. Когда такое бывает - написал в посте #23.

Добавлено через 7 минут
Именованный и безымянный параметры играют роль исключительно внутри функции. В точке вызова функции нет никакой разницы, будет ли внутри вызываемой функции параметр иметь имя, или нет. В точке вызова важен только тип параметра, чтобы знать, как его правильно передать. А как этот параметр будет называться внутри функции - не играет никакой роли, т.к. в точке вызова нам не нужно обращаться к этому параметру (а именно для этого нужно имя переменой). Вернее, обращаться нужно в момент передачи параметра, но обращаемся к нему не по имени, а, грубо говоря, по порядковому номеру внутри круглых скобок в строгом соответствии с программными соглашениями (calling convenience)
2
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
04.07.2013, 13:20 27
Но самое-то интересное - можно ли получить внутри функции значение параметра, переданного без имени? Весь сыр-бор из-за этого.
0
12 / 10 / 0
Регистрация: 01.07.2013
Сообщений: 62
04.07.2013, 13:33  [ТС] 28
Зачем существуют параметры без имени?
я сейчас вспомнил про перегруженные операции постфиксного инкремента и декремента
C++
1
2
operator++(int);
operator--(int);
в них аргумент как бы и не нужен, а введен только для того, чтобы были различия от префиксных операторов
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
04.07.2013, 13:43 29
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Но самое-то интересное - можно ли получить внутри функции значение параметра, переданного без имени?
Как я уже говорил, есть простой способ - дать имя аргументу. Код от этого не изменится ни внутри функции, ни в точке вызова функции. Различие будет только в том, что теперь к параметру можно будет обратиться.

Если же нужно обратиться к неименованному параметру без задания имени, то в общем случае ответ - "никак". В частных случаях можно. Но при этом нужно понимать, по каким правилам передаются параметры. Но код всё равно может считаться рабочим только в рамках одного компилятора. Так, например, если параметры передаются через стек, то через адрес одного параметра можно получить адрес другого параметра. Но при этом нет никакой гарантии, что параметр, который пришёл через стек, компилятор не переложил внутри функции на регистр. Разумно предположить, что с безымяным параметром так желать ни к чему (поскольку регистров мало, а тратить их на ненужный параметр - расточительство). Если изначально параметр пришёл на регистре, то очевидно, что через адрес другого параметра мы наш безымяный параметр уже не прочтём. Т.е. можно обратиться только при помощи ассемблерных конструкций напрямую к регистру. При этом точно так же у нас нет никакой гарантии, что компилятор не переиспользовал регистр по своим нуждам. Это действие уже вероятное, т.к. незачем держатьрегистр под неиспользуемую переменную, его лучше заиспользовать под полезные нужды
2
AntonChik
04.07.2013, 13:53
  #30

Не по теме:

кстати раз уж зашел разговор о всяческих извратах, то у меня возник вопрос, а есть ли способ в коде дать конкретному компилятору понять, что из нескольких веток ему предстоит откомпилить лишь одну, предназначенную именно ему?)

0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.07.2013, 14:13 31
Цитата Сообщение от AntonChik Посмотреть сообщение
что из нескольких веток ему предстоит откомпилить лишь одну, предназначенную именно ему?
условную компиляцию никто не отменял. #ifdef в руки и вперед
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
04.07.2013, 14:16 32
а откуда взялось красивое число 5???
Ты, видимо, не знаешь, как работает адресная арифметика.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
04.07.2013, 14:57 33
Цитата Сообщение от AntonChik Посмотреть сообщение

Не по теме:

кстати раз уж зашел разговор о всяческих извратах, то у меня возник вопрос, а есть ли способ в коде дать конкретному компилятору понять, что из нескольких веток ему предстоит откомпилить лишь одну, предназначенную именно ему?)

Что конкретно ты подразумеваешь под "веткой"?
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,512
04.07.2013, 15:38 34
Цитата Сообщение от Герц Посмотреть сообщение
Ты, видимо, не знаешь, как работает адресная арифметика.
Ну так просвети
повторю вопрос
C++
1
2
3
void f( int )
{ int b = 42; 
cout << *(&b+5) << endl; }
откуда взялось число 5? почему не 10 не 1?

Добавлено через 26 минут
а ну да там инт стоит
Цитата Сообщение от ValeryS Посмотреть сообщение
int b = 42;
не обратил вчера внимания
сдвиг будет на 20 байт, при int 4байта
но откуда 5?

Добавлено через 9 минут
Вот вам еще одно баловство
доступ к приватной переменной
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
class A
{
    public:
    int a;
    private:
    int b;
    public:
void fnc()
 {std::cout<<b<<std::endl;};
    
};
 
int main()
{
    A c;
    *(&c.a+1)=5;
    c.fnc();
    return 0;
}
http://ideone.com/CBdvRO
правда кому и зачем может понадобится я не знаю
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
04.07.2013, 15:52 35
В том конкретном коде смещение в 20 байт взялось нипочему, так уж на платформе, на которой этот код выдал ожидаемый результат, осуществляется передача аргументов при вызове функций.
На Mac OS X, например, я не нашел такого смещения, которое дало бы адрес неименованного аргумента. Пробовал от -512 байт до 512.

Про нарушение спецификаторов доступа, в этом нет ничего особенного, если понимать внутренний layout объектов.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class One {
    int a;
    int b;
    int c;
};
 
struct Another {
    int a;
    int b;
    int c;
}
 
One clsInstance;
Another& asStruct = *reinterpret_cast<Another*>(&One);
asStruct.a = asStruct.b = asStruct.c = 0;
Спецификаторы доступа нужна для программистов, а кто нарушает их такими методами - сам себе злобный буратино.
P.S. при наличии в классе виртуальных функций такой подход в лоб не пройдет.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.07.2013, 16:02 36
Цитата Сообщение от Герц Посмотреть сообщение
я не нашел такого смещения
так ищется оно просто:
C++
1
2
3
4
void f( char a )
{ char b = 42; 
cout << (char*)&a - (char*)&b << endl;
}
Добавлено через 1 минуту
На VS2012 x64 получилось следующее:
C++
1
2
3
4
char - 17
short - 20
int - 20
long long - 24
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,512
04.07.2013, 16:09 37
Цитата Сообщение от Герц Посмотреть сообщение
На Mac OS X, например, я не нашел такого смещения, которое дало бы адрес неименованного аргумента.
а утверждал что от "железа" это не зависит
Вполне может быть что аргументы идут через регистр и со стека ты их не достанешь
да и локальные переменные могут в регистре лежать

Цитата Сообщение от Герц Посмотреть сообщение
Спецификаторы доступа нужна для программистов, а кто нарушает их такими методами - сам себе злобный буратино.
А я говорил что нужно всем всегда делать?
единственно что могу предположить, это если пользуешь чужой класс
но завтра реализация класса изменится и программа летит
Все эти адресные арифметики штука очень "острая"
при неправильном использовании легко можно "порезаться"

Добавлено через 2 минуты
Цитата Сообщение от Tulosba Посмотреть сообщение
char b
стоп стоп
вчера ты писал
C++
1
int b
а это несколько другое
C++
1
2
int b=23;
*(&b+1)
и
C++
1
2
char  b=23;
*(&b+1)
дадут как бы разные адреса
не находишь?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.07.2013, 16:14 38
Цитата Сообщение от ValeryS Посмотреть сообщение
дадут как бы разные адреса
в сообщении #36 речь идет о байтах, а не о кол-ве элементов.
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
04.07.2013, 16:41 39
а утверждал что от "железа" это не зависит
В моем маке железо такое же, как в настольном компе. Core i7 3-его поколения и прочая. Разница именно в платформе и в компиляторе.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
04.07.2013, 17:15 40
Это:
Цитата Сообщение от ValeryS Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int fnc1()
{
 int a=90;
 return a;
}
int fnc2()
{
 int b;
 return b;
}
.........
fnc1();
int s=fnc2();
исходник вируса "бомж", который тупо роется в мусоре.

Добавлено через 2 минуты
Цитата Сообщение от SatanaXIII Посмотреть сообщение
как я по указателю размер массива вычислял.
Вполне валидная операция языка --z, только выглядит совсем не так, как аналогичного назначения безобразие на c++.
0
04.07.2013, 17:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.07.2013, 17:15
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

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