3

これは、2 つの整数ポインター aV と aT を持つ私の構造体です。

struct ADJP
{
    int *aV;
    int eV;
    int nV;
    int *aT;
    int nT;
};
ADJP *Umb = NULL;

aV と aT の割り当てプロセスは次のようになります。

    for(int i=0; i<nb; i++)
    {
        Umb[i].aV = new int[N];
        for(int j=0; j<n; j++)
            Umb[i].aV[j] = pIn[i].aV[j];
}

Umb 配列から特定の要素を 1 つ削除したい。たとえば、Umb[5] を削除したいのですが、どうすれば削除できますか。さまざまな計算法を試しましたが、割り当てられたポインターが原因でエラーが発生したと思います。follow メソッドを試してみましたが、この種の構造体配列では機能しません。ポインタを持たない構造体配列で動作しています。

int DeleteStructElement(int Index, ADJP *b, int N, int at)
{
    for(int i=Index; i<N-1; i++)
        memmove(&b[i], &b[i+1], (N-at-1)*sizeof*b);     // moving the terms of array
    N--;                                                // updating new size
    return N;
}

構造体配列から要素を削除する方法はありますか?

4

3 に答える 3

2

削除された要素の配列を削除して、メモリを解放する必要があります。

delete[] b[Index].aV;
delete[] b[Index].aT;

次に、単一の memmove を実行して要素を削除するだけです。

memmove(&b[Index], &b[Index+1], (N-Index-1) * sizeof(b[Index])

編集:マフムードが指摘するように、これはatパラメーターを使用しませんDeleteStructElement; そのパラメーターの意図がわかりません。

于 2012-08-26T04:09:26.443 に答える
2
   int DeleteStructElement (int index, ADJP * b, int nb) {
      delete [] (b[index].aV);
      for (int i = index; i < nb - 1; ++i) {
         b[i] = b[i+1];
      }
      return nb - 1;
   }
于 2012-08-26T04:12:23.873 に答える
0

実際に C++ を使用していると仮定すると、 のデストラクタADJPDeleteStructElement.

newしかし、 /を使用して興味深い "C" を実行している場合delete(おそらく C++ の限定されたサブセットでしょうか?)、delete内から呼び出すことをお勧めしますDeleteStructElement

しかし、割り当てられたポインターが原因でエラーが発生したと思います

この質問に答えることは、他の質問よりもはるかに重要かもしれません。これは実行時エラーだったと思いますか?デバッガーを使用して、障害が発生した場所を正確に突き止めます。

于 2012-08-26T04:13:17.070 に答える