长话短说,我正在尝试为各种事情处理一些数组。在调试过程中,我需要打印数组。我想只有一个函数可以打印传递给它的数组。我也可以很容易地传递数组的维度。我们现在假设,我只使用二维数组 相信我;我已经回顾了这里提出的每个类似问题,并尝试实施建议的解决方案无济于事。我尝试过使用指针之类的东西。特别是,我在这篇文章中尝试了所有四种解决方案: 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可能与它有关,因为我似乎无法从示例中获得任何解决方案 - 即使我复制并粘贴整个源代码。
答案 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...