我有功能和主要
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <sys/time.h>
setArray(double *thearray){
*thearray[0][0] = 2.0;
*thearray[0][1] = 2.0;
*thearray[1][0] = 2.0;
*thearray[1][1] = 2.0;
}
void main(){
double myarray[2][2];
setArray(&myarray);
}
我无法在setArray
函数上指定数组的大小,因为我不知道它是什么。我需要在这个特定的功能中填满阵列,但我不能。得到错误:
test.c: In function ‘setArray’:
test.c:8:13: error: subscripted value is neither array nor pointer nor vector
test.c:9:13: error: subscripted value is neither array nor pointer nor vector
test.c:10:13: error: subscripted value is neither array nor pointer nor vector
test.c:11:13: error: subscripted value is neither array nor pointer nor vector
test.c: In function ‘main’:
test.c:16:1: warning: passing argument 1 of ‘setArray’ from incompatible pointer type [enabled by default]
test.c:7:1: note: expected ‘double *’ but argument is of type ‘double (*)[2][2]’
答案 0 :(得分:2)
您可以使用VLA:
void setArray(int m, int n, double arr[m][n])
{
for (int r = 0; r < m; ++r)
for (int c = 0; c < n; ++c)
arr[r][c] = 2.0;
}
int main()
{
double myarray[2][2];
setArray(2, 2, myarray);
}
在C99中支持VLA,在C11中是可选的。如果您的编译器不支持VLA,则无法满足您的要求。但是,您可以将数组作为1-D数组传递,并使用算术找到正确的元素:
void setArray(int num_rows, int num_cols, double *arr)
{
#define ARR_ACCESS(arr, x, y) ((arr)[(x) * num_cols + (y)])
for (int r = 0; r < num_rows; ++r)
for (int c = 0; c < num_cols; ++c)
ARR_ACCESS(arr, r, c) = 2.0;
#undef ARR_ACCESS
}
int main()
{
double myarray[2][2];
setArray(2, 2, (double *)&myarray);
}
答案 1 :(得分:0)
试试这个:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <sys/time.h>
void setArray(double **thearray){
thearray[0][0] = 2.0;
thearray[0][1] = 2.0;
thearray[1][0] = 2.0;
thearray[1][1] = 2.0;
}
void main(){
int i;
double **myarray = (double**) malloc(2 * sizeof(double*));
for(i = 0; i < 2; ++i)
myarray[i] = (double*) malloc(2 * sizeof(double));
setArray(myarray);
}
答案 2 :(得分:0)
首先,您的setarray
应该接受2D数组,而不是poniter。如果知道数组的宽度,可以这样定义:
void setArray(double (*thearray)[2]) //2D array decays into a pointer to an array
然后打电话:
setArray(myarray)
数组仅衰减一次指针,因此2D数组不会衰减为指针指针。 如果宽度不固定,请使用指针指针:
void setArray(double **thearray)
{
...
}
setArray((double **)myarray) //explicitly convert.
答案 3 :(得分:-1)
2D数组有一个双指针(**
)。当您将数组作为参数发送时,您不需要将&符号作为数组添加,而不使用括号是地址。