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

Работа со структурами и подструктурами, ввод строки - C++

Восстановить пароль Регистрация
 
Odinochka
0 / 0 / 0
Регистрация: 01.02.2016
Сообщений: 20
10.04.2016, 12:26     Работа со структурами и подструктурами, ввод строки #1
Здравствуйте, уважаемые форумчане.
Мне нужно добавить запись о кафедре в структуру, а если такая существует, то только об одном преподавателе. Добавление кафедры работает, а с преподавателем проблемы.
Поясню код, с 24 по 29 строчки я пытаюсь увеличить количество элементов массива объектов Sostav на 1 (для записи о преподавателе), путем его переопределения и записывания старых значений (массив а), на эти действия компилятор не ругается, но на 31 строчке вылетает исключение из файла iosfwd:
"Вызвано исключение: нарушение доступа для записи.
_Left было 0x730079."
А если ее убрать (31 строчку) и оставить только ввод переменных int(количество лекций и лаб), то программа работает нормально и данные добавляются.
Подскажите, в чем проблема?

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
struct Prepod
{
    string fio;
    int lek;
    int lab;
};
 
struct Kafedra
{
    string namekaf;
    string ayd;
    int kol;
    Prepod *Sostav;     // массив объектов структуры Prepod
};
 
int dobav(Kafedra info[], int N){  // функция добавления записи
    int ch = 0;
    string kaf1;
    cout << "Название кафедры: ";
    getline(cin, kaf1);
    for (int i = 0; i < N; i++)
        if (kaf1 == info[i].namekaf)
        {
            Prepod *a = new Prepod[info[i].kol]; //
            a = info[i].Sostav;
            delete[] info[i].Sostav;
            info[i].Sostav = new Prepod[info[i].kol + 1];
            info[i].Sostav = a;
            delete[] a;
            cout << "ФИО: ";
            getline(cin, info[i].Sostav[info[i].kol + 1].fio);   // та самая строчка
            cout << "Количество часов проводимых лекций: ";
            cin >> info[i].Sostav[info[i].kol + 1].lek;
            cout << "Количество часов проводимых лабораторных занятий: ";
            cin >> info[i].Sostav[info[i].kol + 1].lab;
            ch++;
            info[i].kol++;
        }
    if (ch == 0) {
        info[N].namekaf = kaf1;
        cout << "Номер аудитории: ";
        getline(cin, info[N].ayd);
        cout << "Количество преподавателей: ";
        cin >> info[N].kol;
        info[N].Sostav = new Prepod[info[N].kol];
        for (int i = 0; i < info[N].kol; i++) {
            cin.ignore();
            cout << "ФИО: ";
            getline(cin, info[N].Sostav[i].fio);
            cout << "Количество часов проводимых лекций: ";
            cin >> info[N].Sostav[i].lek;
            cout << "Количество часов проводимых лабораторных занятий: ";
            cin >> info[N].Sostav[i].lab;
        }
        N++;
    }
    return N;
}
 
int main()
{
        //.....
    Kafedra info[15];
        //.....
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2016, 12:26     Работа со структурами и подструктурами, ввод строки
Посмотрите здесь:

C++ Работа со структурами
Работа со структурами C++
Работа со структурами. C++
работа со структурами C++
Работа со структурами C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4266 / 3697 / 1244
Регистрация: 14.04.2014
Сообщений: 14,480
10.04.2016, 13:21     Работа со структурами и подструктурами, ввод строки #2
Сначала надо создать новый массив размером kol+1, затем скопировать туда всё из старого. Где это у тебя?
Odinochka
0 / 0 / 0
Регистрация: 01.02.2016
Сообщений: 20
10.04.2016, 14:04  [ТС]     Работа со структурами и подструктурами, ввод строки #3
Цитата Сообщение от nmcf Посмотреть сообщение
Сначала надо создать новый массив размером kol+1, затем скопировать туда всё из старого. Где это у тебя?
C++
1
2
3
4
5
6
Prepod *a = new Prepod[info[i].kol]; //
a = info[i].Sostav;
delete[] info[i].Sostav;
info[i].Sostav = new Prepod[info[i].kol + 1];
info[i].Sostav = a;
delete[] a;
24-29 строчки
nmcf
4266 / 3697 / 1244
Регистрация: 14.04.2014
Сообщений: 14,480
10.04.2016, 14:24     Работа со структурами и подструктурами, ввод строки #4
И что это? Память выделил в первой строке, а во второй присвоил другое значение - утечка.
Как-то так:
C++
1
2
3
4
5
6
7
8
9
++info[i].kol;
 
Prepod *a = new Prepod[info[i].kol];
 
for (int j = 0; j < info[i].kol - 1; ++j) a[j] = info[i].Sostav[j];
 
delete[] info[i].Sostav;
 
info[i].Sostav = a;
Odinochka
0 / 0 / 0
Регистрация: 01.02.2016
Сообщений: 20
10.04.2016, 22:46  [ТС]     Работа со структурами и подструктурами, ввод строки #5
nmcf, хорошо, согласен, ошибку исправил, но строку все равно ввести не дает, срабатывает исключение
nmcf
4266 / 3697 / 1244
Регистрация: 14.04.2014
Сообщений: 14,480
10.04.2016, 22:48     Работа со структурами и подструктурами, ввод строки #6
Исправил как? Как у меня? Актуальный вариант где?
Odinochka
0 / 0 / 0
Регистрация: 01.02.2016
Сообщений: 20
11.04.2016, 15:18  [ТС]     Работа со структурами и подструктурами, ввод строки #7
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
int dobav(Kafedra info[], int N) {
    cin.ignore();
    int ch = 0;
    string kaf1;
    cout << "Название кафедры: ";
    getline(cin, kaf1);
    for (int i = 0; i < N; i++)
        if (kaf1 == info[i].namekaf)
        {
            ++info[i].kol;
            Prepod *a = new Prepod[info[i].kol];
            for (int j = 0; j < info[i].kol - 1; ++j) 
                a[j] = info[i].Sostav[j];
            delete[] info[i].Sostav;
            info[i].Sostav = a;
            delete[] a;
            cout << "ФИО: ";
            getline(cin, info[i].Sostav[info[i].kol].fio);/////////////////////////////////////////////////////////////
            cout << "Количество часов проводимых лекций: ";
            cin >> info[i].Sostav[info[i].kol].lek;
            cout << "Количество часов проводимых лабораторных занятий: ";
            cin >> info[i].Sostav[info[i].kol].lab;
            ch++;
 
        }
    if (ch == 0) {
        info[N].namekaf = kaf1;
        cout << "Номер аудитории: ";
        getline(cin, info[N].ayd);
        cout << "Количество преподователей: ";
        cin >> info[N].kol;
        info[N].Sostav = new Prepod[info[N].kol];
        for (int i = 0; i < info[N].kol; i++) {
            cin.ignore();
            cout << "ФИО: ";
            getline(cin, info[N].Sostav[i].fio);
            cout << "Количество часов проводимых лекций: ";
            cin >> info[N].Sostav[i].lek;
            cout << "Количество часов проводимых лабораторных занятий: ";
            cin >> info[N].Sostav[i].lab;
        }
        N++;
    }
    return N;
}
Так?
nmcf
4266 / 3697 / 1244
Регистрация: 14.04.2014
Сообщений: 14,480
11.04.2016, 15:20     Работа со структурами и подструктурами, ввод строки #8
16-ю строку убери.
Odinochka
0 / 0 / 0
Регистрация: 01.02.2016
Сообщений: 20
11.04.2016, 15:56  [ТС]     Работа со структурами и подструктурами, ввод строки #9
все равно ошибка
З.ы. Кафедра ИВТиИБ уже есть в структуре
Миниатюры
Работа со структурами и подструктурами, ввод строки  
nmcf
4266 / 3697 / 1244
Регистрация: 14.04.2014
Сообщений: 14,480
11.04.2016, 16:13     Работа со структурами и подструктурами, ввод строки #10
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        if (kaf1 == info[i].namekaf)
        {
            Prepod *a = new Prepod[info[i].kol + 1];
 
            for (int j = 0; j < info[i].kol; ++j) a[j] = info[i].Sostav[j];
 
            delete[] info[i].Sostav;
 
            info[i].Sostav = a;
 
            cout << "ФИО: ";
            getline(cin, info[i].Sostav[info[i].kol].fio);/////////////////////////////////////////////////////////////
            cout << "Количество часов проводимых лекций: ";
            cin >> info[i].Sostav[info[i].kol].lek;
            cout << "Количество часов проводимых лабораторных занятий: ";
            cin >> info[i].Sostav[info[i].kol].lab;
            ch++;
 
            ++info[i].kol;
        }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2016, 18:36     Работа со структурами и подструктурами, ввод строки
Еще ссылки по теме:

Работа со структурами C++
C++ Работа со структурами
Работа со структурами C++

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

Или воспользуйтесь поиском по форуму:
Odinochka
0 / 0 / 0
Регистрация: 01.02.2016
Сообщений: 20
11.04.2016, 18:36  [ТС]     Работа со структурами и подструктурами, ввод строки #11
nmcf, заработало) Спасибо большое, буду разбираться))
Yandex
Объявления
11.04.2016, 18:36     Работа со структурами и подструктурами, ввод строки
Ответ Создать тему
Опции темы

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