【问题标题】:runtime allocation of array (C++, FMX)数组的运行时分配 (C++, FMX)
【发布时间】:2019-12-24 06:09:00
【问题描述】:

我在运行时需要一个数组来保存一些 x-y 坐标数据。它可能从几十个点到几千个点不等。因此,为了提高效率,我想在运行时分配数组。我找到了an example,但我无法扩展它。这是我现在拥有的:

double *A;
A = new double[NumSamp];  // NumSamp is an int set in earlier code at runtime
for (int y = 1; y < NumSamp ; y++) {
       A[y] = y;
}
delete [] A;
A = NULL;

此代码工作正常,但当我尝试更改为二维时,我得到E2034 Cannot convert double( *)[2] to double*。这是我更改的导致错误的行:

A = new double[NumSamp][2];

我应该怎么做?我在 C++Builder (10.3.1) 中工作,目标是 Win32、iOS 和 Android。

【问题讨论】:

  • 那是因为双 *A 不是正确的类型。
  • 实际上可能与此重复:stackoverflow.com/questions/936687/… 很多人担心使用 [][] 时的性能和存储问题,他们建议创建一个包装一维数组的类可以像二维数组一样访问。
  • Tagger5926 我看到了那个帖子,但我不确定是否有更简单的方法(而且我是新手)。我会看看我能用它做什么
  • 如果是这样,那么选择最易读和更容易使用的。一旦您开始工作并且遇到性能问题或严格的存储要求,您可以相应地更新您的问题。
  • @relayman357 你的vector 代码需要调用A.resize(NumSamp); 而不是A.reserve(NumSamp);。您实际上并没有将任何元素推入向量中,因此您对 operator[] 的使用是未定义的行为。见std::vector::resize() vs. std::vector::reserve()。此外,您的最终解决方案应该作为单独的答案发布(如果有的话),而不是作为对您问题的编辑。

标签: firemonkey c++builder


【解决方案1】:

在您的示例中,您首先忘记更新数组的类型。它不再是double *,而是实际上double **。尝试将声明和初始化保持在同一行以避免这些问题。即double **A = new double*[NumSamp];

此外,您不能像这样为二维数组分配动态内存。请尝试以下操作。

int main()
{
    int const Y_VAL = 1;
    int const X_VAL = 0;
    // declare array as a 2d array
    double **A;
    // Allocate memory for main array
    A = new double*[NumSamp]; 
    // allocate memory for each sub array
    for (int y = 0; y < NumSamp ; y++) {
       A[y] = new double[2];
    }

    for ( int y = 0; y < NumSamp; ++y) {
        A[y][Y_VAL] = 4; // Initialize X and Y values
        A[y][X_VAL] = 4;
    }    



    // free memory
    for (int y = 0; y < NumSamp ; y++) {
        delete[] A[y];
    }
    delete [] A;
    A = NULL;
}

另外,第二个数组似乎是静态的。为什么不只是创建一个结构并使用向量,因为它们可以是动态的。例如

struct Data
{
    double x, y;
    // Constructor with initializer list to initialize data members x and y
    Data( double const _x, double const _y ) : x(_x), y(_y){}
};

int main()
{
    std::vector<Data> A;
    A.reserve(NumSamp); // reserve memory so it does not need to resize the capacity
    for(auto a : A)
    {
         a.emplace_back( 2, 5 ); // Initialize all "Data" with x=2, y=5;
    }
    // access data
    for(auto a : A)
    {
        std::cout << a.x << ":" << a.y << '\n';
    }
    std::cout << std::endl;
}

【讨论】:

  • 如何使用这种方法引用每个点?这是正确的 - x= A[5][0] 和 y =A[5][1]?哪里 5 是第 5 点?
  • 所以这取决于你希望如何排列结构。当前示例的用法是 x = [numSamp - 1][0]; y = [numSamp - 2][1];另外,尽量不要使用幻数。我稍后会更新示例。
  • 看起来不错,明天试试。谢谢!
  • 没问题。如果您遇到问题,请告诉我
  • 请注意,FMX 有自己的TPointF 类型
猜你喜欢
  • 2011-03-23
  • 1970-01-01
  • 2016-03-27
  • 1970-01-01
  • 2012-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多