3

未知のサイズの 2 次元配列を渡す正しい方法は何ですか?

reprVectorsTree::reprVectorsTree(float tree[][], int noOfVectors, int dimensions)

関数の後半でこの配列の要素にアクセスする方法は?

呼び出し元の関数から 2 次元配列を渡す方法は?

- - -編集 - -

呼び出しは AC コードから行われ、AC から C++ へのインターフェイスがあるため、配列を使用したい

-----編集----- 呼び出し元の関数から 2 次元配列を渡す定義方法は?

float tree[15][2] = {{2,1},{2,1},{2,1},{2,1},{2,1},{2,1},{2,1},{2,1},{2,1},{2,1},{2,1},{2,1},{2,1},{2,1},{2,1}};

reprVectorsTree *r1 = new reprVectorsTree(tree[0][0],8,2);

上記のコードの何が問題になっていますか? パラメータ 1 を 'float' から 'float **' に変換できません。

4

5 に答える 5

1

サイズが不明な場合はfloat *tree、1D 配列への単純なポインターを使用できます。ただし、特定の要素を参照するための構文は、2D 配列の場合とは異なります。

reprVectorsTree::reprVectorsTree(float *tree, int noOfVectors, int dimensions)
{
    ...
    tree[ row_number * dimensions + column_number ] = 100.234;
}

呼び出しコードには、次のようなものがあります。

float d2array[ROWS][COLUMNS];
...
reprVectorsTree(&d2array[0][0], ROWS, COLUMNS);

更新しました

2D 配列を渡すさまざまなアプローチの次の例を検討してください。

#include <iostream>
#include <malloc.h>

float test[2][4] = 
{
   {3.0, 4.0, 5.0, 0},
   {6.0, 7.0, 8.0, 0}
};

void print(float *root, int rows, int columns)
{
   for (int row = 0; row < rows; ++row)
   {
      for (int col = 0; col < columns; ++col)
      {
         std::cout << root[row * columns + col ] << " ";
      }
      std::cout << std::endl;
   }
}

float *test2[2] = 
{
   &test[0][0],
   &test[1][0],
};

void print2(float **root, int rows, int columns)
{
   for (int row = 0; row < rows; ++row)
   {
      for (int col = 0; col < columns; ++col)
      {
         std::cout << root[row][col] << " ";
      }
      std::cout << std::endl;
   }
}

int main()
{
   print(&test[0][0], 2, 4);
   //print(test2, 2, 4); // doesn't work

   print2(test2, 2, 4);
   //print2(&test[0][0], 2, 4); // doesn't work
   //print2(&test[0], 2, 4); // doesn't work

   float **dynamic_array = (float **)malloc(2 * sizeof(float *));
   dynamic_array[0] = (float *)malloc(4 * sizeof(float));
   dynamic_array[1] = (float *)malloc(4 * sizeof(float));

   for (int row = 0; row < 2; ++row)
   {
      for (int col = 0; col < 4; ++col)
      {
         dynamic_array[row][col] = (float)(row * 4 + col);
      }
   }

   print2(dynamic_array, 2, 4);
   //print(dynamic_array, 2, 4); // doesn't work

   return 0;
}
于 2012-08-16T07:05:47.673 に答える
1

ポインターを使用する..

     reprVectorsTree(tree, noOfVectors, dimensions);// Calling function.

関数の定義:

reprVectorsTree(float **tree, int noOfVectors, int dimensions){


}

お役に立てると思います。

于 2012-08-16T06:55:37.543 に答える
0
#include <iostream>
using namespace std;

int
main(void)
{
    int layers = 3; // can be calculated in run-time
    int elem = 5; // can be calculated in run-time
    int* pArray = new int[layers * elem];
    /* usage */
    for (int i = 0; i < sizeof(pArray) / sizeof(pArray[0]); ++i) // traverse through layers
    {

        for (int j = 0; j < sizeof(pArray[0])/ sizeof(int); ++j) // traverse through elements in layer
        {
            // do some stuff
        }
    }
}
于 2012-08-16T07:21:31.133 に答える
0

C99以降の最新のCでは、それは単純です

void foo(size_t n, size_t m, double A[n][m]) {
  //
}

そしてどうぞ。覚えておかなければならない唯一のことは、サイズが引数リストの配列の前に来なければならないということです。

呼び出し側のスタックにそのような獣を割り当てないようにするには、次のことを行う必要があります

double (*A)[m] = malloc(sizeof(double[n][m]));

このような「マトリックス」は、次のようなもので慣れているように使用でき、A[i][j]への呼び出しは次のようになりfooます

foo(n, m, A);
于 2012-08-16T07:40:50.707 に答える
0

最初のアイデアは、ベクトルを使用することでした。ただし、C コードを使用している場合は、それをreprVectorsTree(float** tree, int noOfVectors, int dimensions).

あなたの場合:

float tree[15][2] = {{2,1},{2,1},{2,1},{2,1},{2,1},{2,1},{2,1},{2,1},{2,1},{2,1},{2,1},{2,1},{2,1},{2,1},{2,1}};

int nRows = 15;
int nCols = 2;

float** arr = new float*[nRows];

for (int i = 0; i < nRows; ++i) {
     arr[i] = new float[nCols];
}

for (int i = 0; i < nRows; ++i) {
    for (int j = 0; j < nCols; ++j) {
        arr[i][j] = tree[i][j];
    }
}

reprVectorsTree *r1 = new reprVectorsTree(arr, nRows, nCols);
于 2012-08-16T06:54:47.477 に答える