Добрый вечер. Пишу код программы, которая должна иметь функции ввода и вывода массива типа структуры AEROFLOT. С одним рейсом работает. С двумя нет. Выводит бред, предполагаю, что вызывает несуществующий участок памяти. Но не могу понять почему. Заодно прошу проанализировать код. Верно ли я освободил память. Также хочу засунуть эти функции в структуру. Может быть кто посоветует как сделать?
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <iomanip>
using namespace std;
struct AEROFLOT
{
public:
char Trip[20]; //номер рейса
char Departure[30]; // пункт отправления
char Destination[30]; //пункт назначения
char Type[30]; //тип самолёта
float Time; //Время в пути
};
AEROFLOT set(int k);
void out(AEROFLOT *n, int k);
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int k, check;
cout << "Введите кол-во рейсов" << endl;
cin >> k;
AEROFLOT * n = new AEROFLOT[k];
*n = set(k);
while (1)
{
cout << "1. Ввод информации" << endl;
cout << "2. Вывод информации по всем рейсам" << endl;
cout << "3. Выход" << endl;
cin >> check;
switch (check)
{
case 1:
{
cout << "Введите новое кол-во рейсов" << endl;
cin >> k;
AEROFLOT * n = new AEROFLOT[k];
*n = set(k);
break;
}
case 2:
{
system("cls");
out(n, k);
break;
}
case 3:
{
delete n;
return 0;
}
default: cout <<endl<< "Неверный ввод! Повторите. " << endl;
cout << endl;
break;
}
}
return 0;
}
AEROFLOT set(int k)
{
AEROFLOT *n = new AEROFLOT[k];
for (int i = 0; i < k; i++)
{
cout << "Введите номер "<<i+1<< "-го рейса: " << endl;
cin >> n[i].Trip;
cout << "Введите пункт отправления " << i+1 << "-го рейса: " << endl;
cin >> n[i].Departure;
cout << "Введите пункт назначения " << i+1 << "-го рейса: " << endl;
cin >> n[i].Destination;
cout << "Введите тип самолёта " << i+1 << "-го рейса: " << endl;
cin >> n[i].Type;
cout << "Введите время в пути(мин) " << i+1 << "-го рейса: " << endl;
cin >> n[i].Time;
}
system("cls");
return *n;
}
void out(AEROFLOT *n, int k)
{
for (int i = 0; i < k; i++)
{
cout << "___________________________________________" << endl;
cout << "|Номер рейса: |"<< setw(20) << n[i].Trip<<" |"<< endl;
cout << "___________________________________________" << endl;
cout << "|Пункт отправления: |"<< setw(20) << n[i].Departure <<" |"<<
endl;
cout << "___________________________________________" << endl;
cout << "|Пункт назначения: |"<< setw(20) << n[i].Destination<< " |"
<<endl;
cout << "___________________________________________" << endl;
cout << "|Тип самолёта: |"<< setw(20) << n[i].Type <<" |"<< endl;
cout << "___________________________________________" << endl;
cout << "|Время в пути: |"<< setw(16) << n[i].Time<<" мин"<<" |" <<
endl;
cout << "___________________________________________" << endl;
cout << endl;
}
system("pause");
system("cls");
}
AEROFLOT set(int k)
возвращает одну структуру вместо указателя на массив этих структур, который выделялся (и потерялся) в функции. Присванивание *n = set(k);
соответственно копирует только первый элемент в массиве (который тут выделять не следует, так как он уже выделен в функции), а остальные содержат мусор. Кроме того, создаваемая локальная переменная AEROFLOT * n = new AEROFLOT[k];
заслоняет переменную с тем же именем и первый массив так и остается с мусором. Передавайте в свою функцию указатель на ранее выделенный массив.
Проблема была решена посредством удаления AEROFLOT *
в цикле. Т.к. AEROFLOT *
создаёт новую, отличную от предыдущей, переменную. И из-за этого и нет вывода нужного массива. Теперь же в программе редактируется старая переменная и она же выводится.
switch (check)
{
case 1:
{
cout << "Введите новое кол-во рейсов" << endl;
cin >> k;
delete[] n;
n = new AEROFLOT[k];
*n = set(n, k);
break;
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Провожу эксперименты с Arduino и решил замучать цикл while (вместо loop)Задал условие, при котором должен срабатывать цикл, но вместо срабатывания...
Как записать даные из значения переменной в файл txt?
Пытаюсь сделать возведение матрицы в степеньЗнаю, как выглядит умножение матриц (возведение в квадрат):