0 / 0 / 0
Регистрация: 06.04.2016
Сообщений: 22
1

Непонятный вывод программы после инициализации структуры

25.10.2018, 21:57. Показов 1780. Ответов 45

В общем буду краток , написал программу , она выполнилась , но не так как надо и пока что не могу понять почему , считаю что что-то с памятью намудрил . Вот :
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
#include "pch.h"
#include <iostream>
#include <cstring>
#include <string>
 
struct CandyBar
{
    char name[20];
    float weight;
    int kal;
 
};
int main()
{
    using namespace std;
    CandyBar* ps = new CandyBar;
    CandyBar* pk[3];
    *pk[0] = {
        "roshen",
        25.5,
        800
        };
    *pk[1] = {
        "WKK",
        27.5,
        750
    };
    *pk[2] = {
        "Svitoch",
        30.2,
        990
    };
    
    cout << "Name:   " << pk[0]->name << "---" << pk[1]->name << "---" << pk[2]->name << endl
         << "Weight: " << pk[0]->weight << "---" << pk[1]->weight << "---" << pk[2]->weight << endl
         << "Kal:    " << pk[0]->kal << "---" << pk[1]->kal << "---" << pk[2]->kal << endl;
    delete[] pk, ps;
    return 0;
 
    
}
Вот результат выполнения программы :
Непонятный вывод программы после инициализации структуры
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.10.2018, 21:57
Ответы с готовыми решениями:

Непонятный вывод структуры через функцию
#include &lt;cstdlib&gt; #include &lt;iostream&gt; using namespace std; struct st { char name; ...

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

Непонятный вывод программы
помогите найти ошибку. почему пишет age а не 100?? Создавайте отдельные темы для ваших вопросов

Вывод структуры после сортировки
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; #include &lt;string.h&gt; #include...

45
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
25.10.2018, 23:13 21
Цитата Сообщение от krolligator Посмотреть сообщение
Будет в точности как у автора.
без разницы, это ничего не меняет..
0
112 / 91 / 31
Регистрация: 24.10.2018
Сообщений: 336
25.10.2018, 23:17 22
Цитата Сообщение от Azazel-San Посмотреть сообщение
без разницы, это ничего не меняет..
Разница есть. Такой код компилироваться не будет.
0
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
25.10.2018, 23:22 23
krolligator, https://wandbox.org/permlink/u2DXSWanx5mFXErR


Добавлено через 49 секунд
krolligator, только gcc немного поругался) но потом исправился)
0
112 / 91 / 31
Регистрация: 24.10.2018
Сообщений: 336
25.10.2018, 23:26 24
Код
main.cpp:15:36: error: no match for ‘operator=’ (operand types are ‘bar’ and ‘<brace-enclosed initializer list>’)
     *arr[0] = { "aaa" , 0xFF, 3.14 };


Добавлено через 56 секунд
Цитата Сообщение от Azazel-San Посмотреть сообщение
только gcc немного поругался) но потом исправился)
Да, та же фигня. Только исправляться не хочет )

Добавлено через 39 секунд
Кстати, шланг проглатывает.
0
Azazel-San
25.10.2018, 23:26
  #25

Не по теме:

krolligator, :rofl:
я же скинул ссылку, все компилится или в глаза вакуум попал?

0
112 / 91 / 31
Регистрация: 24.10.2018
Сообщений: 336
25.10.2018, 23:29 26
По ссылке не тот код, который я писал.
0
691 / 100 / 17
Регистрация: 22.06.2014
Сообщений: 214
25.10.2018, 23:31 27
krolligator, давайте вылазьте из криокамеры и прочитайте Главу 3.1 Скотта Мейерса "Эффективного и современного C++11 и C++14". Начиная с C++11 принята унифицированная форма инициализации, и она имеет вид = {..., ...}, такие дела.

krolligator, скормите компилятору ключ -std=c++11

Вот что он пишет, кстати: "Для устранения путаницы из-за нескольких синтаксисов инициализации и решения проблемы охвата всех сценариев инициализации С++ 11 вводит унифицированную инициализацию (uniform initialization): единый синтаксис инициализации, который может, как минимум концептуально, использоваться везде и выражать все. Он основан на фигурных скобках, и по этой причине я лично предпочитаю термин "фигурная инициализация" (braced initialization). Унифицированная инициализация - это идея. Фигурная инициализация - это синтаксическая конструкция. Фигурная инициализация позволяет выразить то, что было невозможно выразить ранее. С помощью фигурных скобок легко указать начальное содержимое массива." (с)
0
112 / 91 / 31
Регистрация: 24.10.2018
Сообщений: 336
25.10.2018, 23:34 28
Ваккум в глаза попал тому, кто видит код, потом его переделывает и говорит: вот же, все работает. Такая глупость меня уже утомила порядком. Я завязываю.
Цитата Сообщение от Martein Посмотреть сообщение
Начиная с C++11 принята унифицированная форма инициализации, и она имеет вид = {..., ...}, такие дела.
Эта форма инициализации. Когда уже есть объект, то = {...} это не инициализация. Почитай внимательно, о чем человек пишет.
Цитата Сообщение от Martein Посмотреть сообщение
скормите компилятору ключ -std=c++11
да хоть с++17. Это не инициализация. Объект уже существует.
0
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
25.10.2018, 23:37 29
Цитата Сообщение от krolligator Посмотреть сообщение
потом его переделывает
ок
https://wandbox.org/permlink/A1OOKdmrnLaVtW4a
компилится же?
Цитата Сообщение от krolligator Посмотреть сообщение
Такая глупость меня уже утомила порядком
Действительно, смысла дальше разговаривать нету.
0
112 / 91 / 31
Регистрация: 24.10.2018
Сообщений: 336
25.10.2018, 23:41 30
Про шланг я уже писал, что шланг скомпилит. Только для кода воспринимаемого большинством популярных компиляторов надо писать свой оператор присваивания или инициализации. По факту. Как я и писал в самом начале.

Добавлено через 45 секунд

Не по теме:

Цитата Сообщение от Azazel-San Посмотреть сообщение
Действительно, смысла дальше разговаривать нету.
Лучше было это понять, когда ты писал "И??".

0
308 / 220 / 74
Регистрация: 23.05.2011
Сообщений: 981
25.10.2018, 23:41 31
Цитата Сообщение от use_man Посмотреть сообщение
читал книгу Прата и там указывался такой способ очистки целого массива , думал что и тут выйдет очистить весь массив.
Смотри.
new T[x] создаёт массив с элементами типа T длины x в куче.
delete удаляет ровно один выделенный с помощью new T() объект на куче. А delete[] удаляет массив на куче, который был выделен с помощью new T[].
С помощью delete[] нельзя удалять статические массивы, которые объявляются как T arr[n]; или T arr[] = {}; Эти массивы удаляются сами при выходе из функции, например.


Цитата Сообщение от use_man Посмотреть сообщение
Так же хотел уточнить по поводу уже возникшей ситуации с using namespace std;
using namespace std; означает, что мы делаем доступными все имена, обозначенные в пространстве имён std. Проблема в том, что в пространстве X могут быть точно такие же имена, что и в std, из-за чего будет происходить конфликты имён и код не будет компилироваться.
Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
namespace Geometry{
   struct vector{
       float x;
       float y;
   }
}
#include <vector>
using namespace std;
using namespace Geometry;
 
vector a; // Это какой вектор? Из std или из Geometry?
std::vector<int> arr; // Точно из std
Geometry::vector point; // Точно из Geometry
Особенно это актуально для файлов-заголовков (с расширением *.h), которые включаются с помощью #include "name.h"
Во время такого включения весь код из него копируется в файл, в котором написано #include То есть, конфликты будут везде. Обычно такое бывает, когда берёшь две плохо написанные библиотеки, например, в каждом из которых недалёкие авторы использовали using namespace x; снаружи функций в заголовках.

Почему я говорю, что такое приемлимо в функциях?
Потому что пространство имён доступно только внутри scope (фигурные скобки), где объявлено

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// тут невключены имена из std
int func()
{
    using namespace std;
    // Тут внутри фигурных скобок включены
    // А вот из Geom не включены
    {
        using namespace Geom;
        // Теперь тут доступны и Geom, и std
    }
    // Опять доступен только std
    // А элементам Geom можно обратиться так:
   Geom::vector point;
}
// тут тоже невключены
Общая рекомендация:
1) Желательно писать полное имя: std::cout
2) Если неймспейсы слишком длинные, можно делать псевдоним для них:
C++
1
2
namespace mb = boost::multidigit;
mb::int128 my_var;
// Дальнейшее можно только в CPP!
3) Используй using имя: using std::cout; cout<<"Hello";
4) Используй using namespace std; только внутри функций.
1
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
25.10.2018, 23:48 32
krolligator, msvc тоже проглотит, все верно вы написали, да только не совсем точно было указано в чем проблема , под предлогом просто не скомпилится именно такой код) пис вам
0
0 / 0 / 0
Регистрация: 06.04.2016
Сообщений: 22
26.10.2018, 00:43  [ТС] 33
New man, все понял , спасибо , учту в дальнейшем .
0
16082 / 8684 / 2120
Регистрация: 30.01.2014
Сообщений: 14,968
26.10.2018, 01:33 34
Цитата Сообщение от Azazel-San Посмотреть сообщение
почему она в мейн??
А что, нельзя?
0
Azazel-San
26.10.2018, 07:54
  #35

Не по теме:

DrOffset, уж совсем меня за дурака держите?

0
DrOffset
26.10.2018, 08:46
  #36

Не по теме:

Цитата Сообщение от Azazel-San Посмотреть сообщение
уж совсем меня за дурака держите?
Думаете фигню написать только дурак может?
Если бы я вас за дурака считал, я бы вам вообще ничего не писал, потому что, как известно, дуракам ничего нельзя объяснить.

А вообще, я это написал потому, что меня просто убивают такие ответы, приходит человек с UB в коде, а ему: "у тебя using namespace std в неположенном месте!".

0
Azazel-San
26.10.2018, 08:54
  #37

Не по теме:

DrOffset, а где UB? Я ещё не настолько хорош(( а неймспейс просто в глаза кинулся в таком месте, чисто ничего против не имею, но.. и я не говорил что не в положенном ((

0
16082 / 8684 / 2120
Регистрация: 30.01.2014
Сообщений: 14,968
26.10.2018, 09:27 38
Azazel-San, Вот здесь
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    CandyBar* pk[3];
    *pk[0] = {
        "roshen",
        25.5,
        800
        };
    *pk[1] = {
        "WKK",
        27.5,
        750
    };
    *pk[2] = {
        "Svitoch",
        30.2,
        990
    };
pk - это массив указателей. Но указатели ничем не инициализированы. Тем не менее, они разыменовываются и этим значениям присваиваются какие-то объекты. Вот это и есть UB.

Собственно, во втором ответе об этом уже сказали.

Добавлено через 1 минуту
Цитата Сообщение от Azazel-San Посмотреть сообщение
а неймспейс просто в глаза кинулся в таком месте
Чем более локализован using namespace, тем лучше. Так что то, что он в функции - это наоборот плюс. Хоть может автор это и неосознанно сделал. Впрочем, об этом тоже уже выше сказали.
1
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
26.10.2018, 10:19 39
Цитата Сообщение от DrOffset Посмотреть сообщение
Вот это и есть UB.
об этом я сказал тоже, ну только не сказал что это UB. Т.е. это не предсказуемое поведение, если верно понял?
Цитата Сообщение от DrOffset Посмотреть сообщение
Чем более локализован using namespace, тем лучше.
Не спорю, но писать его в каждой функции такое себе удовольствие, да и мне кажется писать std:: не так уж и зашкварно, имхо.
Цитата Сообщение от DrOffset Посмотреть сообщение
Впрочем, об этом тоже уже выше сказали.
Ну вот и это разобрали, помоему одни плюсы

Не по теме:

DrOffset, зы спасибо за ответы и советы

0
16082 / 8684 / 2120
Регистрация: 30.01.2014
Сообщений: 14,968
26.10.2018, 10:31 40
Цитата Сообщение от Azazel-San Посмотреть сообщение
Не спорю, но писать его в каждой функции такое себе удовольствие, да и мне кажется писать std:: не так уж и зашкварно, имхо.
Да, это на самом деле общий вопрос. Т.е. конкретно std:: писать лучше явно, ну, по крайней мере это распространенная практика при профессиональной разработке. А вот с другими namespace могут быть нюансы. Если у нас есть какой-нибудь вложенный namespace или просто длинное имя. Вот его использование лучше локализовать по максимуму - в этом случае функция, или даже конкретный блок нормально подходят. Короче, посыл в том, что глобальная область для using namespace - это последнее, где он должен оказаться.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.10.2018, 10:31
Помогаю со студенческими работами здесь

Объяснить работу программы (структуры, файловый ввод/вывод)
объясните программу чему равняется v0??? и зачем int v=111??? #include &lt;iostream&gt; #include...

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

Ошибка после завершения программы. Двоичные файлы. Структуры
Программа работает нормально по записи в двоичный файл и считывании с него, но одна проблема...

Непонятный размер объявленной структуры
Даже если отключить выравнивание границ структуры struct ConfigMenuItem { char Litera; // 1...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru