Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 26.02.2018
Сообщений: 11

Различия в выводе адреса метода класса через printf() и cout

23.04.2018, 21:44. Показов 1705. Ответов 37
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Объясните пожалуйста, почему когда я пытаюсь вывести адрес метода класса с помощью функции printf(), он выводится в консоль в обычном 16-ном виде, но когда использую для этой цели cout, выводится 1. Почему так происходит? В интернете ничего не нашел, возможно плохо искал. Что значит 1? Заранее спасибо за помощь.

C++
1
2
3
PhoneBook book("Rafalsky", "Andrey", "Anatoliyovich", 13, 2, 1999, "+380999999999", "Uk", "Polt");
    printf("Person::Show -- %p\n", &Person::Show);
    cout << &Person::Show << endl;
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.04.2018, 21:44
Ответы с готовыми решениями:

Русский язык в ввода-выводе через printf-scanf
Здравствуйте! Помогите пожалуйста... Мне нужно к программе подключить возможность работать с русским языком, однако, мне нужно, что бы...

Вызов метода производного класса через обращение к методу базового класса
Добрый день. Изучаю основы ООП, наткнулся на проблему. Если создавать классы внутри main.cpp, то всё нормально. Если же создавать в...

Перезагрузить оператор cout, объекты класса передать через указатель и
Нужно перезагрузить оператор cout Объекты класса передать через указатель и периметр треугольника вывести как сумма 3-х чисел с...

37
475 / 427 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
23.04.2018, 23:25
Студворк — интернет-сервис помощи студентам
rat0r, Который тебе вывел онлайн-компилятор (и выведет любой иной).
В моей терминологии, вызвать функцию - есть вызвать функцию. call как был, так и существует по сей день. Но подобная "терминология" тебе не понравилась, у тебя своя личная. "Вызвать функцию", "обратиться к члену класса" - что здесь не понятного для тебя, мне не понять.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
24.04.2018, 00:05
Цитата Сообщение от SuperKir Посмотреть сообщение
Который тебе вывел онлайн-компилятор (и выведет любой иной).
Ты можешь по-человечески объяснить, в чём проблема и чем ты не доволен?

Цитата Сообщение от SuperKir Посмотреть сообщение
В моей терминологии, вызвать функцию - есть вызвать функцию. call как был, так и существует по сей день. Но подобная "терминология" тебе не понравилась, у тебя своя личная. "Вызвать функцию", "обратиться к члену класса" - что здесь не понятного для тебя, мне не понять.
Мне не понятно, к чему сюда приплетаются вызовы функций. Эта тема вообще не про вызов функций.

Цитата Сообщение от SuperKir Посмотреть сообщение
Это ж где ты видел такой адрес?)
Кто вообще сказал, что pointer-to-member — это адрес?
0
475 / 427 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
24.04.2018, 00:20
Цитата Сообщение от rat0r Посмотреть сообщение
Мне не понятно, к чему сюда приплетаются вызовы функций. Эта тема вообще не про вызов функций.
Тебе вообще не понятно, что тут делают, поэтому просто пройди дальше)
Человек задал конкретный вопрос - получил нужный ему ответ.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
24.04.2018, 00:39
Цитата Сообщение от SuperKir Посмотреть сообщение
Тебе вообще не понятно, что тут делают
Сказал человект, который не знает, что такое static member. Ответ на вопрос "Кто вообще сказал, что pointer-to-member — это адрес? " будет?

Цитата Сообщение от SuperKir Посмотреть сообщение
Человек задал конкретный вопрос - получил нужный ему ответ.
Ага. Я указал, что %p в printf не позволяет выводить значения pointer-to-member типа.

Добавлено через 14 минут
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <cstdio>
 
struct S { void Method() {} };
 
int main()
{
    printf("%p\n", &S::Method);
    std::cout << &S::Method << '\n';
}
Code
1
2
0x40088c
1
https://wandbox.org/permlink/aq2AKxPeMvcs8lhk

Цитата Сообщение от SuperKir Посмотреть сообщение
Если бы первый вариант не выдавал адрес, можно было бы предположить, что метод не статик
Первый вариант "выдаёт адрес". Метод не статик. Что теперь скажешь?
0
24.04.2018, 00:46

Не по теме:

...

0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
24.04.2018, 00:57
Цитата Сообщение от SuperKir Посмотреть сообщение
А кто тебе сказал, что здесь используется pointer-to-member?
А где у ТС сказано, что метод — статический?

Цитата Сообщение от SuperKir Посмотреть сообщение
Только зачем?
На всякий случай.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
24.04.2018, 05:56
Цитата Сообщение от SuperKir Посмотреть сообщение
rat0r, а что, по-твоему, можно вызвать таким способом?
C++
1
&Person::Show
1) Это не вызов.
2) Только так и берется указатель на не статическую функцию-член класса.
...) ...
2
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
24.04.2018, 21:13
Цитата Сообщение от Jack132 Посмотреть сообщение
В интернете ничего не нашел
На stackoverflow.com: "How to print function pointers with cout?"
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
24.04.2018, 21:58
Цитата Сообщение от nd2 Посмотреть сообщение
Чтобы mingw не ругался:
C++
1
printf("Person::Show -- %p\n", (void*)&Person::Show);
Ну перестанет он ругаться. А какую информацию несёт в себе значение, полученное кастом к void*? Размер указателя на мембер может быть и больше размера void*.
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
struct S { void f() { } };
 
int main()
{
    std::cout << sizeof(void*) << std::endl;
    std::cout << sizeof(&S::f) << std::endl;
}
Code
1
2
8
16
https://wandbox.org/permlink/pbFCfjSXDYnGKfiF

Добавлено через 10 минут
Цитата Сообщение от rat0r Посмотреть сообщение
Ну перестанет он ругаться.
Ну или не перестанет https://wandbox.org/permlink/yQc041JI13LTkHHb
Code
1
2
3
warning: converting from 'void (S::*)()' to 'void*' [-Wpmf-conversions]
     printf("%p\n", (void*)(&S::f));
                                 ^
Добавлено через 1 минуту
Кликните здесь для просмотра всего текста
Жду ответа в духе "это не mingw".
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
25.04.2018, 03:07
nd2, Преобразование в void* не несет никакого смысла. Более того, указатель на не статическую функцию-член это как бы, вообще не указатель в привычном его понимании, и он даже может отличаться по размеру от этого самого void* (о чем уже написал товарищ rat0r).
1
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
25.04.2018, 03:10
Цитата Сообщение от Croessmah Посмотреть сообщение
Более того, указатель на не статическую функцию-член
Я посчитал (с чего-то), что у ТС static.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
25.04.2018, 03:17
nd2, указатель на функцию-член не может указывать на статическую функцию-член.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
25.04.2018, 03:28
Я там указателя не вижу.

Добавлено через 8 минут
Ошибка тут есть?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct Person
{
    static void Show()
    {}
};
 
int main ()
{
    printf("Person::Show -- %p\n", (void*)&Person::Show);
    cout << (void*)&Person::Show << endl;
 
    return 0;
}
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
25.04.2018, 03:44
nd2, да, есть. Но смотря что считать ошибкой.

Цитата Сообщение от Jack132 Посмотреть сообщение
Почему так происходит?
Извините, конечно, но в printf хоть жопу орангутана засуньте, он всё равно будет считать её указателем (или чем-то еще, в зависимости от указанного формата).
Для cout же компилятор просто не находит перегрузки operator<< для вывода указателя на функцию-член, поэтому указатель преобразуется в bool и используется перегрузка для bool.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
25.04.2018, 03:48
Цитата Сообщение от Croessmah Посмотреть сообщение
да, есть.
Не томи. Компилятор предупреждений не выдаёт.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
25.04.2018, 03:59
nd2, преобразуешь указатель на функцию в указатель на данные (void*). Никто не гарантирует, что они хотя бы совпадают по размерам. Опять же, например, POSIX требует, чтобы они были одинаковыми.

C++
1
2
void * p = &Person::Show;//Ошибка здесь не просто так будет. 
//Только великий reinterpret_cast
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
25.04.2018, 19:01
Мне тут попалось, что единственное допустимое, по стандарту, преобразование указателя на функцию - это преобразование в bool. В этом ошибка?

Добавлено через 14 часов 59 минут
Croessmah, в чём, собственно, особенность адреса функции, что его нельзя приводить к другим типам указателей?
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
25.04.2018, 19:41
Цитата Сообщение от nd2 Посмотреть сообщение
Мне тут попалось, что единственное допустимое, по стандарту, преобразование указателя на функцию - это преобразование в bool.
Можно делать reinterpret_cast к object pointer (в том числе к void*), если это поддерживается реализацией.
Цитата Сообщение от http://eel.is/c++draft/expr.reinterpret.cast#8
Converting a function pointer to an object pointer type or vice versa is conditionally-supported.
The meaning of such a conversion is implementation-defined, except that if an implementation supports conversions in both directions, converting a prvalue of one type to the other type and back, possibly with different cv-qualification, shall yield the original pointer value.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.04.2018, 19:41

Printf() - Cout
Простой вопрос. Как заменить printf (&quot;%09d&quot;, a); на cout?

Cout в printf
Здравствуйте, может кто-нибудь помочь переделать cout в printf на 87-88 строках в данной программе? #include&lt;iostream&gt; ...

Cout и printf
Привет форумчане, не могу разобраться как правильно записать выражение использую не printf, a cout. Вот исходное выражение: ...

Cout в printf
Возможно глупый вопрос, но как переделать cout &lt;&lt; arr - (sum / m) &lt;&lt; &quot; &quot;; в printf? Как только не пытался, программа перестает работать...

printf > cout
Помогите переделать printf(&quot;| %3.2f | %3.1f | %7.5f |\n&quot;,a,b,y); на cout.


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

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
Новые блоги и статьи
Нейтральные знания ..., ... чистая наука. Пока что-то проходит модерацию на Хабре, стоит развить мысль ...
Hrethgir 20.07.2026
К таким радикальным взглядам я конечно в той публикации не приходил, но чтобы скоротать вечер, решил углубиться немного. 1. Почему показания термометра заряжены целью? Цель заложена в самом. . .
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ По ссылке 403. Не очень информативно такую ссылку постить. Запись от Usaga размещена Сегодня в 06:46 . . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru