1

私の質問をご覧いただきありがとうございます。

具体的な質問は次のとおりです。プログラムがクラッシュする原因は何ですか?

私は、顧客の注文を受け取り、個人データを保存し、最後の注文を保存するプロジェクトに取り組んでいます。

2クラス作りました。顧客と注文。

Customers には、Orders の配列 (およびベクトルのトラブルシューティング前) が含まれています。

以下は私のプロジェクトのコードです。

私のohistory.hファイルから:

class Order
{
public:
    Order(string* oERROR= new string(""));
    ~Order();
    bool SetOrder(const string& main, const string& drink, const string& side);
    void GetOrder() const;
    void GetError() const;
    string GetMain() const;
    string GetSide() const;
    string GetDrink() const;
private:
    string m_main;
    string m_drink;
    string m_side;
    string* mORDER_ERROR;
};


class Customer
{
public:
    Customer(string* cERROR = new string(""));
    ~Customer();
    void GetName() const;
    bool SetName(const string &fName, const string& lName);
    bool SetAddress(const string& Addr);
    bool SetPhone(const string & pNumber);
    void GetOrder(const int& numOrder) const;
    bool SetOrder(const int& numOrder);
    void GetError() const;



private:
    string m_firstName;
    string m_lastName;
    string m_Address;
    string m_phoneNumber;
    Order m_cOrder[10];
    string* pCUS_ERROR;
    Order askOrder();
};

ohistory.cpp の関連エントリ

string Order::GetMain() const
{
    string temp = m_main;
    return temp;
}

string Order::GetDrink() const
{
    string temp = m_drink;
    return temp;
}

string Order::GetSide() const
{
    string temp = m_side;
    return temp;
}

Order Customer::askOrder()
{
    string main, side, drink;

    Order newOrder;
    cout << "***\tEnter a main item: ";
    getline(cin, main);
    cout << "\n***\t\tEnter a side item: ";
    getline(cin,side);
    cout << "\n***\t\tEnter a drink: ";
    getline(cin,drink);

    newOrder.SetOrder(main, drink, side);
    return newOrder;

}

bool Customer::SetOrder(const int& numOrder)
{


    for (int i = 0; i < numOrder; ++i)
    {
        Order temp = askOrder();
        m_cOrder[i].SetOrder(temp.GetMain(), temp.GetDrink(), temp.GetSide());

    }

    return true;
}

main.cpp から (customer.setOrder() への呼び出しは下部にあり、main は newCustomer() を呼び出します)

void newCustomer()
{
    cin.clear();
    char correctCustomerInfo;
    char correctOrder;
    Customer newCustomer;
    string first_name, last_name, address, phone_number;

    do
    {
        cout << "***\tEntering new customer:\n\n";
        cout << "***\t\tFirst Name:";
        getline(cin, first_name);
        cout << "***\t\tLast Name: ";
        getline(cin, last_name);
        cout << "***\t\tAddress: ";
        getline(cin, address);
        cout << "***\t\tPhone Number: ";
        getline(cin, phone_number);
        cout << endl;


        newCustomer.SetName(first_name, last_name);
        newCustomer.SetAddress(address);
        newCustomer.SetPhone(phone_number);

        newCustomer.GetName();
        correctCustomerInfo = askQuestion("Is the user's information correct?");

    } while (correctCustomerInfo != 'y');

    int choice;
    cout <<"***\tPlease enter order:\n\n";
    cout <<"***\tTotal number of Orders:\n";
    cin >> choice;
    cin.clear();
    cin.ignore(INT_MAX, '\n');

    do
    {
        newCustomer.SetOrder(choice);
        correctOrder = askQuestion("Is this the correct order?");
    } while (correctOrder != 'y');


}

デバッグ実行時の VC++ からのダンプ:

'OrderTaker.exe': Loaded 'C:\Documents and Settings\*\My Documents\Visual Studio 2010\Projects\OrderTaker\Debug\OrderTaker.exe', Symbols loaded.
'OrderTaker.exe': Loaded 'C:\WINDOWS\system32\ntdll.dll', Cannot find or open the PDB file
'OrderTaker.exe': Loaded 'C:\WINDOWS\system32\kernel32.dll', Cannot find or open the PDB file
'OrderTaker.exe': Loaded 'C:\WINDOWS\system32\msvcp100d.dll', Symbols loaded.
'OrderTaker.exe': Loaded 'C:\WINDOWS\system32\msvcr100d.dll', Symbols loaded.
First-chance exception at 0x103157aa (msvcr100d.dll) in OrderTaker.exe: 0xC0000005: Access violation reading location 0xfeeefee2.
Unhandled exception at 0x103157aa (msvcr100d.dll) in OrderTaker.exe: 0xC0000005: Access violation reading location 0xfeeefee2.



pUserData   0xfeeefeee  void *
Head    0xfeeefece {pBlockHeaderNext=??? pBlockHeaderPrev=??? szFileName=??? ...}   _CrtMemBlockHeader *
pBlockHeaderNext    CXX0030: Error: expression cannot be evaluated  
pBlockHeaderPrev    CXX0030: Error: expression cannot be evaluated  
szFileName  CXX0030: Error: expression cannot be evaluated  
nLine   CXX0030: Error: expression cannot be evaluated  
nDataSize   CXX0030: Error: expression cannot be evaluated  
nBlockUse   CXX0030: Error: expression cannot be evaluated  
lRequest    CXX0030: Error: expression cannot be evaluated  
      gap   0xfeeefeea <Bad Ptr>    unsigned char [4]

[0] CXX0030: Error: expression cannot be evaluated  
[1] CXX0030: Error: expression cannot be evaluated  
[2] CXX0030: Error: expression cannot be evaluated  
[3] CXX0030: Error: expression cannot be evaluated  

問題は次の場所で発生します。

void Customer::SetOrder(const int& numOrder)
{


    for (int i = 0; i < numOrder; ++i)
    {
        Order temp = askOrder();
        m_cOrder[i].SetOrder(temp.GetMain(), temp.GetDrink(), temp.GetSide());

    }


}

3つのアイテムを入力できますが、クラッシュします。

いくつかの不安定な戻り値の型に気付くかもしれません。これは、私が将来行う予定のいくつかのステップのためにそれらを準備するためのものです。

前もって感謝します。

===============================編集

私は自分の問題を理解しました。正しい方向に私を送ってくれてありがとうicepack。

いずれにせよ、誰かが同様の問題を抱えている場合に備えて。

問題は、受け取っていたユーザー入力にありました。

int choice;
cout <<"***\tPlease enter order:\n\n";
cout <<"***\tTotal number of Orders:\n";
cin >> choice;
cin.clear();
cin.ignore(INT_MAX, '\n');

do
{
    newCustomer.SetOrder(choice);
    correctOrder = askQuestion("Is this the correct order?");
} while (correctOrder != 'y');

ユーザー入力をクラスとそのデータ メンバーに直接送信する代わりに、入力を受け取り、その値にアクセスして、同じ値を再割り当てしました。

そこから魅力的に働きました。

4

0 に答える 0