0

2D配列を渡す必要があるC++ライブラリを使用しています。彼らのコード例は、次のような静的なサイズの配列を示しています。

double data[][2] = {
  { 10, 20, },
  { 13, 16, },
  { 7, 30, },
  { 15, 34, },
  { 25, 4, },
};

ただし、実行時サイズのデータ​​を渡す必要があります。だから私はこれをやろうとしていました:

  // unsigned numBins  is passed in to this function and set at run time

  double** binData = new double*[numBins];
  for(unsigned i=0; i < numBins; ++i) {
    binData[i] = new double[2];
  }
  //Set the data with something like
  //   binData[7][0] = 10;
  //   binData[7][1] = 100;

  //Later, diligently delete my data...

ただし、これは私が使用しているライブラリでは失敗します。いくつかのガベージ数のグラフ化は終了です。

配列はポインタではないことを理解しています。そして、ライブラリはどこかで「sizeof」を実行することで混乱している可能性があります。

このライブラリ(サードパーティ)を変更できない場合、動的なサイズのデータ​​を渡すにはどうすればよいですか?

ありがとう、マディ。

4

2 に答える 2

1

おそらく、API は、2D 配列の平坦化された表現であると想定するものの最初の要素へのポインターを期待しています。

したがって、簡単なアプローチは次のとおりです。

template<typename T>
struct FlatVectorAs2D {
private:
  size_t width;
  size_t height;
  std::vector<T> flat_vec;
public:
  std::vector<T>& base() { return flat_vec; }
  std::vector<T> const& base() const { return flat_vec; }
  size_t w() const { return width; }
  size_t h() const { return height; }
  T* operator[]( size_t index1 ) {
    return &flat_vec[index1*height];
  }
  T const* operator[]( size_t index1 ) const {
    return &flat_vec[index1*height];
  }
  FlatVectorAs2D( size_t w = 1, size_t h = 1 ):width(w), height(h) {
    flat_vec.resize(w*h);
  }
  void resize( size_t w, size_t h ) {
    width = w;
    height = h;
    flat_vec.resize(w*h);
  }
  T* raw() { return flat_vec.data(); }
  T const* raw() const { return flat_vec.data(); }
};

使用する:

void api_function(double* d);
int main() {
  size_t width = 50;
  size_t height = 100;
  FlatVectorAs2D<double> buffer( width, height );
  buffer[0][1] = 1.0;
  api_function( buffer.raw() );
}

当然、これは API が正確にどのように機能するかに依存します。

しかし、私の推測が正しければ、これは役に立ちます。

于 2013-01-03T20:50:09.513 に答える
0

これを試して:

typedef double two_doubles[2];

int main()
{
    two_doubles * p = new two_doubles[300];

    // ...

    delete[] p;
}

p2 つの double の 200 単位の配列の最初のサブ配列を指すようになりました。つまりp[i]、、double[2]およびはそのメンバー要素です。p[i][0]p[i][1]

std::unique_ptr<two_doubles[]> p(new two_doubles[300]);メモリ管理を忘れて使用する方がさらに良いです。)

于 2013-01-03T20:36:34.703 に答える