С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.82
pro_mary
1 / 1 / 0
Регистрация: 23.03.2009
Сообщений: 100
Завершенные тесты: 1
#1

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

05.04.2012, 10:55. Просмотров 2370. Ответов 12
Метки нет (Все метки)

В коде ниже создается массив из трех структур 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];
Вроде бы так.. А вот как инициализировать этот массив?

Спасибо!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.04.2012, 10:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Динамическое размещение массива структур (C++):

Динамическое размещение массива структур - C++
Подскажите пожалуйста, как динамически разместить массив из нескольких структур, используя операцию new??

Динамическое размещение объекта в определённом месте памяти с последующим её освобождением - C++
Доброго времени суток. В C++ имеется возможность размещать объект по чётко определённому, указанному разработчиком, адресу в памяти. В...

Написать программу обработки двумерных массивов, используя динамическое размещение данных - C++
Сформировать вектор из наименьших значений элементов столбцов и найти их среднее арифметическое помогите написать программу..

Динамическое выделение памяти под массив структур (new/delete) - C++
Люди добрые, подскажите пожалуйста, где в моем коде закралась ошибка? Интернет перечитал, во всех примерах код, подобный моему работает, а...

Динамические массивы структур;Классы. Класс массивы структур;Классы. Класс динамического массива структур. - C++
Здраствуйте.Помогите с практичкой мое задание 4.3. Строка таблицы данных содержит следующую информацию о владельцах авто: ф.и.о....

Размещение элементов массива по спирали - C++
Как разместить элементы массива (nxn) по спирали (начиная с нижнего левого угла против часовой стрелки)? Помогите пожалуйста!!((

12
diagon
Higher
1932 / 1198 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
05.04.2012, 11:03 #2
C++
1
ps[0] = ...
Только так, инициализировать массивы конструктором, если используется new, запрещено стандартом.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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
2
diagon
Higher
1932 / 1198 / 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]
Хотя, почему в таком случае компилируется ваш пример, не совсем понимаю.
0
pro_mary
1 / 1 / 0
Регистрация: 23.03.2009
Сообщений: 100
Завершенные тесты: 1
05.04.2012, 21:14  [ТС] #5
вроде бы компилируется... А в чем может быть ошибка?? Поясните, пожалуйста..
0
Миниатюры
Динамическое размещение массива структур  
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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).
Пожалуй единственное что нашел об этом...
1
Agrik
6 / 6 / 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;
}
0
SatanaXIII
Супер-модератор
Эксперт С++
5643 / 2678 / 252
Регистрация: 01.11.2011
Сообщений: 6,574
Завершенные тесты: 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;
}
0
Agrik
6 / 6 / 0
Регистрация: 31.03.2013
Сообщений: 120
07.02.2014, 22:19 #9
SatanaXIII, не компилируется код в визуал студио

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

Передача массива структур в функцию не указывая размера массива - C++
Я читаю с командной строки файл в котором содержится массив структур. Есть библиотека с функцией в которую я прередаю файл и массив...

Сортировка массива структур через сортировку массива указателей - C++
Ошибка возникает в функции void sort(student **ppStud, int k, char ch). Кто видит ошибку - помогите, пожалуйста. Код программы: ...

Обработка массива структур - C++
Всем привет. Помогите найти ошибку. Программа должна вывесть имя младшего ребенка если отца зовоут &quot;ivan&quot; Младший ребенок находится тока...

Сортировка массива структур - C++
не могу понять почему не работает. Программа должна сортануть массив из 10 елементов типа Struct. массив я забиваю из файла. есть...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.