Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
druidich
30 / 30 / 12
Регистрация: 21.05.2012
Сообщений: 443
#1

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

13.03.2015, 19:59. Просмотров 439. Ответов 11
Метки нет (Все метки)

Здравствуйте.
имею такую структуру
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
struct Discipline{
    std::string name;
    int curse;
    int semmestr;
    int time;
    bool otchet; //    true - зачет false - экзамен            
};



вот я инициализирую массив и пытаюсь его заполнить.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main(){
    std::string DiscMass[] = { "math", "geometria", "struct programming", "Discretka", "OC", "Diffure", "logic" };
    int size;
    std::cout << "vvedite k-vo cursov" << std::endl;
    std::cin >> size;
    Discipline *all = (Discipline *)malloc(sizeof(Discipline)*size);
    
    for (int i = 0; i < size; i++){
        all->name = DiscMass[ rand() % 5];
         
        all->semmestr = rand() % 8;
        all->curse = (all[i].semmestr % 2 ? all[i].semmestr / 2 : (all[i].semmestr / 2) + 1);
        all->time = rand() % 52;
        all->otchet = (rand() % 2 == 0 ? true : false);
        all++;
    }
//////

но на строке
C++
1
all->name = DiscMass[ rand() % 5];
у меня вылетает с ошибкой "нарушение прав доступа". подскажите, что я делаю не так ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.03.2015, 19:59
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Динамический массив структуры (C++):

Динамический массив структуры
Согласно следующего задания создать динамический массив структуры. Из М...

Создайте динамический массив указателей на структуры
Задача: дана структура struct Sample { char c; double x; int...

Не объявляется динамический массив с типом структуры
Добрый день! Только начала изучать структуры. Задача такая: сначала вводится...

Динамический массив структур (добавление новой структуры)
Друзья, создаю программу &quot;Библиотека&quot; и запоролся на добавлении структуры к...

Динамический массив структуры в качестве параметра функции
Привет! Нужна помощь ( Есть структура struct Embedded { double density;...

Реализовать динамический массив структур внутри динамической структуры
Добрый вечер! Я никак не могу реализовать динамический массив структур внутри...

11
zss
Модератор
Эксперт С++
6950 / 6512 / 4133
Регистрация: 18.12.2011
Сообщений: 17,173
Завершенные тесты: 1
13.03.2015, 21:05 #2
Цитата Сообщение от druidich Посмотреть сообщение
)malloc
Для АТД типа string не подходит. Используйте new
или замените на массив char фиксированного размера.
1
druidich
30 / 30 / 12
Регистрация: 21.05.2012
Сообщений: 443
13.03.2015, 21:17  [ТС] #3
zss, эм. а вы не можете подсказать более-менее безболезный выход из данной сситуации ?
ибо у меня требования:
Кликните здесь для просмотра всего текста
"Динамическая память должна быть использована во всех случаях, когда требуется хранение информации об указанных объектах . При этом ограничения на количество обрабатываемых программой объектов, указанные в задании , считать недействительными . Использование динамической памяти должно быть экономным, т.е .в любой
момент времени размер блока памяти должен соответствовать количеству обрабатываемых объектов. При завершении работы программы вся выделенная ей динамическая память должна быть освобождена.
0
Mistik
19 / 19 / 14
Регистрация: 25.02.2015
Сообщений: 138
13.03.2015, 21:18 #4
Цитата Сообщение от druidich Посмотреть сообщение
"Динамическая память должна быть использована во всех случаях, когда требуется хранение информации об указанных объектах . При этом ограничения на количество обрабатываемых программой объектов, указанные в задании , считать недействительными . Использование динамической памяти должно быть экономным, т.е .в любой
момент времени размер блока памяти должен соответствовать количеству обрабатываемых объектов. При завершении работы программы вся выделенная ей динамическая память должна быть освобождена.
По другому никак, либо использовать char*, либо со string использовать new.
1
druidich
30 / 30 / 12
Регистрация: 21.05.2012
Сообщений: 443
14.03.2015, 08:47  [ТС] #5
Добрый день. продолжаю изучать динамические массивы. но почему то массив неправильно заполняется. подскажите, в чем проблема ?
сама структурка
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
struct Discipline{
    char  name[20];
    int curse;
    int semmestr;
    int time;
    bool otchet; //    true - зачет false - экзамен            
};

а вот её заполнение
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main(){
    char  DiscMass[20][20] = {  "math", "geometria" ,  "struct programming" , "Discretka" , "OC" , "Diffure" , "logic" };
    int size, newSize;
    std::cout << "vvedite k-vo cursov" << std::endl;
    std::cin >> size;
    Discipline *all;
    all = (Discipline *)malloc(sizeof(Discipline)*size);
    Discipline one ;
    for (int i = 0; i < size; i++){
        int k = rand() % 5;
 
        for (int i = 0; i < 20; i++)
        all->name[i] = DiscMass[i][k];
         
        all->semmestr = rand() % 8;
        all->curse = (all->semmestr % 2 ? all->semmestr / 2 : (all->semmestr / 2) + 1);
        all->time = rand() % 52;
        all->otchet = (rand() % 2 == 0 ? true : false);
        
        all++;
    }
0
zss
Модератор
Эксперт С++
6950 / 6512 / 4133
Регистрация: 18.12.2011
Сообщений: 17,173
Завершенные тесты: 1
14.03.2015, 09:36 #6
Вот тут перепутаны индексы (k- номер строки, первый индекс):
C++
1
2
 for (int i = 0; i < 20; i++)
           all->name[i] = DiscMass[k][i];
но лучше так
C++
1
strcpy(all->name, DiscMass[k]);
1
druidich
30 / 30 / 12
Регистрация: 21.05.2012
Сообщений: 443
14.03.2015, 09:44  [ТС] #7
zss,какая то ересень. так и продолжает выводить не то что в него кладу
0
Изображения
 
zss
Модератор
Эксперт С++
6950 / 6512 / 4133
Регистрация: 18.12.2011
Сообщений: 17,173
Завершенные тесты: 1
14.03.2015, 09:56 #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
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <ctime>
struct Discipline
{
    char  name[20];
    int curse;
    int semmestr;
    int time;
    bool otchet; //    true - зачет false - экзамен            
};
int main()
{
    char  DiscMass[20][20] = {  "math", "geometria" ,  "struct programming" , "Discretka" , "OC" , "Diffure" , "logic" };
    std::cout << "vvedite k-vo cursov" << std::endl;
    int size;std::cin >> size;
    Discipline *all=new Discipline[size];
    Discipline *p;
    srand((unsigned)time(NULL));
    for (p=all; p!=all+size; ++p)
    {
        int k = rand() % 5;
        strcpy(p->name, DiscMass[k]);
        p->semmestr = rand() % 8;
        p->curse = (p->semmestr % 2 ? p->semmestr / 2 : p->semmestr / 2 + 1);
        p->time = rand() % 52;
        p->otchet = (rand() % 2 == 0);
    }
 
    for (p=all; p!=all+size; ++p)
    {
        std::cout<<p->name<<std::endl;
    }
    delete[] all;
    system("pause");
    return 0;
}
0
druidich
30 / 30 / 12
Регистрация: 21.05.2012
Сообщений: 443
14.03.2015, 10:44  [ТС] #9
zss, у меня так раньше было ) я теперь пытаюсь сделать нормально, работая с памятью. но не получается
0
zss
Модератор
Эксперт С++
6950 / 6512 / 4133
Регистрация: 18.12.2011
Сообщений: 17,173
Завершенные тесты: 1
14.03.2015, 12:29 #10
Это работа с памятью:
Цитата Сообщение от zss Посмотреть сообщение
Discipline *all=new Discipline[size];
Это работа с указателями:
Цитата Сообщение от zss Посмотреть сообщение
Discipline *p;
for (p=all; p!=all+size; ++p)
ЧЧего еще не хватает?
1
Mistik
19 / 19 / 14
Регистрация: 25.02.2015
Сообщений: 138
14.03.2015, 12:34 #11
Цитата Сообщение от druidich Посмотреть сообщение
zss, у меня так раньше было ) я теперь пытаюсь сделать нормально, работая с памятью. но не получается
почему Вы именно тянетесь к malloc()? Если оператор new более устойчив...?
0
kravam
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
14.03.2015, 15:13 #12
Проблема как я понимаю, в этой строке:

C++
1
all->name = DiscMass[ rand() % 5];
ТС, ситуация обстоит следующим образом. Ты работаешь со строкой all->name, строка это объект типа string. Так вот, на момент написани этой строчки строка у тебя НЕ СОЗДАНА.

При создании какого-нибудь объекта должен вызываться КОНСТРУКТОР. Для строк это свой, строчный конструктор. Вызывается он НЕЯВНО. То есть ты его вызов нигде не прописываешь, но он в момент создания объекта всё равно вызывается. Что он делает- я понятия не имею (это к умным). Но вызываться он должен. Если он не вызван, то можно сказать, что объект (в данном случае строка all->name) не создан и работа с ним не приведёт ни к чему хорошему.

Давай напишем код попроще. Определим свой, авторский тип foo. Определим в нём явно конструктор. Затем повторим твои действия- сделаем структурку какую-нибудь- аналог Discipline, сделаем одно из её полей- объектом нашего типа. Выделим память под структуру, и посмотрим, вызовется ли конструктор определённого нами типа:

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
49
50
51
52
53
#include <windows.h>
#include <stdio.h>
 
//////////////////////////////////////////////////////
 
//вот создаём авторский объект (а-ля string)
class foo
{
 
 public: 
 foo() 
 {
  printf ("вызов конструктора\n");
 }
 
 void bar ()
 {
  printf ("просто вызов функции\n");
 } 
 
};
 
//////////////////////////////////////////////////////
//а это наша структура
struct Discipline
{
 foo f;
};
 
//////////////////////////////////////////////////////
 
int main(){
    
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 
   
   //Создание объекта (конструктор ВЫЗЫВАЕТСЯ) и вызов функции, всё ОК
   foo k;
   k.bar ();
 
   //А вот иммитация твоих действий, выделение памяти под структуру
   //создание (якобы) объекта all->f и вызов функции all->f(bar);  
   Discipline* all= (Discipline*) malloc (sizeof(Discipline));  
   all->f.bar();
 
   free (all); 
 
   getchar ();
 
}
 
//////////////////////////////////////////////////////
Вот если ты запустишь код, то увидишь, что во втором случае констуктор f не вызовется. Можно ли работать с all->f? Нет нельзя. Но почему же в таком случае вызывается all->f.bar()? При желании можно ответить и на этот вопрос. Вкратце можно сказать, что мы же хотели обмануть компилятор приведением типа:

C++
1
(Discipline*) malloc (sizeof(Discipline));
Мы и обманули- у нас получилс вызов bar... В общем, конструктор не вызвался, объект не создался. То же и в твоём случае: конструктор не вызван и работать со строкой all->name- неправильно
Так, а вот как раз применение new и устраняет этот нюанс, объект именно что создаётся (вызывается конструктор). Добавь в мой код

C++
1
 Discipline* all_= new Discipline;
И увидишь это сам (вызовется констркутор). Не забудь освободить память.

Для решения твоей задачи я бы использовал new

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Не по теме:

Цитата Сообщение от Mistik Посмотреть сообщение
почему Вы именно тянетесь к malloc()? Если оператор new более устойчив...?
Это не ответ. Он так делает потому, что у него в книге так написано- malloc выделяет память.

0
14.03.2015, 15:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2015, 15:13
Привет! Вот еще темы с решениями:

Создать динамический класс Book, содержащий динамический массив Authors
Мне нужно написать программу,а я не знаю как ее написать. Знаю, тут люди за ...

Запись структуры данных в файл. Динамический список
Первый вопрос. Программа вроде бы пишет в файл. Читает из файла тоже...

Можно ли в классе создавать массив переменной длинны. Например динамический массив?
Динамические массивы привлекают больше. :)

Скопировать динамический массив в другой массив только с положительными элементами из первого
Пользователь вводит размер массива и сам массив. Программа копирует в другой...


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

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

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