Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452

Выводятся непонятные сообщения в процессе выполнения программы

25.05.2015, 16:25. Показов 2288. Ответов 39
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго дня !

Подскажите пожалуйста , почему при выводе строки (160)

C++
1
cout<<"\n******* "<<EmptyClass["Bill"].GetName()<<" is "<<EmptyClass["Bill"].GetAge();
выводятся эти сообщения ?

какие то левые обьекты создаются (((

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
#include <iostream>
#include <string>
#include <map>
#include <conio.h>
 
 
using namespace std;
 
class Student
 
{
 
public:
 
    Student();
 
    Student(const string & name, const int age);
 
    Student(const Student & rhs);
 
    ~Student();
 
    void SetName(const string & name);
 
    string GetName() const;
 
    void SetAge(const int age);
 
    int GetAge() const;
 
    Student & operator = (const Student & rhs);
 
private:
 
    string itsName;
 
    int itsAge;
};
 
 
Student :: Student()
 
: itsName("New Student"), itsAge(16)
 
{printf("\nKONST 1 %p\n",this);}
 
Student :: Student(const string & name, const int age)
 
: itsName(name), itsAge(age)
 
{printf("\nKONST 2 %p\n",this);}
 
Student :: Student(const Student & rhs)
 
: itsName(rhs.GetName()), itsAge(rhs.GetAge())
 
{printf("\nKONST copy %p %p\n",this,& rhs);}
 
Student ::  ~Student()
 
{printf("\nDES  %p\n",this);}
 
void Student :: SetName(const string & name)
 
{ 
    itsName = name;
}
 
string Student :: GetName() const
 
{
    //printf("\nGetName() %p\n",this);
 
    return  itsName;
}
 
void Student :: SetAge(const int age)
 
{
    itsAge = age;
}
 
int Student :: GetAge() const
 
{
    //printf("\nGetAge() %p\n",this);
 
    return  itsAge;
}
 
 
Student & Student :: operator = (const Student & rhs)
 
{
    printf("\noperator = %p %p\n",this,& rhs);
 
    itsName = rhs.GetName();
 
    itsAge = rhs.GetAge();
 
    return *this;
}
 
ostream & operator << (ostream & os, const Student & rhs)
 
{
    printf("\noperator << = %p \n\n",& rhs);
 
    os << rhs.GetName() <<" is "<<rhs.GetAge() <<" yeare old";
 
    return os;
}
 
template <class T,class A>
 
void ShowVector(const map <T,A> & v);
 
typedef map <string, Student> SchoolClass;
 
int main()
 
{
    Student Harry("Harry",18);
 
    printf("\nHarry = %p \n",& Harry);
 
    Student Sally("Sally",15);
 
    printf("\nSally = %p \n",& Sally);
 
    Student Bill("Bill",17);
 
    printf("\nBill = %p \n",& Bill);
 
    Student Peter("Peter",17);
 
    printf("\nPeter = %p \n",& Peter);
 
    printf("\n**************************\n");
 
    SchoolClass EmptyClass;
 
    printf("\n**************************\n");
 
    EmptyClass[Harry.GetName()] = Harry;
 
    EmptyClass[Sally.GetName()] = Sally;
 
    EmptyClass[Bill.GetName()] = Bill;
 
    EmptyClass[Peter.GetName()] = Peter;
 
    printf("\n++++++++++++++++++++++++++\n");
 
    
    ShowVector(EmptyClass);
 
    printf("\n++++++++++++++++++++++++++\n");
 
    cout<<"\n******* "<<EmptyClass["Bill"].GetName()<<" is "<<EmptyClass["Bill"].GetAge();
    
    getch();
 
    return 0;
}
 
template <class T,class A>
 
void ShowVector(const map <T,A> & v)
 
{
    
 
    for(map <T,A> :: const_iterator c1 = v.begin(); c1 != v.end(); ++c1)
 
    cout<<c1->first<<": "<<c1->second<<"\n";
 
    cout<<endl;
}
Миниатюры
Выводятся непонятные сообщения в процессе выполнения программы  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.05.2015, 16:25
Ответы с готовыми решениями:

Прерывание программы в процессе выполнения
Доброго времени суток! Подскажите, есть ли возможность прерывать программу во время выполнения? Т.е. у меня в программе есть цикл,...

Ошибка в процессе выполнения программы
Здравствуйте, не могу понять, почему выводится ошибка, что команда не найдена в 4 строке, где if, как я понимаю он ругается на -lt, что...

Изменение PE-заголовка в процессе выполнения программы
Доброго времени суток! Задался задачей изменить часть PE-заголовка в процессе выполнения программы (сразу хочу оговориться, что это не...

39
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
26.05.2015, 13:44  [ТС]
Студворк — интернет-сервис помощи студентам
скопировал.
Миниатюры
Выводятся непонятные сообщения в процессе выполнения программы  
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
26.05.2015, 13:47
RAFA91, похоже действительно какая-то особенность реализации map в VS6.
Приду домой - откопаю и посмотрю своими глазами на реализацию.
А пока могу только посоветовать обновить все-таки студию себе.
0
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
26.05.2015, 14:19  [ТС]
в институте мне никто не позволит ее обновлять. всетаки лицензионная.

мне самому интересна эта реализация .

но как гласит с++. меньше знаешь как реализованны методы класса - - крепьче спишь.

мне же не надо знать как работает к примеру самолет.

достаточно знать его функции. но это я так.

___________________


в борланде STL нету ?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
26.05.2015, 14:32
Цитата Сообщение от RAFA91 Посмотреть сообщение
но как гласит с++. меньше знаешь как реализованны методы класса - - крепьче спишь.
мне же не надо знать как работает к примеру самолет.
достаточно знать его функции. но это я так.
Не помню таких провозглашений. С другим каким языком не перепутал? Зато С++ точно гласит вот что:
мы не платим за то, что не используем
Здесь налицо нарушение этого. И, я боюсь, нарушение стандарта языка. Но я это я еще уточню, после того, как посмотрю реализацию.
Не торопись пока с выводами.

Добавлено через 3 минуты
Цитата Сообщение от RAFA91 Посмотреть сообщение
мне же не надо знать как работает к примеру самолет.
В данном случае аналогия не верна.
Ты не пилот здесь, а разработчик самолета, который хочет использовать у себя некую деталь (например готовый двигатель). Для того, что бы самолет не упал, ты должен понимать как он работает (если не в мельчайших деталях, то хотя бы в рамках технической документации).
А пилот в нашем случае - это пользователь готовой программы.

Добавлено через 5 минут
Цитата Сообщение от RAFA91 Посмотреть сообщение
в борланде STL нету ?
Смотря что имеется в виду под борландом. Если какой-нибудь Borland 3.1, то это очень старый компилятор, примерно 1991 года. Там есть какая-никакая библиотека, но она сильно отличается от того, что есть в современном языке.
0
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
26.05.2015, 14:43  [ТС]
спасибо большое - понял.

буду ждать ответа по поводу этих временных обьектов.

ещё не понятен двойной вызов копировщика.
Миниатюры
Выводятся непонятные сообщения в процессе выполнения программы  
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
26.05.2015, 19:08
Лучший ответ Сообщение было отмечено RAFA91 как решение

Решение

Цитата Сообщение от DrOffset Посмотреть сообщение
И, я боюсь, нарушение стандарта языка.
Нарушения нет. Наоборот, все крайне близко букве стандарта (наверное даже слишком).
Процитирую целиком.
23.3.1.2
map element access
T& operator[](const key_type& x);
Returns: (*((insert(make_pair(x, T()))).first)).second.
Я не уверен, что это требование реализации. Скорее - это описание поведения. Но. Именно так и реализован в VS6 operator[] у std::map. Это объясняет все "лишние" вызовы конструкторов. Это лишний раз подтверждает причину популярности в свое время STLPort, которой традиционно заменяли в крупных проектах "родную" STL. В STLPort реализация, кстати, без лишних вызовов (через lower_bound). Я в те времена на VS не писал (поэтому про особенность эту не знал), но использовал по долгу службы ровесника VS тех времен - компилятор GCC 2.95. Так вот, там такого безобразия тоже нет.

Цитата Сообщение от RAFA91 Посмотреть сообщение
буду ждать ответа по поводу этих временных обьектов.
ещё не понятен двойной вызов копировщика.
Итак, по порядку на примере из поста номер 20.
C++
1
Student Bill("Bill",17);
Сперва объект создается конструктором с параметрами. Тут все понятно.
C++
1
EmptyClass["Bill"] = Bill;
В этой строке происходит следующее. Вызывается функция (копирую прямо из исходников стандартной библиотеки VS6)
C++
1
iterator _P = insert(value_type(_Kv, _Ty())).first
_Ty - Это Student. Перед вставкой он создается конструктором без параметров. Затем копируется в value_type (value_type - это std :: pair<std::string, Student>). Получаем два вызова конструкторов (без параметров и копирования), которые всегда будут происходить при вызове оператора [] у map, независимо от исхода операции.
Теперь представим, что объекта в map еще не было. Если так, то далее идет вставка в дерево. Инициализация элемента в дереве происходит посредством placement new, с использованием конструктора копирования. Для этого используется вот такая функция:
C++
1
2
3
4
template<class _T1, class _T2> 
inline
void _Construct(_T1 _FARQ *_P, const _T2& _V)
{ new ((void _FARQ *)_P) _T1(_V); }
_P - это имеет тип Student _FARQ *
_V - это ссылка на second элемент (Student) пары (pair), сконструированной в функции operator[] (см. описание выше).
То есть то, что лежало в value_type еще раз копируется при инициализации элемента дерева. Это объясняет двойной вызов конструктора копии при вставке.
И завершает все это вызов оператора присваивания, который в созданный в дереве объект и возвращенный нам по ссылке, копирует данные из объекта Bill.
2
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
27.05.2015, 12:11  [ТС]
Большое Вам спасибо за проделанный анализ !!!
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
27.05.2015, 13:11
Цитата Сообщение от DrOffset Посмотреть сообщение
которые всегда будут происходить при вызове оператора []
А если оптимизацию включить? Или из-за древности компилятора всё равно чуда не произойдет?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
27.05.2015, 13:15
Цитата Сообщение от Tulosba Посмотреть сообщение
А если оптимизацию включить? Или из-за древности компилятора всё равно чуда не произойдет?
Честно говоря, я код этот на VS6 не компилировал. Я ориентировался только на исходники std и на скрины автора темы.
Даже если оптимизация в действительности у автора не применялась, то ее включение максимум уберет первый вызов конструктора копии. Но объект все рано будет создаваться при каждом обращении к элементу map. Тут уже сам подход играет роль.
0
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
27.05.2015, 14:25  [ТС]
может проще самому написать библиотеку ?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
27.05.2015, 14:28
Цитата Сообщение от RAFA91 Посмотреть сообщение
может проще самому написать библиотеку ?
Какую? Аналог STL? Проще компилятор обновить.
0
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
27.05.2015, 14:55  [ТС]
какой посоветуете по хр sp3?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
27.05.2015, 15:18
Цитата Сообщение от RAFA91 Посмотреть сообщение
какой посоветуете по хр sp3?
Какие из современных будут работать на XP - хз. Но рекомендую глянуть в тему.
0
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
27.05.2015, 15:59  [ТС]
а как на счет онлайн компилятора.

можна ли проверить этот код в онлайне ?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
27.05.2015, 16:07
Цитата Сообщение от RAFA91 Посмотреть сообщение
можна ли проверить этот код в онлайне ?
Можно. Но из-за "студийных" функций, наверное только тут.
0
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
27.05.2015, 16:21  [ТС]
не работает она тут.

не увидел
C++
1
cout<<"\n******* "<<EmptyClass["Bill"].GetName()<<" is "<<EmptyClass["Bill"].GetAge();
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
27.05.2015, 16:32
Цитата Сообщение от RAFA91 Посмотреть сообщение
не увидел
Добавь endl в строку или убери getch (а лучше, и то, и другое сделай) и увидишь:
C++
1
cout<<"\n******* "<<EmptyClass["Bill"].GetName()<<" is "<<EmptyClass["Bill"].GetAge() << endl;
http://rextester.com/NWRF63394
0
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
27.05.2015, 17:00  [ТС]
тут я не увидел этих временных обьектов .
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
27.05.2015, 17:13
Цитата Сообщение от RAFA91 Посмотреть сообщение
может проще самому написать библиотеку ?
Можно скомпилировать STLPort для 6й студии. Но это если только никак от нее не отвязаться. В остальных случаях дешевле компилятор обновить. Последние студии сейчас все есть в бесплатном исполнении.
Если же библиотеку не подменять (это ведь нужно уметь делать), то можно сделать workaround через собственную функцию, в которой применить способ поиска через lower_bound + insert. Примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template <typename Key, typename Value>
Value & get(std::map<Key, Value> & mobj, typename std::map<Key, Value>::key_type const & key)
{
    typedef std::map<Key, Value> map_type;
 
    typename map_type::iterator i = mobj.lower_bound(key);
    // i->first is greater than or equivalent to key
    if(i == mobj.end() || mobj.key_comp()(key, i->first))
    {
        i = mobj.insert(i, std::make_pair(key, Value()));
    }
    return i->second;
}
И пользоваться везде ей, вместо оператора[].
C++
1
2
3
4
5
////.....
 
std::map<std::string, Student> m;
 
get(m, "Bill") = Bill;
0
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
27.05.2015, 17:33  [ТС]
спасибо за замечания.

буду наверное менять студию.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.05.2015, 17:33

Создание объекта в процессе выполнения программы
Допустим нужно в процессе выполнения программы показать на форме компонент TImage(который ранее не создан), а затем вывести из памяти. ...

Консоль закрывается в процессе выполнения программы - С++
В Visual Studio в процессе выполнения программы и в процессе работы закрывается через какое- то время консоль, сразу же открывается как...

В процессе выполнения программы открыть ехешник
Доброго времени суток! Необходимо открыть ехешный файл во время выполнения программы. Вот как я хотел сделать: Var x: text; ...

Создание массива в процессе выполнения программы
К примеру нужно в процессе выполнения программы создать массив. Т.е. этот массив не определен заранее. Ситуация - таких массивов может быть...

Создание массивов в процессе выполнения программы
Здравствуйте. Передо мной постала задача такого рода: Есть массив строк определенного размера, который заполняется и когда наполняется...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru