-4

私は c++ を学んでいて、「解放されているポインターが割り当てられていません」というエラーを出し続けるプログラムに取り組んでいます。これは、txt ファイルからデータを入力する食料品店のプログラムであり、ユーザーはアイテム番号と数量を入力できます。同様の質問を読みましたが、私を悩ませているのは「ポインター」の問題です。誰かが見て、私を助けてくれれば幸いです。Mac で Netbeans IDE 7.2 を使用しています。今までの全作品を載せておきます。どうも。

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;


class Product
{
  public:
      // PLU Code
  int getiPluCode()
  {
    return iPluCode;
  }

  void setiPluCode( int iTempPluCode)
  {
    iPluCode = iTempPluCode;
  }

  // Description
  string getsDescription()
  {
    return sDescription;
  }

  void setsDescription( string sTempDescription)
  {
    sDescription = sTempDescription;
  }

  // Price
  double getdPrice()
  {
    return dPrice;
  }

  void setdPrice( double dTempPrice)
  {
    dPrice = dTempPrice;
  }

  // Type..weight or unit
  int getiType()
  {
    return iType;
  }

  void setiType( int iTempType)
  {
    iType = iTempType;
  }

  // Inventory quantity
  double getdInventory()
  {
    return dInventory;
  }

  void setdInventory( double dTempInventory)
  {
    dInventory = dTempInventory;
  }




    private: 
      int iPluCode;
      string sDescription;
      double dPrice;
      int iType;
      double dInventory;
};


int main ()
{

  Product paInventory[21]; // Create inventory array
  Product paPurchase[21]; // Create customer purchase array

    // Constructor to open inventory input file
    ifstream InputInventory ("inventory.txt", ios::in);
        //If ifstream could not open the file
    if (!InputInventory)
    {
        cerr << "File could not be opened" << endl;
        exit (1);
    }//end if

    int x = 0;

    while (!InputInventory.eof () )
    {
      int iTempPluCode;
      string sTempDescription;
      double dTempPrice;
      int iTempType;
      double dTempInventory;

        InputInventory >> iTempPluCode >> sTempDescription >> dTempPrice >> iTempType >> dTempInventory;

        paInventory[x].setiPluCode(iTempPluCode);
        paInventory[x].setsDescription(sTempDescription);
        paInventory[x].setdPrice(dTempPrice);
        paInventory[x].setiType(iTempType);
        paInventory[x].setdInventory(dTempInventory);

        x++;

    }

    bool bQuit = false;
    //CREATE MY TOTAL VARIABLE HERE!

    int iUserItemCount = 0;
    do
    {
      int iUserPLUCode;
        double dUserAmount;
        double dAmountAvailable;
        int iProductIndex = -1;
        //CREATE MY SUBTOTAL VARIABLE HERE!

        while(iProductIndex == -1)
        {
            cout<<"Please enter the PLU Code of the product."<< endl;

            cin>>iUserPLUCode;

            for(int i = 0; i < 21; i++)
            {
            if(iUserPLUCode == paInventory[i].getiPluCode())
            {
                dAmountAvailable = paInventory[i].getdInventory();
                iProductIndex = i;  
            }
            }

                        //PLU code entry validation
            if(iProductIndex == -1)
            {
              cout << "You have entered an invalid PLU Code.";
            }
        }



        cout<<"Enter the quantity to buy.\n"<< "There are  "<< dAmountAvailable << "available.\n";
        cin>> dUserAmount;

        while(dUserAmount > dAmountAvailable)
        {
         cout<<"That's too many, please try again";
         cin>>dUserAmount;
        }

        paPurchase[iUserItemCount].setiPluCode(iUserPLUCode);// Array of objects function calls
        paPurchase[iUserItemCount].setdInventory(dUserAmount);
        paPurchase[iUserItemCount].setdPrice(paInventory[iProductIndex].getdPrice());       
        paInventory[iProductIndex].setdInventory( paInventory[iProductIndex].getdInventory() - dUserAmount );       

            iUserItemCount++;

        cout <<"Are you done purchasing items? Enter 1 for yes and 0 for no.\n";
        cin >> bQuit;

    //NOTE: Put Amount * quantity for subtotal
    //NOTE: Put code to update subtotal (total += subtotal)

    // NOTE: Need to create the output txt file!

    }while(!bQuit);




  return 0;

} 
4

2 に答える 2

2

iUserItemCount初期化されることはありません。インデックスとして使用すると、未定義の動作が発生します。

于 2012-09-23T09:16:57.680 に答える
0

静的に割り当てられた配列を操作するため、おそらく配列の末尾の後に書き込むことにつまずいたでしょう。

ファイルには正確に 21 個のエントリがあると述べていますが、eof 条件ではどうなりますか? 最後のエントリを読み取った場合、ストリームにはまだ eof ビットが設定されていません。これは、読み込もうとして何もない場合にのみ発生します。21 番目のエントリの後、eof ビットが設定されていないため、ループは継続します。ガベージ情報を読み取り、paInventory[21] に格納しようとしますが、配列のサイズは 21 しかありませんでした。

//after last read x=21 and eof not set
while (!InputInventory.eof () )
{
    //first read causes eof to be set
    InputInventory >> iTempPluCode >> sTempDescription >> dTempPrice >> iTempType >> dTempInventory;

    //Accessing paInventory[21] here which causes your error
    paInventory[x].setiPluCode(iTempPluCode);
    //...//
}
于 2012-09-23T11:53:26.443 に答える