![](/img/trans.png)
[英]error: subscripted value is neither array nor pointer nor vector when printing an array within a function (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.