【问题标题】:Filling data in 2D dynamic array在二维动态数组中填充数据
【发布时间】:2016-06-08 13:25:10
【问题描述】:

我想在内存中存储String类型的数据变量,这些变量实际上是图像的十六进制代码。所以会有一个二维动态数组,它在运行时存储数据。 我尝试了以下代码来填充数据,首先创建指向指针动态数组的指针,如下所示。

//dynamic allocation of array
int row = rows - 1;
int col = cols - 1;
Mat img = image;
cout << " row " << row << " col " << col <<endl;

    String **matrix;
    matrix= new String*[row]; // dynamic array (size 10) of pointers to int

    for (int i = 0; i < 10; ++i) {
        matrix[i] = new String[col];
        // each i-th pointer is now pointing to dynamic array (size 10) of actual int values
    }

在这里,如果我没记错的话,我把内存放在了堆上。所以我写了嵌套循环来提取RGB信息,转换成十六进制字符串并存储在数组中。

for (int r = 0; r <= row; r++) {

        cout << endl;

        for (int c = 0; c <= col; c++)
        {

            Vec3b intensity = img.at<Vec3b>(r, c);

            uchar blue = intensity.val[0];
            int b = (int)blue;
            uchar green = intensity.val[1];
            int g = (int)green;
            uchar red = intensity.val[2];
            int r = (int)red;

            //filling dynamic array
            matrix[row][col] = RGBToHex(r,g,b);

        }

    }

这是我将 RGB 转换为十六进制字符串的方法。

string RGBToHex(int rNum, int gNum, int bNum)
{
    // returns 6 digit hex code
    string result;
    char r[255];
    sprintf_s(r, "%.2X", rNum);
    result.append(r);
    char g[255];
    sprintf_s(g, "%.2X", gNum);
    result.append(g);
    char b[255];
    sprintf_s(b, "%.2X", bNum);
    result.append(b);
    return result;
}

我尝试提取 RGB 信息,转换为十六进制字符串,存储在 .txt 文件中,它可以工作,但在尝试填充数组时抛出以下异常。

请指出问题并让我知道我错在哪里。

 **Exception thrown at 0x000007FEE1AD7330 (opencv_world310.dll) in ImageDecoder.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.

    If there is a handler for this exception, the program may be safely continued.**

【问题讨论】:

    标签: c++ arrays loops opencv


    【解决方案1】:

    矩阵[行][列] = RGBToHex(r,g,b);

    你定义matrix的方式,最多可以访问matrix[row-1][col-1],不是吗?

    并不是说rowcol 似乎是固定值。

    【讨论】:

    • int row = rows - 1; int col = cols - 1;我是在循环之前完成的。
    【解决方案2】:
    for (int r = 0; r <= row; r++) {
    

    我认为应该是r &lt; row 而不是r &lt;=row

    如果你分配了 10x10 的二维数组,那么这个 matrix[row][col] 应该是 matrix[9][9] 并且你的循环使它成为 matrix[10][10] 这是一个问题。

    下面的语句也有问题,使用 row 而不是 10。

     for (int i = 0; i < 10; ++i) {
    

    【讨论】:

    • 它工作正常,我将十六进制信息打印到 .txt 文件中进行测试。
    • 加上索引矩阵应该是matrix[r][c],因为这些是运行变量。 matrix[row][col] 仍然会导致索引过度。
    • int row = rows - 1; int col = cols - 1;这就是我在循环外定义变量的方式。
    • 另外,您可能想要更改变量 int r = (int)red; 的名称,否则会隐藏行索引变量 r
    • @RoshaanNayyar 我也看到你的新代码有问题。您现在为 9x9 动态分配内存并尝试访问第 10 个元素。
    猜你喜欢
    • 2016-08-07
    • 2019-02-26
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多