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

Как объявлять и инициализировать динамические структуры? - C++

Восстановить пароль Регистрация
 
montkay
10 / 10 / 8
Регистрация: 19.02.2014
Сообщений: 72
19.02.2014, 16:42     Как объявлять и инициализировать динамические структуры? #1
С помощью операции new нужно создать массив из трёх элементов структуры. Пытался это сделать, но возникают проблемы из присваиванием значений членам структуры. Был бы признателен и за просто разъяснение, как нужно объявлять такие динамические структуры, а потом устанавливать значение членам структуры.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.02.2014, 16:42     Как объявлять и инициализировать динамические структуры?
Посмотрите здесь:

Динамические структуры C++
Динамические структуры C++
C++ Динамические структуры
Динамические структуры C++
C++ динамические структуры
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
19.02.2014, 16:46     Как объявлять и инициализировать динамические структуры? #2
C++
1
2
T* arr = new T[size]; // T - тип, arr - имя дин.массива, size - кол-во эл-ов.
T* p = &arr[i]; // p - указатель на i-ый элемент массива.
Дальше обращение к полям по указателю:
C++
1
p->имя_поля ...
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6159 / 2888 / 282
Регистрация: 04.12.2011
Сообщений: 7,686
Записей в блоге: 3
19.02.2014, 16:58     Как объявлять и инициализировать динамические структуры? #3
Цитата Сообщение от montkay Посмотреть сообщение
а потом устанавливать значение членам структуры.
Члены могут потребовать выделения памяти. Например если это указатели. А конструктор по умолчанию определён неверно. Покажите код.
montkay
10 / 10 / 8
Регистрация: 19.02.2014
Сообщений: 72
19.02.2014, 17:12  [ТС]     Как объявлять и инициализировать динамические структуры? #4
Вот код, IGPIGP. Компилятор сообщает постоянно об ошибке. Не могу понять - почему.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "stdafx.h"
#include <iostream>
using namespace std;
 
struct CandyBar
{
    const char name[20];
    double weight;
    int calories;
};
 
int main()
{
    CandyBar *pn = new CandyBar [3];
    pn->name = "Mocha Munch";
    pn->weight = 7.9;
    pn->calories = 300;
    return 0;
}
Добавлено через 1 минуту
Спасибо, Tulosba. Сейчас испытаю!
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,039
19.02.2014, 17:19     Как объявлять и инициализировать динамические структуры? #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от montkay Посмотреть сообщение
pn->name = "Mocha Munch";
во первых строки так не копируются используй strcpy
http://ru.wikipedia.org/wiki/Strcpy
во вторых
а к какому элементу ты обращаешься?
эта строчка должна выглядеть так, обращение к первому(нулевому) элементу
C++
1
strcpy(pn[0].name,"Mocha Munch");
соответственно эта
Цитата Сообщение от montkay Посмотреть сообщение
pn->weight = 7.9;
вот так
C++
1
 pn[0].weight = 7.9;
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
19.02.2014, 17:27     Как объявлять и инициализировать динамические структуры? #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от ValeryS Посмотреть сообщение
вот так pn[0].weight = 7.9;
А я уже думал что-то по забыл глядя на
pn->weight = 7.9;
А во вторых ValeryS, вас не смущает что тип у него const char name[20], а не просто char name[20]?
montkay
10 / 10 / 8
Регистрация: 19.02.2014
Сообщений: 72
19.02.2014, 18:03  [ТС]     Как объявлять и инициализировать динамические структуры? #7
ValeryS, Спасибо большое! Просветлили меня =) Сейчас буду пробовать.

Добавлено через 25 минут
ValeryS, скажите ещё пожалуйста, если Вас это не затруднит: как удалить правильно такой динамический массив. Пытался таким способом удалить (ниже), но постоянно выводит "Memory Leaks":

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 "stdafx.h"
#include <iostream>
#include <string.h>
#include <memory.h>
using namespace std;
 
struct CandyBar
{
    char name[20];
    double weight;
    int calories;
};
 
int main()
{
    CandyBar *pn = new CandyBar [3];
    strcpy_s(pn[0].name, "Mocha Munch");
    pn[0].weight = 7.9;
    pn[0].calories = 300;
    strcpy_s(pn[1].name, "Roshen");
    pn[1].weight = 0.9;
    pn[1].calories = 600;
    strcpy_s(pn[2].name, "Gold Key");
    pn[2].weight = 1.5;
    pn[2].calories = 500;
    cout << "Here is the first product " << pn[0].name;
    cout << " and its weight is " << pn[0].weight;
    cout << ".\n It has " << pn[0].calories << " calories." << endl;
    cout << "Here is the second product " << pn[1].name;
    cout << " and its weight is " << pn[1].weight;
    cout << ".\n It has " << pn[1].calories << " calories." << endl;
    cout << "Here is the third product " << pn[2].name;
    cout << " and its weight is " << pn[2].weight;
    cout << ".\n It has " << pn[2].calories << " calories." << endl;
    delete [] pn;
    if (_CrtDumpMemoryLeaks)
        cout << "Memory Leaks" << endl;
    else
        cout << "All good" << endl;
    return 0;
}
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,039
19.02.2014, 18:24     Как объявлять и инициализировать динамические структуры? #8
Цитата Сообщение от mustimur Посмотреть сообщение
А во вторых ValeryS, вас не смущает что тип у него const char name[20], а не просто char name[20]?
меня нет пущай смущает того кто пишет
Цитата Сообщение от montkay Посмотреть сообщение
: как удалить правильно такой динамический массив. Пытался таким способом удалить
все правильно так и удаляется
Цитата Сообщение от montkay Посмотреть сообщение
_CrtDumpMemoryLeaks
а это кто такой?
если ты имеешь ввиду
http://msdn.microsoft.com/ru-ru/library/d41t22sb.aspx
то это функция
следовательно вызывать нужно
C++
1
 _CrtDumpMemoryLeaks( );
но это лишнее
она работает в отладочной версии

Добавлено через 9 минут
вот еще
http://www.rsdn.ru/article/vcpp/leaks.xml
montkay
10 / 10 / 8
Регистрация: 19.02.2014
Сообщений: 72
19.02.2014, 18:36  [ТС]     Как объявлять и инициализировать динамические структуры? #9
ValeryS, эта функция(_CrtDumpMemoryLeaks( )) дает значение true или false. Так как у меня происходит утечка памяти, выводиться "Memory Leaks" в конце программы, а должно выводить "All good". Вот и хотел уточнить, как нужно удалять такие динамические массивы.

Добавлено через 2 минуты
ValeryS, теперь я нашел свою ошибку. Всё работает замечательно. Спасибо за помощь!
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,039
19.02.2014, 18:41     Как объявлять и инициализировать динамические структуры? #10
Цитата Сообщение от montkay Посмотреть сообщение
эта функция(_CrtDumpMemoryLeaks( ))
а теперь сравни
Цитата Сообщение от montkay Посмотреть сообщение
if (_CrtDumpMemoryLeaks)
и внимательно прочитай МСДН
Dumps all the memory blocks in the debug heap when a memory leak has occurred (debug version only).
Сбрасывает все блоки памяти в отладочной куче при утечка памяти произошла (отладочную версию только).
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
19.02.2014, 18:47     Как объявлять и инициализировать динамические структуры? #11
Цитата Сообщение от ValeryS Посмотреть сообщение
меня нет пущай смущает того кто пишет

Не по теме:

Тоже верно

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2014, 18:52     Как объявлять и инициализировать динамические структуры?
Еще ссылки по теме:

C++ Динамические структуры
Динамические структуры C++

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

Или воспользуйтесь поиском по форуму:
montkay
10 / 10 / 8
Регистрация: 19.02.2014
Сообщений: 72
19.02.2014, 18:52  [ТС]     Как объявлять и инициализировать динамические структуры? #12
ValeryS, ранее же написал, что нашел свою ошибку =) Но спасибо, что всем продемонстрировали, где она находиться =)
Yandex
Объявления
19.02.2014, 18:52     Как объявлять и инициализировать динамические структуры?
Ответ Создать тему
Опции темы

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