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

Динамический массив структур (добавление новой структуры) - C++

18.11.2016, 23:47. Просмотров 274. Ответов 3
Метки нет (Все метки)

Друзья, создаю программу "Библиотека" и запоролся на добавлении структуры к массиву (книги в картотеку, если коротко). Проблема в следующем: когда функция get_sources_from_user переходит к заполнению второго элемента структуры (source_type), программа просто вырубается. Помогите разобраться в чем проблема!
П.С. Я уже погуглил и не раз; просьба туда же не отправлять. Спасибо

Часть кода
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include <ctime>
#include <iomanip>
#include <iostream>
#include <string>
#include <fstream>
#include<windows.h>
 
using namespace std;
 
struct Item
{
    int serial_number;
    string source_type;
    string name;
    string author;
    int year;
    string genre;
    string publisher;
    string is_given;
};
 
#pragma region Show_library
//Вывод библиотеки на экран
void print_source(Item *source)
{
    cout << setw(17) << "Serial number" << " :   " << source->serial_number << endl
        << setw(17) << left << "Type" << " :   " << source->source_type << endl
        << setw(17) << left << "Name" << " :   " << source->name << endl
        << setw(17) << left << "Author" << " :   " << source->author << endl
        << setw(17) << left << "Date" << " :   " << source->year << endl
        << setw(17) << left << "Genre" << " :   " << source->genre << endl
        << setw(17) << left << "Publiher" << " :   " << source->publisher << endl
        << setw(17) << left << "Given to" << " :   " << source->is_given << endl
        << "--------------------------------------------------------------------------------" << endl;
}
 
void print_sources(Item *sources, const int quantity)
{
    //cout << setw(20) << "Book name" << setw(20) << "Author" << setw(15) << "Publisher" << setw(15) << "Genre" << endl;
    cout << "List of sources" << endl << endl;
    for (Item *ptr = sources; ptr < sources + quantity; ++ptr)
    {
        print_source(ptr);
    }
}
#pragma endregion
 
#pragma region Add_source
//заполнение библиотеки пользователем
void get_sources_from_user(Item *source, int index)
{
    source->serial_number = index;
    int type = 0;
    do
    {
        cout << "Choose source type :" << endl
            << "1. Book" << endl
            << "2. Magazine" << endl
            << "3. News paper" << endl << endl
            << "Make a choice : ";
        cin >> type;
    } while (type < 1 || type > 3);
    switch (type)  // в этом месте ломается!!!!!!!!!
    {
    case 1: source->source_type = "book";
        break;
    case 2: source->source_type = "magazine";
        break;
    case 3: source->source_type = "news paper";
        break;
    default:
        cout << "Wrong choice!" << endl;
        break;
    }
    cin.ignore();
    cout << "Type the name of a source : ";
    getline(cin, source->name);
    cout << "Type the author of a source : ";
    getline(cin, source->author);
    cin >> source->year;
    cout << "Type the publisher of a source : ";
    getline(cin, source->publisher);
    cout << "Type the genre of a source : ";
    getline(cin, source->genre);
}
 
void move_source(Item *src, const int count, Item *dst)
{
    for (Item *src_ptr = src, *dst_ptr = dst; src_ptr < src + count; ++dst_ptr, ++src_ptr)
    {
        *dst_ptr = *src_ptr;
        //src_ptr = nullptr;
    }
}
 
Item* AddStruct(Item* source, int *file_size)
{
    int newSize = *file_size + 1;
    if (*file_size == 0)
    {
        source = new Item[newSize];
    }
    else
    {
        Item *new_source = new Item[newSize];
        move_source(source, *file_size, new_source);
 
        get_sources_from_user((new_source + newSize), newSize);
 
        delete[] source;
        source = new_source;
        delete[] new_source;
    }
    *file_size = newSize;
    return source;
}
 
void add_source(Item *sources, int file_size)
{
    char YesOrNot;
    do
    {
        sources = AddStruct(sources, &file_size);
 
        file_size++;
        do
        {
            cout << "Add onather source? (y/n): ";
            cin >> YesOrNot;
            cin.get();
        } while (YesOrNot != 'y' || YesOrNot != 'n');
        if (YesOrNot = 'n')
        {
            save_file(sources, file_size);
        }
    } while (YesOrNot != 'n');
 
    print_source(sources + file_size);
 
}
#pragma endregion
Library.txt
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2016, 23:47
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Динамический массив структур (добавление новой структуры) (C++):

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

Как объявить динамический массив структур, и как выглядит обращение к полям структур по указателю?
Ребята подскажите как объявить динамический массив структур, и как выглядит...

Динамический массив структур
Добрый день. Недавно начал изучать С++. В книге попалась задача в которой...

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

Динамический массив структур
Необходимо создать структуру, и сделать динамический массив структур....

Динамический массив структур
Здравствуйте. Нужна помощь. Не получается записать данные в массив структур....

3
Martein
675 / 86 / 15
Регистрация: 22.06.2014
Сообщений: 182
19.11.2016, 00:14 #2
boshik1983, потому что строкой get_sources_from_user((new_source + newSize), newSize); ты передаёшь указатель за пределы выделенного массива. Это первое. А ещё у тебя ошибка в if (YesOrNot = 'n') { - надо исправить на if (YesOrNot == 'n') {. Пробуй.
1
boshik1983
4 / 4 / 1
Регистрация: 16.06.2016
Сообщений: 21
19.11.2016, 01:09  [ТС] #3
Спасибо огромное, но у меня уже мозг плавятся и я просто не понимаю. Если я прописываю get_sources_from_user((new_source + (newSize - 1)), newSize);, то меня "пускает" до заполнения элемента author. (((
cin.ignore(); не помогает. Ща рехнусь

Добавлено через 29 минут
C++
1
2
Спасибо огромное, но у меня уже мозг плавятся и я просто не понимаю. Если я прописываю get_sources_from_user((new_source + (newSize - 1)), newSize);, то меня "пускает" до заполнения элемента author. (((
cin.ignore(); не помогает. Ща рехнусь
Прошу игнорировать. Протупил.
П.С. Теперь возникли проблемы с записью файла. Кошмар.
0
Martein
675 / 86 / 15
Регистрация: 22.06.2014
Сообщений: 182
19.11.2016, 23:36 #4
boshik1983, ваш пример у меня не скомпилировался по причине отсутствия функции save_file(sources, file_size);. Так что реализуйте её, да.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2016, 23:36
Привет! Вот еще темы с решениями:

Динамический массив структур
Структура «Сотрудник» хранит имя, должность и возраст сотрудника. Структура...

Динамический массив структур
Нужно создать базу данных библиотеки состоящую из структур: книга, автор,...

Динамический массив структур
Нужно сделать динамический массив структур. Задание составить перечень стран и...

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


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

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

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