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, 22:13 2
Цитата Сообщение от use_man Посмотреть сообщение
C++
1
using namespace std;
почему она в мейн??
Цитата Сообщение от use_man Посмотреть сообщение
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
* * };
Кто вам сказал что так можно делать?
0
112 / 91 / 31
Регистрация: 24.10.2018
Сообщений: 336
25.10.2018, 22:15 3
Цитата Сообщение от use_man Посмотреть сообщение
CandyBar* pk[3];
Ты объявил массив указателей. При этом сами указатели не инициализированы ничем и указывают в никуда. И потом инициализация initalizer list'ом не реализована в твоей структуре.
0
1 / 1 / 4
Регистрация: 25.02.2016
Сообщений: 48
25.10.2018, 22:27 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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include "stdafx.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] = new CandyBar;
    pk[1] = new CandyBar;
    pk[2] = new CandyBar;
 
    *pk[0] = {
        "roshen",
        25.5f,
        800
    };
    *pk[1] = {
        "WKK",
        27.5f,
        750
    };
    *pk[2] = {
        "Svitoch",
        30.2f,
        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[0];
    delete pk[1];
    delete pk[2];
    delete ps;
    return 0;
}
Что думаете, господа?)
Хотя, инициализатор CandyBar лучше заменить на вызов конструктора
C++
1
new CandyBar("vasa",12.5,22);
0
0 / 0 / 0
Регистрация: 06.04.2016
Сообщений: 22
25.10.2018, 22:30  [ТС] 5
using namespace std; - находиться в main потому что только там использую элементы которые принадлежат пространству имен std.
Цитата Сообщение от Azazel-San Посмотреть сообщение
Кто вам сказал что так можно делать?
Я предположил что если создать массив указателей на динамическую структуру то это будет равносильно массиву динамических структур (разве не так ?).


А вообще задача была подана таким образом :
Создайте массив структур с 3 элементов и заполните их а потом переделайте программу с использованием NEW для выделения памяти под структуру .

И вот после выделения памяти с помощью new я и начал думать как создать массив структур в той выделенной памяти .
0
308 / 220 / 74
Регистрация: 23.05.2011
Сообщений: 981
25.10.2018, 22:35 6
Цитата Сообщение от Azazel-San Посмотреть сообщение
почему она в мейн??
Вообще-то, ТС делает всё правильно, в отличие от многих авторов учебников.

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
int main()
{
    using namespace std;
    CandyBar pk[3];
    pk[0] = CandyBar{
        "roshen",
        25.5,
        800
        };
    pk[1] = CandyBar{
        "WKK",
        27.5,
        750
    };
    pk[2] = CandyBar{
        "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;
    return 0;    
}
0
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
25.10.2018, 22:38 7
Цитата Сообщение от krolligator Посмотреть сообщение
И потом инициализация initalizer list'ом не реализована в твоей структуре
И??
Цитата Сообщение от use_man Посмотреть сообщение
Я предположил что если создать массив указателей на динамическую структуру то это будет равносильно массиву динамических структур (разве не так ?).
Простите что? Я даже не хочу вникать в смысл сообщения, но скажу - нет, не так.
Цитата Сообщение от use_man Посмотреть сообщение
в той выделенной памяти
Да, но размер какой этой памяти?

Добавлено через 1 минуту
Цитата Сообщение от New man Посмотреть сообщение
всё правильно
Да? А он знает почему? А почему это вообще лучше не юзать?
0
0 / 0 / 0
Регистрация: 06.04.2016
Сообщений: 22
25.10.2018, 22:40  [ТС] 8
Цитата Сообщение от Dead_Blue Посмотреть сообщение
Что думаете, господа?)
именно это я и провтыкал :
C++
1
2
3
pk[0] = new CandyBar;
pk[1] = new CandyBar;
pk[2] = new CandyBar;
Спасибо , но у меня вопрос : почему нельзя сразу указать new CandyBar для всех элементов массива указателей pk , а поочередно инициализировать их ?
0
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
25.10.2018, 22:42 9
use_man,
C++
1
CandyBar* pk[3] = { new CandyBar, new CandyBar, new CandyBar };
1
308 / 220 / 74
Регистрация: 23.05.2011
Сообщений: 981
25.10.2018, 22:47 10
Лучший ответ Сообщение было отмечено use_man как решение

Решение

Цитата Сообщение от use_man Посмотреть сообщение
CandyBar* pk[3];
Это массив указателей, а не КэндиБаров.
Если хочешь делать именно так, как ты написал, надо проинициализировать каждый указатель:
C++
1
2
pk[0] = new CandyBar();
*pk[0] = CandyBar{...};
Цитата Сообщение от use_man Посмотреть сообщение
delete[] pk, ps;
С точки зрения языка тут происходят две операции:
C++
1
2
delete[] pk;
ps; // Тут просто ничего не происходит.
Надо писать так:
C++
1
2
3
delete ps;
for(size_t i = 0; i<3; ++i)
   delete pk[i];
В третьих, если так хочется закинуть данные в кучу, то надо делать динамический массив, а не статический массив указателей:

C++
1
2
3
4
5
6
CandyBar* candies = new CandyBar[3];
candies[0] = CandyBar{...};
 
.... 
 
delete[] candies; // Удалены все три
С помощью delete удаляем всё, что было выделено как new T()
С помощью delete[] удаляем всё, что было выделено как new T[x]

Добавлено через 2 минуты
Цитата Сообщение от use_man Посмотреть сообщение
почему нельзя сразу указать new CandyBar для всех элементов массива указателей pk
Можно, но смысла в этом никакого. Разве что если CandyBar — очень крупная структура, а ты хочешь часто модифицировать массив (сортировать, например). Тогда вместо КэндиБаров будут копироваться указатели на них, которые по сути просто 8 байт.

Добавлено через 2 минуты
Цитата Сообщение от Azazel-San Посмотреть сообщение
А почему это вообще лучше не юзать?
В чём проблема использования using namespace std; внутри функции? Это нормально.
1
112 / 91 / 31
Регистрация: 24.10.2018
Сообщений: 336
25.10.2018, 22:53 11
Цитата Сообщение от Azazel-San Посмотреть сообщение
И??
Иииии это значит, что в тако случае фокус с = {a,b,c,d} не сработает.
0
0 / 0 / 0
Регистрация: 06.04.2016
Сообщений: 22
25.10.2018, 22:56  [ТС] 12
New man,
большое спасибо за разъяснение этой ситуации . По поводу элемента
C++
1
delete [] pk;
читал книгу Прата и там указывался такой способ очистки целого массива , думал что и тут выйдет очистить весь массив.

Так же хотел уточнить по поводу уже возникшей ситуации с using namespace std;

Цитата Сообщение от New man Посмотреть сообщение
Вообще-то, ТС делает всё правильно, в отличие от многих авторов учебников.
Цитата Сообщение от Azazel-San Посмотреть сообщение
Сообщение от New man
всё правильно
Да? А он знает почему? А почему это вообще лучше не юзать?
что имелось ввиду ?
0
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
25.10.2018, 22:58 13
krolligator,
C++
1
2
3
4
5
6
7
8
9
10
11
struct bar
{
    char   str[4];
    int    integer;
    double real;
} obj {"s", 0xFF, 3.14};
 
int main()
{
    std::cout << obj.str << " " << obj.integer << " " << obj.real;
}
0
112 / 91 / 31
Регистрация: 24.10.2018
Сообщений: 336
25.10.2018, 23:00 14
Azazel-San, в этом примере нет = {a,b,c}. отдыхай.
0
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
25.10.2018, 23:00 15
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <cstring>
#include <string>
 
struct bar
{
    char   str[4];
    int    integer;
    double real;
} obj { { 'a', 'b', 'c', '\0' }, 0xFF, 3.14 };
 
int main()
{
    std::cout << obj.str << " " << obj.integer << " " << obj.real;
}
0
112 / 91 / 31
Регистрация: 24.10.2018
Сообщений: 336
25.10.2018, 23:00 16
Azazel-San, тоже не такой пример. У автора было написано:
*pk[0] = {...}
А ты пишешь совершенно другой код с инициализацией, а не присваиванием. Зачем тебе это надо? Вроде не глупый человек.
0
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
25.10.2018, 23:02 17
Цитата Сообщение от krolligator Посмотреть сообщение
в этом примере нет = {a,b,c}
аргумент
0
112 / 91 / 31
Регистрация: 24.10.2018
Сообщений: 336
25.10.2018, 23:06 18
Цитата Сообщение от Azazel-San Посмотреть сообщение
аргумент
Конечно, аргумент. Ты пишешь мне свой код в вакууме. В то время как я отвечал на вполне конкретный код автора. Откуда вы только беретесь...осенняя амнистия, что ли, в психушке....
0
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
25.10.2018, 23:08 19
Цитата Сообщение от krolligator Посмотреть сообщение
А ты пишешь совершенно другой код с инициализацией, а не присваиванием.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <cstring>
#include <string>
 
struct bar
{
    char   str[4];
    int    integer;
    double real;
};
 
int main()
{
    bar* arr[3] = { new bar, new bar, new bar };
    *arr[0] = { { 'a', 'b', 'c', '\0' }, 0xFF, 3.14 };
    std::cout << arr[0]->str << " " << arr[0]->integer << " " << arr[0]->real;
}
Добавлено через 20 секунд
krolligator, как у аффтара
0
112 / 91 / 31
Регистрация: 24.10.2018
Сообщений: 336
25.10.2018, 23:12 20
Azazel-San, вот это я понимаю разговор! Гуд. Вот так:
C++
1
*arr[0] = { "aaa", 0xFF, 3.14 };
Будет в точности как у автора.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.10.2018, 23:12
Помогаю со студенческими работами здесь

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

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

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

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


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

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

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