Ошибка -1073741674 продолжает происходить, и я не уверен, почему - PullRequest
0 голосов
/ 01 августа 2020

Я пытаюсь ввести комнаты, отсортировать их по цене и после этого создать текстовый файл, но всегда возникает ошибка, которая, как я подозреваю, связана с функцией sizeof

В некоторых компиляторах она компилируется но он будет иметь предупреждающее сообщение:

предупреждение: 'sizeof' в параметре функции массива 'rooms' вернет размер 'roomType *' [-Wsizeof-array-argument]

Dev C ++ вообще не компилируется

#include <iostream>
#include <fstream>
#include <algorithm>
#include <iomanip>
using namespace std;

const int roomamt = 4;

struct package
{
    int numRoom;
    int numNight;
};

struct roomType
{
    string type;
    string breakfast;
    int price;
    package packageType;
};

bool comparePrice(roomType p1, roomType p2) 
{ 
    return (p1.price < p2.price); 
}

void input(roomType rooms[roomamt]);
void sort(roomType rooms[roomamt]);

int main()
{
    roomType rooms[roomamt];
    
    input(rooms);
    
    sort(rooms);

}

void input(roomType rooms[roomamt]){
    
    for(int i = 0; i < roomamt; i++){
        cout << "Enter type of room: ";
        cin >> rooms[i].type;
        cout << "Specify if breakfast included: ";
        cin >> rooms[i].breakfast;
        cout << "Enter price of room/night: ";
        cin >> rooms[i].price;
        cout << "Enter num of room: ";
        cin >> rooms[i].packageType.numRoom;
        cout << "Enter num of nights: ";
        cin >> rooms[i].packageType.numNight;
    }
}

void sort(roomType rooms[roomamt]){
    
    int n = sizeof(rooms)/sizeof(rooms[0]); 
    
    sort(rooms, rooms+n, comparePrice); 
    
}

void createFile(roomType rooms[roomamt]){
    
    ofstream priceList("priceList.txt");
    
    priceList << setw(20) << "Room Type" << setw(20) << "Breakfast" << setw(20) << "Price/night" << setw(20) << "Room" << setw(20) << "Nights" << endl;
    priceList << setw(20) << "---------" << setw(20) << "----" << setw(20) << "-----" << setw(20) << "----" << setw(20) << "----" << endl;
    
    for(int i = 0; i < roomamt; i++){
        priceList << setw(20) << rooms[i].type << setw(20) << rooms[i].breakfast << setw(20) << rooms[i].price << setw(20) << setw(20) << rooms[i].packageType.numRoom << setw(20) << rooms[i].packageType.numNight << endl;
    }
}

Ответы [ 3 ]

3 голосов
/ 01 августа 2020

У вас обычная проблема newb ie с указателями и массивами. Возьмем, к примеру, этот код

void sort(roomType rooms[roomamt]) {
    int n = sizeof(rooms)/sizeof(rooms[0]); 
    sort(rooms, rooms+n, comparePrice);
}

В этом коде rooms - указатель. Это может выглядеть как массив, но это не так. В C ++ невозможно сделать массив параметром функции. Таким образом, компилятор меняет roomType rooms[roomamt] на roomType* rooms. Из-за этого sizeof(rooms) - это размер указателя, а не массива, поэтому ваш расчет размера массива неверен.

Но в вашем случае это легко исправить, просто используйте roomant

void sort(roomType* rooms) {
    sort(rooms, rooms + roomamt, comparePrice);
}

Обратите внимание, здесь я изменил код, чтобы показать rooms как указатель, которым он является на самом деле.

Однако даже без этого исправления я не понимаю, почему ваш код будет треснуть sh (или не удалось скомпилировать).

2 голосов
/ 01 августа 2020

Вы можете использовать массивы C ++ вместо C массивов. Массивы C ++ могут передаваться по значению и по ссылке на функции. Их можно вернуть из функций, а можно просто скопировать. В них указан их размер. Все эти преимущества идут с нулевыми накладными расходами.

#include <array>
#include <iostream>
#include <fstream>
#include <algorithm>
#include <iomanip>
using namespace std;

constexpr int roomamt = 4;

struct package
{
    int numRoom;
    int numNight;
};

struct roomType
{
    string type;
    string breakfast;
    int price;
    package packageType;
};

bool comparePrice(roomType p1, roomType p2) 
{ 
    return (p1.price < p2.price); 
}

void input(array<roomType, roomamt> &rooms);
void sort(array<roomType, roomamt> &rooms);

int main()
{
    array<roomType, roomamt> rooms;
    
    input(rooms);
    
    sort(rooms);

}

void input(array<roomType, roomamt> &rooms){
    
    for(int i = 0; i < rooms.size(); i++){
        cout << "Enter type of room: ";
        cin >> rooms[i].type;
        cout << "Specify if breakfast included: ";
        cin >> rooms[i].breakfast;
        cout << "Enter price of room/night: ";
        cin >> rooms[i].price;
        cout << "Enter num of room: ";
        cin >> rooms[i].packageType.numRoom;
        cout << "Enter num of nights: ";
        cin >> rooms[i].packageType.numNight;
    }
}

void sort(array<roomType, roomamt> &rooms){    
    sort(rooms.begin(), rooms.end(), comparePrice); 
    
}

void createFile(array<roomType, roomamt> &rooms){
    
    ofstream priceList("priceList.txt");
    
    priceList << setw(20) << "Room Type" << setw(20) << "Breakfast" << setw(20) << "Price/night" << setw(20) << "Room" << setw(20) << "Nights" << endl;
    priceList << setw(20) << "---------" << setw(20) << "----" << setw(20) << "-----" << setw(20) << "----" << setw(20) << "----" << endl;
    
    for(int i = 0; i < rooms.size(); i++){
        priceList << setw(20) << rooms[i].type << setw(20) << rooms[i].breakfast << setw(20) << rooms[i].price << setw(20) << setw(20) << rooms[i].packageType.numRoom << setw(20) << rooms[i].packageType.numNight << endl;
    }
}
1 голос
/ 01 августа 2020

Массивы распадаются на указатели при передаче в функции. Эта сигнатура

void sort(roomType rooms[roomamt]){

эквивалентна

void sort(roomType* rooms){ 

Это немного прискорбно, потому что это подпитывает недоразумение относительно массивов и указателей. Когда вы вызываете функцию

sort(rooms);

, тогда массив rooms неявно преобразуется в указатель на первый элемент в массиве. Важно то, что в main rooms это массив, а в ваших функциях rooms - это указатель. Это разные типы, и информация о размере теряется.

Это можно обойти, передав массив по ссылке (подробности см. здесь ). Намного проще использовать std::array (размер известен во время компиляции) или std::vector (динамический c размер).

...