Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 03.04.2016
Сообщений: 11

Динамический массив указателей(не пойму в чем ошибка в коде)

03.04.2016, 18:59. Показов 813. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
есть код:
При попытки записи данных слетает на инициализации name..не могу понять,или память неправильно объявляю,или что другое...
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
#include <iostream>
#include "archive.h"
using namespace std;
static int col;
 
 
void main()
{
    setlocale(LC_ALL, "rus");
    cout << "Введите будущее количество записей:" << endl;
    cin >> col;
    system("cls");
    biblio **p = new biblio*[col];  //выделяется массив указателей.
    for (int i = 0; i != col; ++i)
    {
        p[i]->menu(p,col,i);//заполнение указателей
    }
    for (int i = 0; i < col; i++)
    {
        delete p[i];
    }
    delete [] p;
    
    system("pause");
}
--------.cpp
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
biblio::biblio()
{
    strcpy(name, " ");
    strcpy(fullname, " ");
    strcpy(lastname, " ");
    int age = 0;
 
}
biblio::biblio(char* tname, char* tfullname, char* tlastname, int tage)
{
    strcpy(name, tname);
    if (tname == NULL)
    {
        cout << "Имя неверно,введите заново." << endl;
        cout << "Имя:";
        cin >> tname;
    }
    strcpy(fullname, tfullname);
    strcpy(lastname, tlastname);
    int age = tage;
    if ((tage < 0) && (tage > 100))
    {
        cout << "Возраст неверен,введите заново." << endl;
        cout << "Возраст:";
        cin >> tage;
    }
    //count++;
}
 
/*biblio::biblio(const biblio &a)
{
    strcpy(name, a.name);
    strcpy(fullname, a.fullname);
    strcpy(lastname, a.lastname);
    age = a.age;
}*/
 
void biblio::enter(biblio**p,int col)
{
    cout << "Введите свои инициалы ФИО и возраст:" << endl;
    for (int i = 0; i != col; i++)
    {
        cout << "Имя:";
        cin >> name;
        cout << "фамилия:";
        cin >> fullname;
        cout << "Отчество:";
        cin >> lastname;
        cout << "Возраст:";
        cin >> age;
    }
system("cls");
show(p,col);
 
}
void biblio::show(biblio**p,int col)//вывод на экран
{
    for (int i = 0; i < col; i++)
    {
        p[i]->output(col);
    }
 
    system("pause");
}
void biblio::output(int col)
{
            cout << name << endl;
            cout << fullname << endl;
            cout << lastname << endl;
            cout << age << endl;
}
void biblio::menu(biblio**p,int col,int i)
{
    
    int j;
    char n;
    cout << "Выберите действие:" << endl;
    cout << "Нажмите 1 чтобы добавить запись." << endl;
    cout << "Нажмите 2 чтобы редактировать запись." << endl;
    cout << "Нажмите 3 чтобы удалить запись." << endl;
    cout << "Нажмите 0 чтобы выйти из программы." << endl;
    cin >> n;
    system("cls");
    switch (n)
    {
    case '1':
        p[i] = new biblio();
        biblio::enter(p,col);
        break;
    case '2':
        cout << "Введите номер редактируемого: " << endl;
        cin >> j;
        biblio::redact(p,j,col);
        break;
    case '3':
        cout << "Введите номер удаляемого: " << endl;
        cin >> j;
        biblio::deleted(p,j,col);
        break;
    case '0':
        biblio::clearArray(p);
        break;
    default:
        cout << "Goodbye\n";
        break;
    }
}
void biblio::redact(biblio**p,int j,int col)
{
    enter(p, col);
}
void biblio::deleted(biblio**p,int j,int col)
{
    if (j >= 0 && j < col)
    {
        delete p[j];
    }
}
void biblio::clearArray(biblio**p)
{
    while (p != NULL)
        delete p[0];
}
 
biblio::~biblio()
{
    
}
-----.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class biblio
{
    char name[40];
    char fullname[40];
    char lastname[40];
    int age;
public:
    biblio();
    biblio(char* tname, char* tfullname, char* tlastname, int tage);
    //biblio(const biblio &a);
    ~biblio();
    void enter(biblio**p,int);
    void show(biblio**p,int);
    void output(int);
    void menu(biblio**p,int,int);
    void redact(biblio**p,int,int);
    void deleted(biblio**p,int,int);
    void clearArray(biblio**p);
};
Может кто нибудь подсказать где ошибка?.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.04.2016, 18:59
Ответы с готовыми решениями:

Ошибка в коде,но в чем именно не пойму
CREATE TABLE users ( login char(15) NOT NULL, password char(20) NOT NULL, email char(30) NOT NULL, nik char(15) NOT NULL, name...

Динамический массив: объявление (ошибка в коде)
не пойму почему не работает, вот как я пытаюсь объявить динамический массив typedef struct { char name; char sname; char...

Файл лежит в папке 'db/' Пытаюсь загрузить его в массив, но не пойму в чем ошибка?
Файл лежит в папке 'db/' Пытаюсь загрузить его в массив, но не пойму в чем ошибка? Переменная $file получает правильное значение,...

4
 Аватар для Babysitter
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
03.04.2016, 19:27
во-первых, используйте тег CPP для оформления кода, вы усложняете чтение программы.
во-вторых, после строчки
C++
1
biblio **p = new biblio*[col];
у вас имеется массив из col указателей на объекты класса biblo, однако память под сами объекты не выделена и эти указатели содержат мусор. первым делом нужно написать инициализацию, примерно так.
C++
1
2
    for(unsigned i = 0; i < col; ++i)
        p[i] = new biblo;
Добавлено через 3 минуты
фактически, метод menu вызывается у еще не созданного объекта, понятно?
0
0 / 0 / 0
Регистрация: 03.04.2016
Сообщений: 11
03.04.2016, 19:38  [ТС]
Цитата Сообщение от Babysitter Посмотреть сообщение
во-первых, используйте тег CPP для оформления кода, вы усложняете чтение программы.
ссори,первый раз тему делала,не разобралась...
Цитата Сообщение от Babysitter Посмотреть сообщение
первым делом нужно написать инициализацию, примерно так.
сделала...но все равно при записи все вылетает и появляется сообщение
"Вызвано исключение по адресу 0x00F22C38 в LABA1.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0xCDCDCDCD.

Если для этого исключения имеется обработчик, выполнение программы может быть продолжено безопасно."

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void main()
{
    setlocale(LC_ALL, "rus");
    cout << "Введите будущее количество записей:" << endl;
    cin >> col;
    system("cls");
    biblio **p = new biblio*[col];  //выделяется массив указателей.
    for (int i = 0; i >col; ++i)
    {
        p[i] = new biblio();//каждый указатель-новый объект
    }
    for (int i = 0; i != col; ++i)
    {
        p[i]->menu(p,col,i);//заполнение указателей
    }
    for (int i = 0; i < col; i++)
    {
        delete p[i];
    }
    delete [] p;
    
    system("pause");
}
Цитата Сообщение от Babysitter Посмотреть сообщение
фактически, метод menu вызывается у еще не созданного объекта, понятно?
это я поняла,я сначала так и делала как вы сказали...но все равно не идет.

Добавлено через 3 минуты
вот читабельный код.
----срр
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
biblio::biblio()
{
    strcpy(name, " ");
    strcpy(fullname, " ");
    strcpy(lastname, " ");
    int age = 0;
 
}
biblio::biblio(char* tname, char* tfullname, char* tlastname, int tage)
{
    strcpy(name, tname);
    if (tname == NULL)
    {
        cout << "Имя неверно,введите заново." << endl;
        cout << "Имя:";
        cin >> tname;
    }
    strcpy(fullname, tfullname);
    strcpy(lastname, tlastname);
    int age = tage;
    if ((tage < 0) && (tage > 100))
    {
        cout << "Возраст неверен,введите заново." << endl;
        cout << "Возраст:";
        cin >> tage;
    }
    //count++;
}
 
/*biblio::biblio(const biblio &a)
{
    strcpy(name, a.name);
    strcpy(fullname, a.fullname);
    strcpy(lastname, a.lastname);
    age = a.age;
}*/
 
void biblio::enter(biblio**p,int col)
{
    cout << "Введите свои инициалы ФИО и возраст:" << endl;
    for (int i = 0; i != col; i++)
    {
        cout << "Имя:";
        cin >> name;
        cout << "фамилия:";
        cin >> fullname;
        cout << "Отчество:";
        cin >> lastname;
        cout << "Возраст:";
        cin >> age;
    }
system("cls");
show(p,col);
 
}
void biblio::show(biblio**p,int col)//вывод на экран
{
    for (int i = 0; i < col; i++)
    {
        p[i]->output(col);
    }
 
    system("pause");
}
void biblio::output(int col)
{
            cout << name << endl;
            cout << fullname << endl;
            cout << lastname << endl;
            cout << age << endl;
}
void biblio::menu(biblio**p,int col,int i)
{
    
    int j;
    char n;
    cout << "Выберите действие:" << endl;
    cout << "Нажмите 1 чтобы добавить запись." << endl;
    cout << "Нажмите 2 чтобы редактировать запись." << endl;
    cout << "Нажмите 3 чтобы удалить запись." << endl;
    cout << "Нажмите 0 чтобы выйти из программы." << endl;
    cin >> n;
    system("cls");
    switch (n)
    {
    case '1':
        //p[i] = new biblio();
        biblio::enter(p,col);
        break;
    case '2':
        cout << "Введите номер редактируемого: " << endl;
        cin >> j;
        biblio::redact(p,j,col);
        break;
    case '3':
        cout << "Введите номер удаляемого: " << endl;
        cin >> j;
        biblio::deleted(p,j,col);
        break;
    case '0':
        biblio::clearArray(p);
        break;
    default:
        cout << "Goodbye\n";
        break;
    }
}
void biblio::redact(biblio**p,int j,int col)
{
    enter(p, col);
}
void biblio::deleted(biblio**p,int j,int col)
{
    if (j >= 0 && j < col)
    {
        delete p[j];
    }
}
void biblio::clearArray(biblio**p)
{
    while (p != NULL)
        delete p[0];
}
 
biblio::~biblio()
{
    
}
----h.
class biblio
{
    char name[40];
    char fullname[40];
    char lastname[40];
    int age;
public:
    biblio();
    biblio(char* tname, char* tfullname, char* tlastname, int tage);
    //biblio(const biblio &a);
    ~biblio();
    void enter(biblio**p,int);
    void show(biblio**p,int);
    void output(int);
    void menu(biblio**p,int,int);
    void redact(biblio**p,int,int);
    void deleted(biblio**p,int,int);
    void clearArray(biblio**p);
};
----main
void main()
{
    setlocale(LC_ALL, "rus");
    cout << "Введите будущее количество записей:" << endl;
    cin >> col;
    system("cls");
    biblio **p = new biblio*[col];  //выделяется массив указателей.
    for (int i = 0; i >col; ++i)
    {
        p[i] = new biblio();//каждый указатель-новый объект
    }
    for (int i = 0; i != col; ++i)
    {
        p[i]->menu(p,col,i);//заполнение указателей
    }
    for (int i = 0; i < col; i++)
    {
        delete p[i];
    }
    delete [] p;
    
    system("pause");
}
0
 Аватар для Babysitter
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
03.04.2016, 19:56
немного почитал код, решения, которые принимались по ходу довольно спорные.
я бы посоветовал разделить код меню/работы с массивом объектов от кода самих объектов.
получается страшное дело:

мы вынуждены выделить память под объект, чтобы вызвать его метод с меню, а затем само меню еще раз выделяет память под этот же объект, это плохая логика.
0
0 / 0 / 0
Регистрация: 03.04.2016
Сообщений: 11
03.04.2016, 20:09  [ТС]
Цитата Сообщение от Babysitter Посмотреть сообщение
само меню еще раз выделяет память под этот же объект, это плохая логика.
второй раз когда я скинула код там закомментировано второе выделение памяти...
в main выделяется массив указателей.Затем циклом выделяется память сколько необходимо пользователю,и вызывается опять же циклом метод меню.По идее ведь все разделено.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.04.2016, 20:09
Помогаю со студенческими работами здесь

В чём ошибка с указателем? (динамический массив, строки)
Условие задачи: Разделить символы из строки S1 на три группы: гласные, согласные, цифры. Группы разделить пробелами и отсортировать их по...

Не пойму в чем ошибка кода. дан массив А размера N найти максимальный элемент из его элементов с нечетными номерами
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;locale.h&gt; #define MAX 100 int main(void) { setlocale(LC_CTYPE, &quot;rus&quot;); ...

Динамический массив указателей
есть вот такой массив. void* pppribarray = { NULL, NULL, NULL, NULL }; каждый его элемент это указатель на разные пользовательские типы...

Динамический массив указателей
Есть класс &quot;блока&quot; - MapBuilderClass::BlockClass. Надо создать массив из MapBuilderClass::BlockClass* (из указателей на &quot;блок&quot;),...

Динамический массив указателей
Всем привет. Я только начинаю изучать Си (и программирование в целом), задали задание: создать структуру (Книга), затем создать массив...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Функция установки текстового статуса в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru