0

プログラム全体のこのスニペットがあります。この関数、特にプログラムのこの部分では、ユーザーはアレイから削除するホームの MLS# を入力します。最初の "for" ステートメントは MLS# を検索し、次に null のすべてのデータを検索します。次の「for」ステートメントに問題があります。インデックスが null になった後、すべてのデータを左に移動します。構造体配列に格納されるデータは次のとおりです。

struct mlsListing { int mlsNum;           // Struct Array holds one line of the struct
                    double price;         // mlsListing 
                    int type; 
                    string zip; 
                    string company; 
                    string realty; 
                  }; 
 const int MAX_LISTINGS = 750;  
        mlsListing houseData[MAX_LISTINGS]; 
 const int NOT_FOUND = -1;
 int targetMLS; // Variable for target MLS
 int mlsDelete; // Variable for target MLS found
 int mlsCounter;// Counter for finding target MLS 
 int count;     // Array Counter


// Function 

void {

 cout << "Enter the MLS# you wish to delete: "; 
           cin >> targetMLS;                       // User input MLS#


        for (mlsCounter = 0; ((mlsCounter < count) && (mlsDelete == NOT_FOUND));
                                 mlsCounter++) {

                 if (houseData[mlsCounter].mlsNum == targetMLS) {

                    mlsDelete = houseData[mlsCounter].mlsNum; 

                    houseData[mlsCounter].mlsNum = 0; 
                    houseData[mlsCounter].price = 0;
                    houseData[mlsCounter].type = 0;
                    houseData[mlsCounter].zip.clear(); 
                    houseData[mlsCounter].company.clear();
                    houseData[mlsCounter].realty.clear(); 
                  }
          }


         // Shifting indices to the left after deletion?

          for (move = mlsCounter;move < count; move++){

              houseData[move].mlsNum = houseData[move+1].mlsNum; 
              houseData[move].price = houseData[move+1].price; 
              houseData[move].type = houseData[move+1].type; 
              houseData[move].zip = houseData[move+1].zip; 
              houseData[move].company = houseData[move+1].company;
              houseData[move].realty = houseData[move+1].realty;  
          } 

         count--; 
}
4

3 に答える 3

2

2 番目の for ループは境界を超えています。それは違いない:

for (move = mlsCounter;move < count - 1; move++)
于 2013-04-03T03:31:42.097 に答える
0

これは、残りのすべてのアイテムを調べて、それらを 1 つ近くに移動することによって、配列内のその位置からそのアイテムを削除することです (そして、最後にカウントを減らします)。

簡単な例:

文字だけを含む単純な配列があるとします。10文字の配列を用意しましょう:

Array position :   [0]  [1]  [2]  [3]  [4]  [5]  [6]  [7]  [8]  [9]
Values in array:    a    l    p    h    a    b    e    t    i    c

[5] の位置の文字 (つまり、'b') をどのように削除しますか? 残りの文字をすべて移動すると、次のようになります。

Array position :   [0]  [1]  [2]  [3]  [4]  [5]  [6]  [7]  [8]  [9]
Values in array:    a    l    p    h    a    e    t    i    c    

これは、まさに for ループが行っていることです。構造のすべての部分に対してそれを行い、次のインデックスの構造のすべての部分を前のインデックスに効果的にコピーします。

私の記憶が正しければ、それは構造体では不要です。私はあなたが言うことができるはずだと信じていますhouseData[move] = houseData[move+1]、そして後者を前者にビットごとにコピーするだけです。

編集

コメント/ディスカッションに基づいて、問題は異なります。適切なタイミングで上部の for ループから抜け出す必要があります。また、2 番目のループが範囲外にならないように設定する必要があります。

for (mlsCounter = 0; ((mlsCounter < count) && (mlsDelete == NOT_FOUND));
                             mlsCounter++) {

             if (houseData[mlsCounter].mlsNum == targetMLS) {

                mlsDelete = houseData[mlsCounter].mlsNum; 

                houseData[mlsCounter].mlsNum = 0; 
                houseData[mlsCounter].price = 0;
                houseData[mlsCounter].type = 0;
                houseData[mlsCounter].zip.clear(); 
                houseData[mlsCounter].company.clear();
                houseData[mlsCounter].realty.clear(); 

                break;
              }
      }

   for (move = mlsCounter;move < count - 1; move++){
于 2013-04-03T03:25:50.397 に答える
0

リストは、そのタスクにより適したデータ構造になると思います。さらに、いずれにせよ、可能であれば、標準ライブラリによって提供されるコンテナーの使用を検討する必要があります。

std::list<mlsListing> housedata; // so you can easily add stuff at the end, and remove stuff in the middle at low cost

std::remove_if( housedata.begin(), housedata.end(), 
                [&](mlsListing current) -> bool 
                {
                    if (current.mlsNum == targetMLS)
                    {
                        mlsDelete = current.mlsNum;
                        return true;
                    }
                    return false;
                }
              )
于 2013-04-03T07:42:25.480 に答える