Страницы

Поиск по вопросам

четверг, 21 марта 2019 г.

Динамические массивы С++. В чём может быть проблема?

Программа считывает из файла уже определённое количество строк и записывает информацию в класс, после чего работает с классом. Функция Memory управляет памятью. Когда мы добавляем новый объект, функция Memory должна выделять под новый добавленный объект память. Это происходит во время работы с программой, но при выполнении повторной операции по добавлению объекта программа даёт сбой. Куда копать?
Текст файла, с которым ведётся работа:
Скотное Тверь 6 Москва Липецк 43 Псков Москва 3 Ярославль Воронеж 2
Код программы:
#include #include #include #include
using namespace std;
// Объявление класса class Routes { int i = 0; private: std::string StatI; std::string StatO; int tm; public: Routes(); //~Routes(); Routes(string dep, string arr, int time); std::string getStatO() {return StatO;}; std::string getStatI() {return StatI;}; int getTm() {return tm;}; void setStatO(std::string); void setStatI(std::string); void setTm(int time); int NewRouteOpt(Routes* Fill, int N, char *file); void Vivod(Routes *Fill, int N, char *file); void Edit(Routes *Fill, int N, char *file); void Write(Routes *Fill, int N, char *file); int Read(Routes *Fill, int N, char *file); void Sort(Routes *Fill, int N, char* file); int MassiveRoutes(Routes *Fill, int N, char *file); int NewDefault(Routes *Fill, int N, char *file); void Save(Routes *Fill, int N, char* file); int Memory(Routes *Fill, int N, char* file); };
// Программы, использующие класс int Routes::NewRouteOpt(Routes* Fill, int N, char *file){ N++; Memory(Fill, N, file); i = N - 1; std::string bo; // буфер отправления std::string bp; // буфер прибытия int bt; // буфер времени cout << "Enter Departure Station:
>> "; cin >> bo; Fill[i].setStatO(bo); cout << "Enter Arrival Station:
>> "; cin >> bp; Fill[i].setStatI(bp); cout << "Enter Travel Time:
>> "; while (!(cin >> bt)){cout << "Invalid value!" << endl; cin.clear();cin.sync();} Fill[i].setTm(bt); cout << "---
New route:" << endl; cout << i << " | " << Fill[i].getStatO() << " " << Fill[i].getStatI() << " " << Fill[i].getTm() << "
---" << endl; return N;}
void Routes::Vivod(Routes *Fill, int N, char *file){ for (int i = 0; i < N; i++){cout.setf(ios::right);cout.width(6); cout << i << "|" << Fill[i].getStatO() << "\t|" << Fill[i].getStatI() << "\t|" << Fill[i].getTm() << endl;}}
void Routes::Edit(Routes *Fill, int N, char *file){ Routes::Vivod(Fill, N, file); int k; cout << "---
Enter route number to edit:
>> "; while (!(cin >> k) || (k>=N) || (k<0)){ cout << "Invalid value!" << endl; cin.clear();cin.sync();} std::string bo; // буфер отправления std::string bp; // буфер прибытия int bt; // буфер времени cout << "Enter Departure Station:
>> "; cin >> bo; Fill[k].setStatO(bo); cout << "Enter Arrival Station:
>> "; cin >> bp; Fill[k].setStatI(bp); cout << "Enter Travel Time:
>> "; while(!(cin >> bt)){cout << "Invalid value!" << endl; cin.clear();cin.sync();} Fill[k].setTm(bt); cout << "---
Changed route
---" << endl; cout << k << " | "<< Fill[k].getStatO() << " " << Fill[k].getStatI() << " " << Fill[k].getTm() << endl;}
void Routes::Write(Routes *Fill, int N, char *file){ ofstream in(file); for (int i = 0; i < N; i++){ cout << i << " | " << Fill[i].getStatO() << "\t" << Fill[i].getStatI() << "\t" << Fill[i].getTm() << endl; if (i == N-1){ in << Fill[i].getStatO() << "\t" << Fill[i].getStatI() << "\t" << Fill[i].getTm();} else{ in << Fill[i].getStatO() << "\t" << Fill[i].getStatI() << "\t" << Fill[i].getTm() << endl;}}//delete[] Fill; }
int Routes::Read(Routes *Fill, int N, char *file){ int check = 0; ifstream of(file,std::ios::in|std::ios::binary); while(check == 0){ cout << "---
Enter name file with type:
>> "; cin >> file; of.open(file); if (of){check = 1;} if(!of){system("cls"); cout << "File not found!
"; check = 0;}} char *line = new char [1024]; int col = 0, j = 0; while (!of.eof()){ of >> Fill[j].StatO; of >> Fill[j].StatI; of >> Fill[j].tm; j++; of.getline(line, 1024, '
'); int n = strlen(line); if( n == 1 && n == 0){ col--;} else{ col++;}} delete [] line; of.close(); cout << "---
Read " << col << " rows
---" << endl; return col;}
void Routes::Sort(Routes *Fill, int N, char* file){ Routes::Vivod(Fill, N, file); cout << "---
Shortest route
---" << endl; int mz = 1000000; // максимальное значение int index; for(int i = 0; i < N; i++){ if(Fill[i].tm<=mz){ mz=Fill[i].tm; index = i;}} cout << index << "|" << Fill[index].StatO << "\t|" << Fill[index].StatI << "\t|" << Fill[index].tm << endl;}
int Routes::MassiveRoutes(Routes *Fill, int N, char *file){ int pl, bf; // переменная буфера строк std::string bo; // буфер отправления std::string bp; // буфер прибытия int bt; // буфер времени cout << "How much routes you wanna add?" << endl; while(!(cin >> pl) || pl>=4){cout << "Invalid value!" << endl; cin.clear();cin.sync();} int i = N; N = N + pl; Memory(Fill, N, file); for ( int i = N-pl; i < N; i++){ cout << "Enter Departure Station:
>> "; cin >> bo; Fill[i].setStatO(bo); cout << "Enter Arrival Station:
>> "; cin >> bp; Fill[i].setStatI(bp); cout << "Enter Travel Time:
>> "; while(!(cin >> bt)){cout << "Invalid value!" << endl; cin.clear();cin.sync();} Fill[i].setTm(bt); cout << i << " | " << Fill[i].getStatO() << "\t" << Fill[i].getStatI() << "\t" << Fill[i].getTm() << endl;} return N;}
int Routes::NewDefault(Routes *Fill, int N, char *file){ N++; Memory(Fill, N, file); i = N - 1; std::string bo; // буфер отправления std::string bp; // буфер прибытия int bt; // буфер времени Fill[i].StatO; Fill[i].StatI; Fill[i].tm; cout << "---
New route:" << endl; cout << i << " | " << Fill[i].getStatO() << " " << Fill[i].getStatI() << " " << Fill[i].getTm() << "
---" << endl; return N;}
void Routes::Save(Routes *Fill, int N, char* file){ cout << "Enter file name with type:
>> "; char name[20]; cin >> name; cin.clear(); cin.sync(); strcpy(file,name); Write(Fill, N, file); return ;}
int Routes::Memory(Routes *Fill, int N, char* file){ int d = 0; d = N; Routes *newFill; newFill = new Routes[d]; for (int i = 0; i < N; i++){ newFill[i] = Fill[i]; } delete []Fill; Fill = newFill; }
// конструктор по умолчанию Routes::Routes(){ StatO = "Dispatch"; StatI = "Arrival"; tm = 0;}
// возврат значений времени, станций отправления и прибытия void Routes::setStatO(std::string ot){ // отправление StatO = ot;}
void Routes::setStatI(std::string pr){ // прибытие StatI = pr;}
void Routes::setTm(int time){ // время tm = time;}
// главная функция программы int main(){ //system("color F0"); SetConsoleCP(1251); SetConsoleOutputCP(1251); setlocale(LC_ALL, "Russian"); Routes *Fill; Fill = new Routes[4]; int x, tick = 0; char fn[20]; cout << "---
Laboratory work №2" << endl; int loc = Fill->Routes::Read(Fill, loc, fn); system("cls"); Fill->Routes::Vivod(Fill, loc, fn); while(tick == 0){ cout << "===
Menu
===
1. Create new route (default)
2. Create new route (with parameters)
3. Create new routes
4. Edit and view routes
5. View shortest route
6. Exit" << endl; cout << "---
>> "; cin >> x; cin.clear();cin.sync(); switch(x){ case 1: // создание объекта с помощью конструктора по умолчанию system("cls"); loc = Fill->Routes::NewDefault(Fill, loc, fn); Fill->Routes::Vivod(Fill, loc, fn); break; case 2: // создание объекта с помощью конструктора с параметрами system("cls"); loc = Fill->Routes::NewRouteOpt(Fill, loc, fn); Fill->Routes::Vivod(Fill, loc, fn); break; case 3: // создание объекта system("cls"); loc = Fill->Routes::MassiveRoutes(Fill, loc, fn); system("cls"); Fill->Routes::Vivod(Fill, loc, fn); break; case 4: // редактирование и просмотр свойств system("cls"); Fill->Routes::Vivod(Fill, loc, fn); do{ cout << "---
1.Edit
2.Write to file
3.Write to new file
4.Exiting the subprogram
---" << endl; cout << ">> "; cin >> x;cin.clear();cin.sync(); if (x==1){ system("cls"); Fill->Routes::Edit(Fill, loc, fn);} else if (x==2){ system("cls"); Fill->Routes::Write(Fill, loc, fn);} else if (x==3){ system("cls"); Fill->Routes::Save(Fill, loc, fn);} else if (x==4){ system("cls"); break;} else {system("cls"); cout << "---
Invalid input!
---" << endl;}} while (true); system("cls"); break; case 5: // сортировка system("cls"); Fill->Routes::Sort(Fill, loc, fn); break; case 6: // выход из программы system("cls"); Fill->Routes::Write(Fill, loc, fn); return 0; default: system("cls"); cout << "---
Error!
---" << endl; break;}}}'


Ответ

вот так надо
void Init(int*& p, int i) { p = new int(i); }
int main(int argc, char* argv[] ) { int* p = nullptr; Init(p, 1000);
return 0; }

Комментариев нет:

Отправить комментарий