Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.89
120°
12 / 10 / 1
Регистрация: 01.07.2013
Сообщений: 62
#1

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

03.07.2013, 12:48. Просмотров 2371. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2013, 12:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Безымянный аргумент функции (C++):

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

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

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

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

Auto как аргумент функции - C++
Возможно ли объявить параметр функции как auto? void func(auto pt); //...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
04.07.2013, 14:13 #31
Цитата Сообщение от AntonChik Посмотреть сообщение
что из нескольких веток ему предстоит откомпилить лишь одну, предназначенную именно ему?
условную компиляцию никто не отменял. #ifdef в руки и вперед
0
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
04.07.2013, 14:16 #32
а откуда взялось красивое число 5???
Ты, видимо, не знаешь, как работает адресная арифметика.
0
Evg
Эксперт CАвтор FAQ
17815 / 6025 / 388
Регистрация: 30.03.2009
Сообщений: 16,554
Записей в блоге: 26
04.07.2013, 14:57 #33
Цитата Сообщение от AntonChik Посмотреть сообщение

Не по теме:

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

Что конкретно ты подразумеваешь под "веткой"?
0
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
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
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 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
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
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
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
04.07.2013, 16:14 #38
Цитата Сообщение от ValeryS Посмотреть сообщение
дадут как бы разные адреса
в сообщении #36 речь идет о байтах, а не о кол-ве элементов.
0
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
04.07.2013, 16:41 #39
а утверждал что от "железа" это не зависит
В моем маке железо такое же, как в настольном компе. Core i7 3-его поколения и прочая. Разница именно в платформе и в компиляторе.
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
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
Evg
Эксперт CАвтор FAQ
17815 / 6025 / 388
Регистрация: 30.03.2009
Сообщений: 16,554
Записей в блоге: 26
04.07.2013, 19:20 #41
Цитата Сообщение от ValeryS Посмотреть сообщение
Вот вам еще одно баловство
доступ к приватной переменной
Я не уверен точно, но, думаю, стандарт никак не гарантирует, что компилятор не перемешает блоки public и private частей и расположит поля именно в том порядке, в котором они записаны в исходнике

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

Цитата Сообщение от Tulosba Посмотреть сообщение
так ищется оно просто
Когда ты берёшь указатель на параметр "a", то компилятор в принудительном порядке откачает его с регистра в стек. Так что ты в памяти по сути дела находишь копию параметра, а не истинный параметр, т.к. истинный параметр мог быть на регистре. В случае безымянного параметра ты взять адрес на него не сможешь, а потому с регистра в стек его никто не переложит
1
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
04.07.2013, 19:26 #42
Цитата Сообщение от Evg Посмотреть сообщение
Я не уверен точно, но, думаю, стандарт никак не гарантирует,
про стандарт не знаю, как то не было задачи не интересовался
но эмпирическим путем замечено, что в памяти переменные лежат в том порядке в каком объявили
компиляторы Борланд, Визуал
это так, опыт дизасемблирования
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
04.07.2013, 19:30 #43
Цитата Сообщение от Evg Посмотреть сообщение
Когда ты берёшь указатель на параметр "a", то компилятор в принудительном порядке откачает его с регистра в стек. Так что ты в памяти по сути дела находишь копию параметра, а не истинный параметр, т.к. истинный параметр мог быть на регистре. В случае безымянного параметра ты взять адрес на него не сможешь, а потому с регистра в стек его никто не переложит
Бред. Указатель должен указывать непосредственно на сущность, иначе это не указатель на неё, такое поведение неизбежно запрещено стандартом. Регистр может быть временным местом хранения данного, в том числе параметра, на время вычисления с ним, или перед помещением в стек, но потом всякое имеющее адрес данное будет сохранено в оперативу. Получается, что само звятие адреса запрещает передачу через параметр, но для анонима такой подход не возможен и запретить можно только явным выбором соглашения о вызове.
0
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
04.07.2013, 20:36 #44
Я не уверен точно, но, думаю, стандарт никак не гарантирует, что компилятор не перемешает блоки 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
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 2
Завершенные тесты: 1
04.07.2013, 20:49 #45
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Причинами того, что, случается, в вызове функции стоит большее число параметров, чем на самом деле функция использует.
Если я правильно понял, то вот:
Предположим, что ты написал функцию MyFunc (int a, int b, int С). В ходе долгих переработок и уточнений ты понял, что переменную С мало смысла использовать, но твоей функцией уже пользуются люди и, чтобы не потерять функционал кода этих людей, ты пишешь MyFunc (int a, int b, int), чтобы поддержать использование твоей функции старой версии. Тем самым ты просто не используешь последнюю переменную.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.07.2013, 20:49
Привет! Вот еще темы с ответами:

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

Аргумент функции - массив строк - C++
есть массив строк string *conns = new string; нужно сделать функцию, которая его бы изменяла void func( ??? ) {}

Опциональный ссылочный аргумент функции - C++
Некоторые аргументы функции можно сделать опциональными, просто поставив значение по умолчанию, а затем проверяя, изменилось ли оно : ...

Аргумент argv в функции main() - C++
Здравствуйте. Возникли некоторые непонимания при работе с аргументом argv и указателями в целом. Мне сказали, что, при передаче...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
04.07.2013, 20:49
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru