Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
kravam
быдлокодер
1707 / 894 / 105
Регистрация: 04.06.2008
Сообщений: 5,527
#1

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

31.03.2013, 23:51. Просмотров 920. Ответов 20
Метки нет (Все метки)

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) а в функциях оно почему-то разное

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.03.2013, 23:51
Ответы с готовыми решениями:

Как не писать один и тот же код, для функции, принимающей разные типы данных в качестве аргумента
Проблема такая: есть некая функция. Внутри нее происходят одни и теже...

Что означает первый параметр метода этого класса? И почему при вызове метода передаётся один параметр(второй)?
public static HelpPageApiModel GetHelpPageApiModel(this HttpConfiguration...

Разные функции используют разные системы координат. Почему так?
Друзья! К примеру, нарисовали мы окно. И используем функцию void...

почему разные значения
Написал скрипт VBA Public Sub aa() Dim a As Double a = Log(2) * Log(2)...

Разные значения один и тот же результат
Ввожу разные переменные а результат выдает один и тот же. В чем может причина...

20
Buckstabue
177 / 126 / 24
Регистрация: 12.01.2012
Сообщений: 624
01.04.2013, 00:17 #2
Очень интересно. А можно использовать многопоточность? Эх. Никогда с таким не сталкивался. Может надо переопределить фунцию привидения к void * указателю? Ну или к указателю на pX или pY
0
Croessmah
++Ͻ
14368 / 8150 / 1534
Регистрация: 27.09.2012
Сообщений: 20,088
Записей в блоге: 3
Завершенные тесты: 1
01.04.2013, 00:20 #3
Можно так:
На засыпку для новичков: в функции передаётся один параметр, а его значения разные; почему?
1
Buckstabue
177 / 126 / 24
Регистрация: 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);
 // И тут тоже некоторый код
}
0
nonedark2008
1025 / 765 / 211
Регистрация: 28.07.2012
Сообщений: 2,124
01.04.2013, 00:56 #5
Цитата Сообщение от Buckstabue Посмотреть сообщение
Но я хоть близок к истине?
Конечно можно придумать кучу вариантов решения. А так, нет - ваш вариант не будет работать.
Желательно копать в сторону полиморфизма.
0
kravam
быдлокодер
1707 / 894 / 105
Регистрация: 04.06.2008
Сообщений: 5,527
01.04.2013, 01:23  [ТС] #6
Цитата Сообщение от Buckstabue Посмотреть сообщение
А можно использовать многопоточность?
В моём ответе многопоточности нет, но если умело примените, ответ будет засчитан.
Croessmah, чё-то у вас всё тёмное там; вы так просто код напишите и всё.
0
Croessmah
++Ͻ
14368 / 8150 / 1534
Регистрация: 27.09.2012
Сообщений: 20,088
Записей в блоге: 3
Завершенные тесты: 1
01.04.2013, 01:24 #7
Цитата Сообщение от kravam Посмотреть сообщение
Чё-то у вас всё тёмное там вы так просто код напишите и всё.
тогда пропадет смысл темы. Я предложил лишь один вариант. Сейчас в ЛС скину )
0
Stranger777
4 / 8 / 0
Регистрация: 08.02.2013
Сообщений: 47
01.04.2013, 01:34 #8
Тут идея решения, запрятал чтоб посмотрели только те, кому совсем не терпится.
Кликните здесь для просмотра всего текста
Классы X и Y в разных пространствах имён, соответственно члены классов, передаваемые в функцию, могут иметь одно имя при разных фактических значениях. Код лениво писать. =)


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

Не по теме:

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

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

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

Croessmah, скинул мне в личку один из правильных ответов, мы его если чё опубликуем. Мой ответ кардинально разнится от ответа Croessmah, то есть не просто косметически, но принципиально. Вот имеем уже два ответа.
0
BumerangSP
4287 / 1409 / 463
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
01.04.2013, 02:10 #12
kravam, а в тех местах, где помечено комментом, код должен быть обязательно?
0
kravam
быдлокодер
1707 / 894 / 105
Регистрация: 04.06.2008
Сообщений: 5,527
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 прислал мне уже два принципиально разных варианта, а у меня есть третий.
0
BumerangSP
4287 / 1409 / 463
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
01.04.2013, 02:26 #14
kravam, да, комменты на это наводят. А ДО вызовов?
И вообще, тут главное только то, чтобы вышли разные значения?
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 400
Регистрация: 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);
}
1
kravam
быдлокодер
1707 / 894 / 105
Регистрация: 04.06.2008
Сообщений: 5,527
01.04.2013, 02:30  [ТС] #16
Я там подкорректировал, но это для простоты. Условие из первого поста вполне корректно, просто оно чуть-чуть сложнее минимально необходимого для решения задачи. Да, надо чтобы разные числа вывелись и всё.
0
BumerangSP
4287 / 1409 / 463
Регистрация: 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); 
}
1
kravam
быдлокодер
1707 / 894 / 105
Регистрация: 04.06.2008
Сообщений: 5,527
01.04.2013, 02:35  [ТС] #18
Ну вот Jupiter опубликовал мой ответ. Ну всё, собсно.

Добавлено через 1 минуту
BumerangSP, сойдёт, но у меня и Jupiter, всё же другой ответ.
0
nonedark2008
1025 / 765 / 211
Регистрация: 28.07.2012
Сообщений: 2,124
01.04.2013, 02:36 #19
Я тоже немного подумал над задачей.
Кликните здесь для просмотра всего текста
В итоге первым пришел вариант в голову как у Jupiter.
Второй, сделать так чтобы это дерьмо компилилось, а затем сверху дописать
C++
1
#define printf(x, y) printf("%i\n", rand());
Третий вариант - это реально просто у класса X перегрузить операторы приведения к типу X* и Y*, которые будут возвращать нужные нам циферки.
1
Buckstabue
177 / 126 / 24
Регистрация: 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);
}
0
01.04.2013, 02:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.04.2013, 02:40

Циклы: почему выводятся разные значения?
Здравствуйте, помогите понять, почему в первом случае, выводит на экран 561, а...

Задать несколько значений в один параметр функции
В Дельфях например есть такая структуа: AnyFunction(@target, @source,...

Программа, определяющая, есть ли в массиве хотя бы один столбец, содержащий все одинаковые значения, содержащий все разные значения
Написать программу, определяющую есть ли в массиве хотя бы один столбец,...


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

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

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