2

我确实有一个函数调用,例如:

int Filter(short* array, short nNumRow, short nNumCol)

但在它里面我想像这样处理数组:

array[y][x] = xx;

我尝试通过声明一个数组来解决这个问题

short help[nNumRow][nNumCol];
help = array;

但这行不通。如何在不更改函数参数列表的情况下处理该问题(此 *array 是我无法更改的不同函数的结果)?最好的当然是不需要(内存)副本。可能另一种选择是

 array[y*nNumCol + x] = xx;

但我不喜欢这种计算。那么如何做到最好呢?谢谢!

4

3 回答 3

8

如何在不更改函数参数列表的情况下处理该问题?

如果你不能这样做,那么你就会被“mangled array”array[y*nNumCol + x]表示法困住(这是旧风格,但其他方面都可以)。

最好和正确的解决方案是将函数更改为:

int Filter (short nNumRow, short nNumCol, short array[nNumRow][nNumCol])
{
   ...
   array[x][y] = something;
}

除非您要维护一些无法更改的旧废话,否则我不建议您使用最后的手段,这是函数内部的脏指针转换。编写这样的代码需要你确切地知道你在做什么,因为如果实际数据的类型或对齐不匹配,你会得到非常奇怪的错误。下面的代码可以工作并且就 C 语言而言是安全的,但它并不漂亮:

// BAD CODE, avoid this solution

#include <stdio.h>

int Filter (short* array, short nNumRow, short nNumCol)
{
  short(*array2D)[nNumCol];            // pointer to array of type short[nNumCol]
  array2D = (short(*)[nNumCol])array;  // dirty pointer conversion

  for(int i=0; i<nNumRow; i++)
  {
    for(int j=0; j<nNumCol; j++)
    {
      printf("%d ", array2D[i][j]);
    }
    printf("\n");
  }

  return 0;
}

int main (void) 
{
  short array[2][2] = { {1,2}, {3,4} };

  Filter((void*)array, 2, 2);
}
于 2019-08-13T08:07:09.377 回答
0

最好的(最佳)方法是您自己的解决方案:

array[y*nNumCol + x] = xx;

出于“美”的原因,您可以使用类似函数的宏来访问该数据:

#define arrElement(array,x,y) ((array)[(y)*nNumCol + (x)]]))

如果您只需要将此技巧应用于一个数组,那么您可以简化宏:

#define arrElement(x,y) (array[(y)*nNumCol + (x)]]))

如果在函数调用之前不知道数组的大小,则需要为宏添加一些复杂性:

#define arrElement(x,y,nNumCol) (array[(y)*(nNumCol) + (x)]]))

注意:我没有完全按照上面的说法发短信,但我过去几次成功地使用了这个技巧。


只有当数组始终具有相同的大小时,您才能使用指针类型(根据您的问题)。否则,您将不得不在运行时动态定义指针类型,这介于困难和不可能之间。


明智的做法是将数组大小也传递给函数,并检查坐标是否真的落在数组内。否则,您可能会遇到未定义的行为,访问定义范围之外的数据。

于 2019-08-13T09:45:18.863 回答
-2

不是最有效的方法,但您可以在函数内创建一个二维数组并将原始数组复制到其中:

#include <stdio.h>

int Filter(short* array, short nNumRow, short nNumCol) {
    short arr[nNumRow][nNumCol];
    memcpy(arr, array, nNumRow * nNumCol * sizeof(short));
    for (int i = 0; i < nNumRow; i++) {
        printf("| ");
        for (int j = 0; j < nNumCol; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("| \n");
    }
    return 0;

}

int main(void) {
    short arr[] = {1, 2, 3, 4, 5, 6 ,7, 8};
    Filter(arr, 2, 4);
    printf("---\n");
    Filter(arr, 4, 2);
    return 0;
}

在这里运行:https ://ideone.com/58KhYj

于 2019-08-13T08:06:30.770 回答