簡體   English   中英

從函數 C 返回一個數組:下標值不是數組、指針或向量

[英]Return an Array from a function C: Subscripted value is not an array, pointer, or vector

我需要返回矩陣的值,但我得到了這個錯誤

Subscripted value is not an array, pointer, or vector

在:

qk_output[m][o] = 0;

qk_output[m][o] += queries[m][n] * keys[n][o];

有人可以幫助我嗎? 謝謝!

int* multmm(int queries[M][N], int keys[N][O]) {
  // Matrix Multiplication
  int* qk_output = (int*)malloc(sizeof(int) *M*N);
  for (int m = 0; m < M; m++) {

    for (int o = 0; o < O; o ++) {
      qk_output[m][o] = 0;

      for (int n = 0; n < N; n++) {
        qk_output[m][o] += queries[m][n] * keys[n][o];
      }
    }
  }
 return qk_output;
}
int* qk_output = (int*)malloc(sizeof(int) *M*N);

qk_output是一個指向int的指針

編譯器知道如何訪問qk_output[n]但不知道如何訪問qk_output[m][n] ,您需要切換到:

int (*qk_output)[N] = malloc(sizeof(*qk_output) * M); // Don't cast malloc

也就是說,一個指向N int數組的指針

現在編譯器有足夠的信息來訪問qk_output[m][n]

對於返回問題:您可以使用void *multmm(...)int (*multmm(...))[N] ,第二個為編譯器提供更多信息,因此不易出錯。

就像是:

int (*multmm(int queries[M][N], int keys[N][O]))[N]
{
    int (*qk_output)[N] = malloc(sizeof(*qk_output) * M);
    ...
    return qk_output;
}

int main(void)
{
    int (*arr2D)[N] = multmm(...);
    ...
}

要從函數返回二維數組,您可以執行

#define N 4
#define M 3

int (*foo(void ))[N]
{
    int (*p)[N] = malloc(M * sizeof *p);
    for (int i = 0; i < M; ++i)
    {
        for (int j = 0; j < N; ++j)
        {
            p[i][j] = i + j;
        }
    }
    return p;
}

int main (void){
    int (*mat)[N] = foo();
    
    for (int i = 0; i < M; ++i)
    {
        for (int j = 0; j < N; ++j)
        {
            printf("%d ", mat[i][j]);
        }
        puts("");
    }
    
    free(mat);
    return 0;   
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM