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

На засыпку для новичков: в функции передаётся один параметр, а его значения разные; почему? - C++

Восстановить пароль Регистрация
 
 
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,299
31.03.2013, 23:51     На засыпку для новичков: в функции передаётся один параметр, а его значения разные; почему? #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
//Тут некоторый код
 
void foo(X* pX) {printf ("%x\n", pX);}; 
void bar(Y* pY) {printf ("%x\n", pY);}; 
int main() 
{ 
 //Тут тоже некоторый код
 foo(pA); 
 bar(pA); 
 //И тут тоже некоторый код
}
А вот вывод:
3e2478
3e247c
Задание: восстановить весь код, чтобы так всё и было. Вроде передаётся одно значение (pA) а в функциях оно почему-то разное
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.03.2013, 23:51     На засыпку для новичков: в функции передаётся один параметр, а его значения разные; почему?
Посмотрите здесь:

C++ Создать функцию, которой строка передаётся как параметр, и которая возвращает количество слов
Создать функцию, которой строка передаётся как параметр, и которая возвращает количество слов C++
C++ Битовое ИЛИ. Пердача нескольких констант в один параметр функции
Возврат значения через параметр функции C++
C++ Почему в setnamedisc нужно использовать char * для установки значения, а при возвращении значения тип метода должен быть char* ?
C++ Почему у дружественной функции два аргумента, а у метода класса один?
Параметр конструктора класса нигде не задействован, но его отсутствие влияет на компиляцию, почему так? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
01.04.2013, 00:17     На засыпку для новичков: в функции передаётся один параметр, а его значения разные; почему? #2
Очень интересно. А можно использовать многопоточность? Эх. Никогда с таким не сталкивался. Может надо переопределить фунцию привидения к void * указателю? Ну или к указателю на pX или pY
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
12271 / 6958 / 782
Регистрация: 27.09.2012
Сообщений: 17,259
Записей в блоге: 2
Завершенные тесты: 1
01.04.2013, 00:20     На засыпку для новичков: в функции передаётся один параметр, а его значения разные; почему? #3
Можно так:
На засыпку для новичков: в функции передаётся один параметр, а его значения разные; почему?
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
01.04.2013, 00:48     На засыпку для новичков: в функции передаётся один параметр, а его значения разные; почему? #4
Почему-то не работает :'-) Но я хоть близок к истине?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
 
class Y
{
 
};
 
class X
{
public:
   operator Y*() {return (Y*)0x3e247c;};
};
 
 
 
void foo(X* pX) {printf ("%x\n", pX);};
void bar(Y* pY) {printf ("%x\n", pY);};
 
int main()
{
 X *pA = (X*)0x3e2478;
 
 foo(pA);
 bar(pA);
 // И тут тоже некоторый код
}
nonedark2008
765 / 523 / 96
Регистрация: 28.07.2012
Сообщений: 1,392
01.04.2013, 00:56     На засыпку для новичков: в функции передаётся один параметр, а его значения разные; почему? #5
Цитата Сообщение от Buckstabue Посмотреть сообщение
Но я хоть близок к истине?
Конечно можно придумать кучу вариантов решения. А так, нет - ваш вариант не будет работать.
Желательно копать в сторону полиморфизма.
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,299
01.04.2013, 01:23  [ТС]     На засыпку для новичков: в функции передаётся один параметр, а его значения разные; почему? #6
Цитата Сообщение от Buckstabue Посмотреть сообщение
А можно использовать многопоточность?
В моём ответе многопоточности нет, но если умело примените, ответ будет засчитан.
Croessmah, чё-то у вас всё тёмное там; вы так просто код напишите и всё.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
12271 / 6958 / 782
Регистрация: 27.09.2012
Сообщений: 17,259
Записей в блоге: 2
Завершенные тесты: 1
01.04.2013, 01:24     На засыпку для новичков: в функции передаётся один параметр, а его значения разные; почему? #7
Цитата Сообщение от kravam Посмотреть сообщение
Чё-то у вас всё тёмное там вы так просто код напишите и всё.
тогда пропадет смысл темы. Я предложил лишь один вариант. Сейчас в ЛС скину )
Stranger777
4 / 8 / 0
Регистрация: 08.02.2013
Сообщений: 47
01.04.2013, 01:34     На засыпку для новичков: в функции передаётся один параметр, а его значения разные; почему? #8
Тут идея решения, запрятал чтоб посмотрели только те, кому совсем не терпится.
Кликните здесь для просмотра всего текста
Классы X и Y в разных пространствах имён, соответственно члены классов, передаваемые в функцию, могут иметь одно имя при разных фактических значениях. Код лениво писать. =)


Добавлено через 4 минуты
Croessmah, поясните пожалуйста идиоту, как тут спойлер работает? кликаю - и нифига, смысл спойлера уходит. Предположительно где-то там fieldset должно быть, но экспериментировать надоело.
Croessmah
01.04.2013, 01:38
  #9

Не по теме:

Цитата Сообщение от Stranger777 Посмотреть сообщение
кликаю - и нифига
Обновите страницу.

nonedark2008
765 / 523 / 96
Регистрация: 28.07.2012
Сообщений: 1,392
01.04.2013, 01:42     На засыпку для новичков: в функции передаётся один параметр, а его значения разные; почему? #10
Цитата Сообщение от Stranger777 Посмотреть сообщение
Тут идея решения, запрятал чтоб посмотрели только те, кому совсем не терпится.
Ну вы тут совсем напутили >_> Если я правильно понял то, что вы хотели донести - то это работать не будет.
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,299
01.04.2013, 01:42  [ТС]     На засыпку для новичков: в функции передаётся один параметр, а его значения разные; почему? #11
Stranger777, сомневаюсь. Дело в том, что имя-то одно , но коль скоро оно принадлежит разным класса, его надо как-то квалифицировать, причём делать это ОДНОЗНАЧНО, ну например:
C++
1
2
foo(X::pA); 
bar(Y::pA);
а это уже явно два разных pA

+++++++++++++++++++++++++++++++++++

Croessmah, скинул мне в личку один из правильных ответов, мы его если чё опубликуем. Мой ответ кардинально разнится от ответа Croessmah, то есть не просто косметически, но принципиально. Вот имеем уже два ответа.
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
01.04.2013, 02:10     На засыпку для новичков: в функции передаётся один параметр, а его значения разные; почему? #12
kravam, а в тех местах, где помечено комментом, код должен быть обязательно?
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,299
01.04.2013, 02:24  [ТС]     На засыпку для новичков: в функции передаётся один параметр, а его значения разные; почему? #13
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
//Тут некоторый ОБЯЗАТЕЛЬНЫЙ код
 
void foo(X* pX) {printf ("%x\n", pX);}; 
void bar(Y* pY) {printf ("%x\n", pY);}; 
int main() 
{ 
 foo(pA); 
 bar(pA); 
 //Тут необязательный код для подбирания соплей, типа память освободить, ноль вернуть.
}
+++++++++++++++++++++++++++++++++++++++++++++

Croessmah прислал мне уже два принципиально разных варианта, а у меня есть третий.
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
01.04.2013, 02:26     На засыпку для новичков: в функции передаётся один параметр, а его значения разные; почему? #14
kravam, да, комменты на это наводят. А ДО вызовов?
И вообще, тут главное только то, чтобы вышли разные значения?
Jupiter
Каратель
Эксперт C++
6545 / 3965 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
01.04.2013, 02:28     На засыпку для новичков: в функции передаётся один параметр, а его значения разные; почему? #15
что за тайны мадридского двора?
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
 
class X
{
   public:
   virtual ~X()
   {
   }
};
 
class Y 
{   
   public:
   virtual ~Y()
   {
   }
};
 
class Z : public X, public Y
{
   public:
   virtual ~Z()
   {  
   }
};
 
 
void foo(X* pX) 
{
   std::cout << pX << std::endl;
}
 
void bar(Y* pY) 
{
   std::cout << pY << std::endl;
}
 
int main() 
{ 
   Z z;
   Z* pA = &z;
   foo(pA); 
   bar(pA);
}
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,299
01.04.2013, 02:30  [ТС]     На засыпку для новичков: в функции передаётся один параметр, а его значения разные; почему? #16
Я там подкорректировал, но это для простоты. Условие из первого поста вполне корректно, просто оно чуть-чуть сложнее минимально необходимого для решения задачи. Да, надо чтобы разные числа вывелись и всё.
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
01.04.2013, 02:32     На засыпку для новичков: в функции передаётся один параметр, а его значения разные; почему? #17
Просто под этот код можно много фигни понаписать, типа этой, но вряд ли это за решение сойдет
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <stdlib.h>
#define pA (int*)(rand()%10)
typedef int X;
typedef int Y; 
 
void foo(X* pX) {printf ("%x\n", pX);}; 
void bar(Y* pY) {printf ("%x\n", pY);};
 
int main() 
{ 
 foo(pA); 
 bar(pA); 
}
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,299
01.04.2013, 02:35  [ТС]     На засыпку для новичков: в функции передаётся один параметр, а его значения разные; почему? #18
Ну вот Jupiter опубликовал мой ответ. Ну всё, собсно.

Добавлено через 1 минуту
BumerangSP, сойдёт, но у меня и Jupiter, всё же другой ответ.
nonedark2008
765 / 523 / 96
Регистрация: 28.07.2012
Сообщений: 1,392
01.04.2013, 02:36     На засыпку для новичков: в функции передаётся один параметр, а его значения разные; почему? #19
Я тоже немного подумал над задачей.
Кликните здесь для просмотра всего текста
В итоге первым пришел вариант в голову как у Jupiter.
Второй, сделать так чтобы это дерьмо компилилось, а затем сверху дописать
C++
1
#define printf(x, y) printf("%i\n", rand());
Третий вариант - это реально просто у класса X перегрузить операторы приведения к типу X* и Y*, которые будут возвращать нужные нам циферки.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.04.2013, 02:40     На засыпку для новичков: в функции передаётся один параметр, а его значения разные; почему?
Еще ссылки по теме:

Шаблон функции для использования с классами, имеющими разные методы C++
Одно имя для указателей на разные функции C++
Задачка для новичков#1: найти причину UB в коде и исправить его согласно условию C++
динамическое создание двумерного массива и передача его как параметр функции C++
Почему в функции operator не ставят тип возвращаемого значения? C++

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

Или воспользуйтесь поиском по форуму:
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
01.04.2013, 02:40     На засыпку для новичков: в функции передаётся один параметр, а его значения разные; почему? #20
Немного подкорректировал пример Jupiter'a. Чтобы он полностью соответствовал выводу в задании. Но почему так происходит?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
 
class X
{
   public:
   virtual ~X()
   {
   }
};
 
class Y
{
   public:
   virtual ~Y()
   {
   }
};
 
class Z : public X, public Y
{
   public:
   virtual ~Z()
   {
   }
};
 
 
void foo(X* pX)
{
   std::cout << pX << std::endl;
}
 
void bar(Y* pY)
{
   std::cout << pY << std::endl;
}
 
int main()
{
   Z *pA = (Z*) 0x3e2478;
   Z &z = *pA;
   foo(pA);
   bar(pA);
}
Yandex
Объявления
01.04.2013, 02:40     На засыпку для новичков: в функции передаётся один параметр, а его значения разные; почему?
Ответ Создать тему
Опции темы

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