处理不同大小的多维数组的函数

时间:2015-03-06 22:29:20

标签: arrays pointers visual-c++ multidimensional-array arduino

长话短说,我正在尝试为各种事情处理一些数组。在调试过程中,我需要打印数组。我想只有一个函数可以打印传递给它的数组。我也可以很容易地传递数组的维度。我们现在假设,我只使用二维数组 相信我;我已经回顾了这里提出的每个类似问题,并尝试实施建议的解决方案无济于事。我尝试过使用指针之类的东西。特别是,我在这篇文章中尝试了所有四种解决方案: https://stackoverflow.com/a/17569578/4641918,我仍然会遇到各种各样的错误,具体取决于方法。 我不是编程新手,但我是C ++的新手。 这是我正在尝试做的一个非常简单的例子:

//  Array Failures
#define FIRSTWIDTH 6        //Number of Columns in First Array
#define FIRSTHEIGHT 5       //Number of Rows in First Array
#define SECONDWIDTH 4       //Number of Columns in Second Array
#define SECONDHEIGHT 2      //Number of Rows in Second Array


//  An couple of arrays are declared with dimensions WIDTH X HEIGHT
int firstArray[FIRSTWIDTH][FIRSTHEIGHT];
int secondArray[SECONDWIDTH][SECONDHEIGHT];

void setup()
{
Serial.begin(57600);
fillXXArray(FIRSTWIDTH, FIRSTHEIGHT, firstArray);
fillXXArray(SECONDWIDTH, SECONDHEIGHT, secondArray);  //GENERATES ERROR 1
Serial.println("Program Initialized");
printANYArray(FIRSTWIDTH, FIRSTHEIGHT, firstArray); 
}

void loop(){return;}

void fillXXArray(int width, int height, int myArray[][FIRSTHEIGHT]){
// Fills an array with values that is WIDTH X HEIGHT
// Inner Subset is the sum of its coordinates
for (int w = 0; w < width - 1; w++){
    for (int h = 0; h < height - 1; h++){
        myArray[w][h] = w + h;
    }
}

// Loop across the bottom row and set them to the sum of the column.
for (int w = 0; w < width - 1; w++){
    for (int h = 0; h < height - 1; h++){
        myArray[w][height - 1] = myArray[w][height - 1] + myArray[w][h];
    }
 }

// Loop down the last column and set it to the product of the values in row.
for (int h = 0; h < height - 1; h++){
    myArray[width - 1][h] = myArray[0][h];
    for (int w = 1; w < width - 1; w++){
        myArray[width-1][h] = myArray[width-1][h] * myArray[w][h];
    }
}
myArray[width - 1][height - 1] = width * height;

//  The final array is populated like this.
//
//            0     1     2    ...         w
//    0    [  0     1     2    ...   (Product of Row)  ]
//    1    |  1     2     3    ...   (Product of Row)  |
//    2    |  2     3     4    ...   (Product of Row)  |
//   ...   | ...   ...   ...   ...   (Product or ...)  |
//    h    [(Sum) (Sum) (Sum)  ...       (h*W)         ]
//
}

void printANYArray(size_t width, size_t height, int myArray[][height]){  //GENERATES ERROR 2
Serial.println("printXXArray: ");
for (int h = 0; h < height; h++){
    for (int w = 0; w < width; w++){
        Serial.print(myArray[w][h]); Serial.print("\t\t");
    } Serial.println();
} Serial.println();
}

错误1:(VS2013突出显示“secondArray”)错误:类型“int()[2]”的参数与“int()[5]”类型的参数不兼容。这非常明显,因此我正在努力避免。所以我从函数定义中删除常量并得到第二个错误。

错误2 ::突出显示“高度”错误:不允许参数。

初级解决方案结束。

NEXT SOLUTION:将数组作为指针传递。 我将函数声明更改为:

void printANYArray(size_t width, size_t height, int **myArray){

但是它没有在函数中引发一个标志,但是函数调用失败了:

 printANYArray(FIRSTWIDTH, FIRSTHEIGHT, firstArray);

“firstArray”错误:类型“int(8)[5]”的参数与参数类型“int **”不兼容

下一个解决方案:“该功能正在使用指针,所以我不应该发送一个地址吗?”我将函数调用更改为:

printANYArray(FIRSTWIDTH, FIRSTHEIGHT, &firstArray);

只是“&amp;”突出显示,ERROR:类型“int(*)[6] [5]”的参数与参数类型“int **”不兼容 等等......什么?!?我以为我只是发送地址。

NEXT GUESS('因为这就是我现在正在做的事): 我在声明中删除了其中一个*。这只是从错误消息中删除了一个星星。至少那是可以理解的。

所以......你能提供的任何帮助都会有所帮助。再一次,这是因为Arduino可能与它有关,因为我似乎无法从示例中获得任何解决方案 - 即使我复制并粘贴整个源代码。

1 个答案:

答案 0 :(得分:0)

我会避免使用模板,因为在Arduino上你想保留模板 编译代码小。我会改为旧式1D阵列:

int firstArray[FIRSTHEIGHT * FIRSTWIDTH];
int secondArray[SECONDHEIGHT * SECONDWIDTH];

C语言系列中的通常惯例是存储矩阵 按行,并使第一个索引成为行索引。这个 约定,行 i j 的单元格为arr[i][j] “真正的”2D阵列,以及arr[width * i + j]这些“伪造的”2D阵列。 以下是填写它们的方法:

void fillXXArray(int *myArray, int height, int width) {

    // Inner Subset is the sum of its coordinates
    for (int h = 0; h < height - 1; h++) {
        for (int w = 0; w < width - 1; w++) {
            myArray[width * h + w] = h + w;
        }
    }

    // Bottom row has the sums of the columns.
    for (int w = 0; w < width - 1; w++) {
        myArray[width * (height - 1) + w] = 0;
        for (int h = 0; h < height - 1; h++) {
            myArray[width * (height - 1) + w] += myArray[width * h + w];
        }
     }

    // Last column has the product of the rows.
    for (int h = 0; h < height - 1; h++) {
        myArray[width * h + (width - 1)] = myArray[width * h + 0];
        for (int w = 1; w < width - 1; w++) {
            myArray[width * h + (width - 1)] *= myArray[width * h + w];
        }
    }

    // Last cell.
    myArray[width * (height - 1) + (width - 1)] = width * height;
}

我冒昧地把数组作为第一个参数。这是 非正式约定:每当你将指针与大小一起传递时 信息,指针通常是第一位的。 C.F. snprintf()和 例如strncpy()

如果您不介意额外的内存成本,那么您可以使用额外的内存 用于存储每行起始地址的指针数组。这条路 您可以使用更简单的语法arr[i][j]访问数组元素, 其中arr现在是辅助数组。这通常会完成 通过构造函数中的动态分配,但由于您的数据全部 静态,我们可以避免动态分配:

int firstArrayData[FIRSTHEIGHT * FIRSTWIDTH];       // actual data
int *firstArray[FIRSTHEIGHT] = { firstArrayData };  // pointers to rows

此处,只有firstArray[]的第一个指针被正确初始化。 您必须在运行时初始化其余部分,例如在 fillXXArray()

void fillXXArray(int **myArray, int height, int width) {

    // Initialize the pointers to the start of the rows.
    for (int h = 1; h < height; h++) {
        myArray[h] = myArray[0] + width * h;
    }

    // Inner Subset is the sum of its coordinates
    for (int h = 0; h < height - 1; h++) {
        for (int w = 0; w < width - 1; w++) {
            myArray[h][w] = h + w;      // <-- syntax like 2D arrays
        }
    }

    // etc...