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

Динамическое размещение массива структур - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.82
pro_mary
1 / 1 / 0
Регистрация: 23.03.2009
Сообщений: 99
05.04.2012, 10:55     Динамическое размещение массива структур #1
В коде ниже создается массив из трех структур cs и инициализируется некими значениями.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "stdafx.h"
#include <iostream>
struct cs
{
    char name[25];
    double w;
    int cal;
};
 
int main()
{
    cs candy[3] =
    {
        {"candy1", 13.7, 457},
        {"cnady2", 15.9, 433},
        {"candy3", 27.4, 987}
    };
 
    return 0;
}
Нужно вместо объявления массива из трех структур cs, использовать new для динамического размещения массива и инициализировать его.
С использованием new понятно:
C++
1
cs * ps = new cs[3];
Вроде бы так.. А вот как инициализировать этот массив?

Спасибо!!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.04.2012, 10:55     Динамическое размещение массива структур
Посмотрите здесь:

C++ Динамическое размещение массива структур
C++ Размещение элементов массива по спирали
Сортировка массива структур C++
Написать программу обработки двумерных массивов, используя динамическое размещение данных C++
Динамическое размещение объекта в определённом месте памяти с последующим её освобождением C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
05.04.2012, 11:03     Динамическое размещение массива структур #2
C++
1
ps[0] = ...
Только так, инициализировать массивы конструктором, если используется new, запрещено стандартом.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
05.04.2012, 11:51     Динамическое размещение массива структур #3
diagon, Ну. не только.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
class C
{
public:
   explicit C(const int val):value(val)
   {
   }
   const int get_value() const { return value; }
private:
   int value;
};
 
int main()
{
   const size_t size = 3;
   C* array = new C[size] {C(1),C(2),C(3)};
   for (size_t i = 0; i < size; ++i)
   {
      std::cout << array[i].get_value() << std::endl;
   }
}
Bash
1
2
3
4
5
forever@pterois:~/My_pro1/cpp_pro$ g++ -o new new.cpp -std=c++0x
forever@pterois:~/My_pro1/cpp_pro$ ./new 
1
2
3
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
05.04.2012, 12:50     Динамическое размещение массива структур #4
Цитата Сообщение от ForEveR Посмотреть сообщение
diagon, Ну. не только.
Ну, я немного другое имел в виду.
Если записать вот так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
struct cs
{
    char name[25];
    double w;
    int cal;
};
 
int main()
{
    cs * candy = new cs[3] (
    {
        {"candy1", 13.7, 457},
        {"cnady2", 15.9, 433},
        {"candy3", 27.4, 987}
    } );
 
    return 0;
}
То получим
Bash
1
test.cpp:16:7: ошибка: ISO C++ запрещает использовать инициализацию при создании массивов с помощью new [-fpermissive]
Хотя, почему в таком случае компилируется ваш пример, не совсем понимаю.
pro_mary
1 / 1 / 0
Регистрация: 23.03.2009
Сообщений: 99
05.04.2012, 21:14  [ТС]     Динамическое размещение массива структур #5
вроде бы компилируется... А в чем может быть ошибка?? Поясните, пожалуйста..
Миниатюры
Динамическое размещение массива структур  
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
06.04.2012, 12:22     Динамическое размещение массива структур #6
diagon,
When the value of the expression in a noptr-new-declarator is zero, the allocation function is called to
allocate an array with no elements. If the value of that expression is less than zero or such that the size
of the allocated object would exceed the implementation-defined limit, or if the new-initializer is a braced-
init-list
for which the number of initializer-clauses exceeds the number of elements to initialize, no storage
is obtained and the new-expression terminates by throwing an exception of a type that would match a
handler (15.3) of type std::bad_array_new_length (18.6.2.2).
Пожалуй единственное что нашел об этом...
Agrik
5 / 5 / 0
Регистрация: 31.03.2013
Сообщений: 120
06.02.2014, 23:39     Динамическое размещение массива структур #7
Как я понял ответа нету?( У меня с ТС одна и та же задача. Надо через new динамически объявить массив и инициализировать. На последнем действии ошибку выдаёт. Вернее как и при статическом объявлении инициализация не проходит и через индексы тоже.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<iostream>
#include<string>
struct CandyBar
{
    char name[30];
    float weight;
    int calor;
    
};
int main()
{
using namespace std;
CandyBar *ps = new CandyBar [3];
 
ps[0]={"Muncha Mon", 17.4, 25};
ps[1]=  {"Body Scru", 35.5, 56};
ps[2]=  {"Dobey Bru", 30.1, 63};
 
delete [] ps;
 
system("PAUSE");
return 0;
}
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,334
Завершенные тесты: 1
07.02.2014, 09:06     Динамическое размещение массива структур #8
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
#include<iostream>
#include<string>
struct CandyBar
{
    char  name[30];
    float weight;
    int   calor;
 
};
int main()
{
using namespace std;
CandyBar *ps = new CandyBar [3];
 
CandyBar static_CandyBar = {"Muncha Mon", 17.4, 25}; // Вот так можно потому, что статические
ps[0] = static_CandyBar;                             //  структуры можно инициализировать конструктором
 
ps[1] = {"Muncha Mon", 17.4, 25};                    // А вот так нельзя потому, что динамические нельзя
 
ps[2].name   = "Dobey Bru";               // Только и остается что поштучно
ps[2].weight = 30.1;                      //
ps[2].calor  = 63;                        //
 
delete [] ps;
 
system("PAUSE");
return 0;
}
Agrik
5 / 5 / 0
Регистрация: 31.03.2013
Сообщений: 120
07.02.2014, 22:19     Динамическое размещение массива структур #9
SatanaXIII, не компилируется код в визуал студио

Добавлено через 6 минут
Пишет что ps[2] должен быть модифицируемым
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
07.02.2014, 22:24     Динамическое размещение массива структур #10
C++
1
ps[2].name   = "Dobey Bru";
так в массив чаров строку не скопировать. нужно какую-нибудь strcpy использовать.
а еще лучше иcпользовать не массив символов, а std::string
Agrik
5 / 5 / 0
Регистрация: 31.03.2013
Сообщений: 120
07.02.2014, 23:54     Динамическое размещение массива структур #11
DU, по заданию нужен динамический массив структур.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
08.02.2014, 00:03     Динамическое размещение массива структур #12
использование внутри структуры std::string name; вместо char name[25] заданию не противоречит.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.02.2014, 15:19     Динамическое размещение массива структур
Еще ссылки по теме:

C++ Reinterpret_cast массива структур
Вектор массива структур C++
Динамическое выделение памяти под массив структур (new/delete) C++

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

Или воспользуйтесь поиском по форуму:
Agrik
5 / 5 / 0
Регистрация: 31.03.2013
Сообщений: 120
09.02.2014, 15:19     Динамическое размещение массива структур #13
Вот, что в итоге получилось:
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
#include<iostream>
#include<string>
struct CandyBar
{
    std::string name;
    float weight;
    int   calor;
 
};
int main()
{
using namespace std;
    
    CandyBar *ps = new CandyBar [3];
    
    ps[0].name= "Muncha Mon";
    ps[0].weight=350.5;
    ps[0].calor=12;
    ps[1].name= "Body Scru";
    ps[1].weight=125.7;
    ps[1].calor=38;
    ps[2].name   = "Dobey Bru";               
    ps[2].weight = 30.1;                      
    ps[2].calor  = 63;                        
    
    cout<<"1 struct: "<<ps[0].name<<", "<<ps[0].weight<<", "<<ps[0].calor<<"."<<endl;
    cout<<"2 struct: "<<ps[1].name<<", "<<ps[1].weight<<", "<<ps[1].calor<<"."<<endl;
    cout<<"3 struct: "<<ps[2].name<<", "<<ps[2].weight<<", "<<ps[2].calor<<"."<<endl;
 
    delete [] ps;
 
system("PAUSE");
return 0;
}
Код полностью рабочий!
Yandex
Объявления
09.02.2014, 15:19     Динамическое размещение массива структур
Ответ Создать тему
Опции темы

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