【问题标题】:How to pass a 2-dimensional array to a C function如何将二维数组传递给 C 函数
【发布时间】:2015-07-27 18:43:52
【问题描述】:

这是我用普通 C 语言编写的代码。我想添加数据的每一列。例如 28+518+917、34+512+914 等:

short rawdata[][20]={
28,34,36,39,42,47,37,41,41,33,33,36,36,36,27,27,24,31,29,26,
518,512,507,508,521,522,524,525,519,512,506,511,511,501,501,495,497,500,508,504,
917,914,905,909,892,879,869,873,876,877,875,870,883,893,893,884,881,882,885,888
};

int aae( int nLenFrame, short **psDataBuffer, float *pFV )
{
    float sum = 0.0;
    int i=0, j;
    for (j=0; j<AXES; j++)
    {
        printf("Component: %d\n", *(*(psDataBuffer +j) + i));
    }
    return 1;
}


int main(int argc, char *argv[]){
    int arraySize;
    float pFV;
    int a;

    arraySize = sizeof(rawdata)/sizeof(int);
    a = aae( arraySize, rawdata, &pFV );
    printf("aae = %f\n", pFV);
}

我正在尝试将 rawdata 传递给函数 aae,但是当我编译时,我从 gcc 收到以下错误/警告,这自然会使我的代码崩溃。我应该如何将rawdata 传递给aae

$ gcc aae.c -o aae
aae.c: In function ‘main’:
aae.c:31:2: warning: passing argument 2 of ‘aae’ from incompatible pointer type [enabled by default]
  a = aae( arraySize, rawdata, &pFV );
  ^
aae.c:13:5: note: expected ‘short int **’ but argument is of type ‘short int (*)[20]’
 int aae( int nLenFrame, short **psDataBuffer, float *pFV )
     ^

提前感谢您的帮助。

【问题讨论】:

  • 错误信息包含一个非常明确的提示,说明如何声明参数(参见“注释”)。
  • Joachim 所说的或者(如果你想要 dirtier 路径)传递为&amp;(rawdata[0]) ...
  • @FelixPalmen 第二种解决方案可能会消除错误,但仍然不正确。参见例如this old answer of mine 解释一下。
  • 是的,你是对的,它应该是 &amp;(rawdata[0][0]) 和一个只接受 short * 的参数。如果您希望它适用于不同的行长度 ...,则适用
  • 我重申我原来的评论:阅读错误信息,它告诉你应该做什么。如果您看到“注释”,编译器会说您将short int (*)[20] 作为类型传递,所以只需像这样声明参数short (*psDataBuffer)[20]。原因是数组,当您将它们传递给函数时,会衰减为指针,因此数组数组会衰减为指向数组的指针,这就是新的声明。

标签: c arrays function argument-passing


【解决方案1】:

我以XY problem 回答这个问题,因为您想对列求和,这样做会遇到其他问题,您会问如何解决这些问题。但也有我必须猜测的不完整信息的答案。

您声明了一个二维数组short rawdata[][20],但提供的数据就像它是一个一维数组一样。然后你摆弄指针并想出一个错误的答案。

这个答案正确地初始化了一个二维数组,并通过使用数组索引简单地对列求和。

#include <stdio.h>

#define AXES 3
#define COLS 20

short rawdata[AXES][COLS]={
    {28,34,36,39,42,47,37,41,41,33,33,36,36,36,27,27,24,31,29,26 },
    {518,512,507,508,521,522,524,525,519,512,506,511,511,501,501,495,497,500,508,504},
    {917,914,905,909,892,879,869,873,876,877,875,870,883,893,893,884,881,882,885,888}
};

void sumcols(short rawdata[][COLS]) {
    int col, axis;
    float sum;

    for (col=0; col<COLS; col++) {
        sum = 0;
        for (axis=0; axis<AXES; axis++) {
            sum += rawdata [axis][col];
        }
        printf("Column %2d sum = %f\n", col, sum);
    }
}

int main(void) {
    sumcols(rawdata);
    return 0;
}

程序输出:

Column  0 sum = 1463.000000
Column  1 sum = 1460.000000
Column  2 sum = 1448.000000
Column  3 sum = 1456.000000
Column  4 sum = 1455.000000
Column  5 sum = 1448.000000
Column  6 sum = 1430.000000
Column  7 sum = 1439.000000
Column  8 sum = 1436.000000
Column  9 sum = 1422.000000
Column 10 sum = 1414.000000
Column 11 sum = 1417.000000
Column 12 sum = 1430.000000
Column 13 sum = 1430.000000
Column 14 sum = 1421.000000
Column 15 sum = 1406.000000
Column 16 sum = 1402.000000
Column 17 sum = 1413.000000
Column 18 sum = 1422.000000
Column 19 sum = 1418.000000

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多