Ошибка памяти или синтаксиса С++

218
29 марта 2018, 09:18

Добрый вечер. Пишу код программы, которая должна иметь функции ввода и вывода массива типа структуры 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");
}
Answer 1

AEROFLOT set(int k) возвращает одну структуру вместо указателя на массив этих структур, который выделялся (и потерялся) в функции. Присванивание *n = set(k); соответственно копирует только первый элемент в массиве (который тут выделять не следует, так как он уже выделен в функции), а остальные содержат мусор. Кроме того, создаваемая локальная переменная AEROFLOT * n = new AEROFLOT[k]; заслоняет переменную с тем же именем и первый массив так и остается с мусором. Передавайте в свою функцию указатель на ранее выделенный массив.

Answer 2

Проблема была решена посредством удаления AEROFLOT * в цикле. Т.к. AEROFLOT * создаёт новую, отличную от предыдущей, переменную. И из-за этого и нет вывода нужного массива. Теперь же в программе редактируется старая переменная и она же выводится.

switch (check)
    {
    case 1:
    {
        cout << "Введите новое кол-во рейсов" << endl;
        cin >> k;
        delete[] n;
        n = new AEROFLOT[k];
        *n = set(n, k);
        break;
    }
READ ALSO
Почему не работает цикл while?

Почему не работает цикл while?

Провожу эксперименты с Arduino и решил замучать цикл while (вместо loop)Задал условие, при котором должен срабатывать цикл, но вместо срабатывания...

236
Не работает цикл while в Arduino?

Не работает цикл while в Arduino?

Вот код на дёргание светодиода каждую секунду:

228
Записать даные из значения переменной в файл .txt Builder C++

Записать даные из значения переменной в файл .txt Builder C++

Как записать даные из значения переменной в файл txt?

214
Возведение матрицы в степнь

Возведение матрицы в степнь

Пытаюсь сделать возведение матрицы в степеньЗнаю, как выглядит умножение матриц (возведение в квадрат):

240