【问题标题】:C++: TwoDimensional Array: One dimension fixed?C++:二维数组:一维固定?
【发布时间】:2011-03-27 19:29:30
【问题描述】:

我需要将double [][6] 传递给一个方法。但我不知道如何创建那个二维数组。

6 是一个固定大小(或“字面常量”,如果我的术语正确的话),该方法接受。我正在尝试这样的事情,但没有成功......

double *data[6] = new double[6][myVariableSize];

所以,这个方法真的是这样的:

int myMethod(double obj_data[][6]);

提前致谢

【问题讨论】:

  • 您看到了什么错误信息?

标签: c++ multidimensional-array memory-management


【解决方案1】:

我无法从问题中分辨出哪个维度是哪个维度,但这可能值得一试:

double (*data)[6] = new double[myVariableSize][6];

【讨论】:

  • 对不起,我只是把错误放在你的正文中,用于等宽字体。
  • @Martijn Courteaux, std::bad_alloc 通常意味着您内存不足或尝试分配负长度数组。 myVariableSize 的值是多少?你确定它已经初始化了吗?
  • 要在评论中获得等宽文本,请用反引号 (`) 将其括起来
  • 啊哈!!感谢您的提示!大小为负数!
【解决方案2】:

在 C++ 中,您可以使用 std::array<std::vector<double>, 6>。

typedef std::array<std::vector<double>, 6> my_array_t;

int myMethod( const my_array_t& obj_data );

如果您的编译器仍然不支持std::array,您可以改用boost::array。

【讨论】:

  • boost::array 在 C++ 中可用。 std::array 来自 C++0x,但已经被许多现代编译器支持。
  • 这不是双[6][],而是双[][6]。也就是说,一个 std::vector<:array>>.
  • @DeadMG,取决于 OP 真正想要什么。从问题上看不清楚。
【解决方案3】:

这应该可行:

int myMethod(double obj_data[][6])
...
int myVariableSize = 10;
double (*data)[6] = new double[myVariableSize][6];
myMethod(data);

如前所述,只有第一个维度可以是可变的!

【讨论】:

  • +1:这行得通。我最初尝试过同样的事情,但由于某种原因无法编译。
【解决方案4】:

您的方法定义应如下所示(以匹配您的定义):

int myMethod(double obj_data[6][]);

..但这不是有效的 C++,因为只有第一个维度可以是未定义的。请尝试以下操作:

int myMethod(double **obj_data, const int numOfColumns, int numOfRows)
{
    // Set the element in the last column / row to 5
    obj_data[numOfRows-1][numOfColumns-1] = 5;

    return 0;
}


int main(int argc, char* argv[])
{
    // Define array size
    int myNumOfRows = 5;
    const int numOfColumns = 6;

    // Allocate memory
    double** data = new double*[myNumOfRows];
    for (int i = 0; i < myNumOfRows; ++i)
    {
        data[i] = new double[numOfColumns];
    }

    // Do something with the array
    myMethod(data, numOfColumns, myNumOfRows);

    return 0;
}

【讨论】:

  • 目前尚不清楚哪种方式是正确的,但 OP 似乎确实将两个维度混淆了
【解决方案5】:

我和我的同事无法得到您提议解决的问题的任何变化。但这确实有效并且可以编译:

int myMethod(double** obj_data)
{
    return 5;
}

int _tmain(int argc, _TCHAR* argv[])
{
    const int myVariableSize = 3;
    double** b = new double*[3];
    for (int i = 0 ; i < 3;i++)
    {
        b[i] = new double[myVariableSize];
    }

    myMethod(data);

    return 0;
}

我建议您重新使用双向量作为二维数组,或者使用一些 Boost(有人告诉我)的多维数组。

【讨论】:

    猜你喜欢
    • 2012-10-29
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多