0 / 0 / 0
Регистрация: 17.01.2019
Сообщений: 7
1

Подскажите, пожалуйста, как сделать массив так, чтобы программа не крашилась...

17.01.2019, 19:53. Показов 804. Ответов 10

Всем доброго вечера. Возникла проблема связанная с тем, что при попытке заполнения массива крашиться компилятор
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
#include "Lab1.h"
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <fstream>
#include "stdlib.h"
#include <ctime>
 
using namespace std;
 
int Animal::count = 0;
int sizeArr = 0;
 
Animal::Animal(){}
 
Animal::Animal(char* n, int a)
{
    strcpy(Name, n);
    Height = a;
}
 
void Animal::show()
{
    cout << " Животное: " << Name << " Рост: " << Height <<endl;
}
 
char* Animal::getName()
{
    return Name;
}
 
int Animal::getHeight()
{
    return Height;
}
 
void Animal::setName(char* n)
{
    strcpy(Name, n);
}
 
void Animal::setHeight (int a)
{
    Height = a;
}
 
 Animal **fill (int n)
{
    Animal **arr = new Animal*[n];
    char Name[5][15] = {"Лев" , "Кабан" , "Жираф" , "Собака" , "Кот"};
    int Height[5] = {100, 80, 115, 70, 90};
    for (int i = 0; i < n; i++)
    {
        arr[i]->setName(Name[rand()%5]);
        arr[i]->setHeight(Height[rand()%5]);
 
    }
    return arr;
}
 
void showMas (Animal *a, int n)
{
    for (int i = 0; i < n; i++)
    {
        cout << "Массив:" <<endl;
        a[i].show();
    }
}
 
void showMas(Animal** a, int n){
    cout<< "Массив:" <<endl;
    for(int i = 0; i < n; i++){
        a[i]->show();
    }
}
 
 
void SaveBin (Animal** arr, int n, bool canSave)
{
if (canSave)
{
char FilePath[300];
cout << "Введите имя файла в который нужно сохранить:\n" ;
gets (FilePath);
ofstream fout;
fout.open (FilePath, ios::out | ios::binary);
fout.write ((char*)&n, sizeof (n));
for (int i = 0; i < n; i++)
{
arr[i]->Write(fout);
}
}
else {cout << "Невозможно сохранить!";}
}
 
bool Animal::Write (ostream& os)
{
os.write(reinterpret_cast<char*> (this), sizeof (Animal));
return os.good();
}
 
bool Animal::Read (istream& os)
{
os.read(reinterpret_cast<char*> (this), sizeof(Animal));
return os.good ();
}
 
Animal** ReadBin (int &n)
{
string num;
char FilePath[300];
cout << "Введите имя файла которой нужно открыть:\n";
gets (FilePath);
ifstream fin(FilePath, ios::in | ios::binary);
if (!(fin.is_open ())) {cout << "Вы ввели неверное имя файла!\n";}
fin.read ((char*)&n, sizeof (n));
Animal **mas = new Animal*[n];
for (int i = 0; i < n; i++)
{
mas[i] = new Animal;
mas[i]->Read(fin);
}
fin.close ();
return mas;
}
 
void Task()
{
    cout << "Введите размер массива" <<endl;
    int n;
    cin>>n;
    Animal **arr = fill(n);
    SaveBin(arr,n,true);
    cout << "Процесс завершен." <<endl;
    ReadBin(n);
}
подскажите пожалуйста как сделать массив так, чтобы программа не крашилась (ошибку показало в функции заливки массива)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.01.2019, 19:53
Ответы с готовыми решениями:

Как сделать так, чтобы условие начало работать?Подскажите,пожалуйста
Здравствуйте. Прошу,подскажите,пожалуйста, ступор уже. Вот прога: for(n=1;n&lt;=100;n++) do...

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

Как сделать так чтобы простейшая программа запускалась сначало
Предположим есть самая простая программа: #include &lt;iostream&gt; using namespace std; #include...

Как сделать так, чтобы программа понимала русские буквы?
И если знаете как убрать этот огромный массив символов &quot;char mass2&quot; на chr виснет все... Так...

10
"C with Classes"
1626 / 1386 / 519
Регистрация: 16.08.2014
Сообщений: 5,800
Записей в блоге: 1
17.01.2019, 20:02 2
Цитата Сообщение от Pleasure1337 Посмотреть сообщение
в функции заливки массива
это какая функция член?
Цитата Сообщение от Pleasure1337 Посмотреть сообщение
os.read(reinterpret_cast<char*> (this), sizeof(Animal));
это что ты тут делаешь?
0
0 / 0 / 0
Регистрация: 17.01.2019
Сообщений: 7
17.01.2019, 20:05  [ТС] 3
Цитата Сообщение от _stanislav Посмотреть сообщение
это какая функция член?
Animal **fill , тут.
0
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
17.01.2019, 20:07 4
Класс Animal входит в иерархию? Или он просто отдельно идет?
0
"C with Classes"
1626 / 1386 / 519
Регистрация: 16.08.2014
Сообщений: 5,800
Записей в блоге: 1
17.01.2019, 20:12 5
Pleasure1337, исправь, зачем тебе там Animal**
C++
1
Animal *arr = new Animal[n];
Добавлено через 2 минуты
Цитата Сообщение от Pleasure1337 Посмотреть сообщение
os.read(reinterpret_cast<char*> (this), sizeof(Animal));
и над этой строкой подумай, вот прототип метода read
C++
1
istream & read (char * s, streamsize n); // второй параметр char* а не Animal*  как у тебя
1
0 / 0 / 0
Регистрация: 17.01.2019
Сообщений: 7
17.01.2019, 20:13  [ТС] 6
Цитата Сообщение от jugu Посмотреть сообщение
Класс Animal входит в иерархию? Или он просто отдельно идет?
класс идет отдельно

Цитата Сообщение от _stanislav Посмотреть сообщение
easure1337, исправь, зачем тебе там
я пытался исправлять, но без двух указателей оно даже не компилируется и выдает ошибку.
0
"C with Classes"
1626 / 1386 / 519
Регистрация: 16.08.2014
Сообщений: 5,800
Записей в блоге: 1
17.01.2019, 20:13 7
Цитата Сообщение от Pleasure1337 Посмотреть сообщение
Animal** ReadBin (int &n)
даже боюсь смотреть в этот метод
0
0 / 0 / 0
Регистрация: 17.01.2019
Сообщений: 7
17.01.2019, 20:16  [ТС] 8
Цитата Сообщение от _stanislav Посмотреть сообщение
даже боюсь смотреть в этот метод
извиняюсь извиняюсь, программировать начал недавно, так что плохого кода очень много)
0
"C with Classes"
1626 / 1386 / 519
Регистрация: 16.08.2014
Сообщений: 5,800
Записей в блоге: 1
17.01.2019, 20:17 9
Цитата Сообщение от Pleasure1337 Посмотреть сообщение
я пытался исправлять, но без двух указателей оно даже не компилируется и выдает ошибку.
а так?
C++
1
2
arr[i].setName(Name[rand()%5]);
arr[i].setHeight(Height[rand()%5]);
0
0 / 0 / 0
Регистрация: 17.01.2019
Сообщений: 7
17.01.2019, 20:34  [ТС] 10
Цитата Сообщение от _stanislav Посмотреть сообщение
а так?
переделал под это, заработало, большое спасибо. Возникла проблема с файлами, т.е не могу создать файл с которого буду считывать, не хватает нормального опыта для этого.
0
"C with Classes"
1626 / 1386 / 519
Регистрация: 16.08.2014
Сообщений: 5,800
Записей в блоге: 1
17.01.2019, 20:38 11
Цитата Сообщение от Pleasure1337 Посмотреть сообщение
не хватает нормального опыта для этого
да друг, ошибок у тебя в коде тонна, берись за книги пока не поздно.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.01.2019, 20:38
Помогаю со студенческими работами здесь

Как сделать, так чтобы программа выводила наименование цвета, как здесь?
http://colors.aeio.ru/color/fffffe Я создал базу из 1002 цветов но это вообще не то. Я подгрузил...

Как сделать так, чтобы программа не компилилась, хотя синтаксически была бы правильной?
Друзья! Дело в следующем, вот у меня есть функции X и Y. И вот мне не хотелось бы вызывать X...

Как сделать так, чтобы программа открывалась там, где я её закрыл в прошлый раз?
Как переделать эту функцию: main_hWnd = CreateWindowEx( WS_EX_TOPMOST, szWindowClass,...

Сделать проверку, чтобы программа не крашилась
Здравствуйте! Помогите пожалуйста! Нужно сделать так, чтобы программа не крашилась Ввожу = или...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru