警告:return从具有不兼容 return 类型“float *”的函数中调用“float (*)[3]”
warning: returning ‘float (*)[3]’ from a function with incompatible return type ‘float *’
当我尝试 return 函数中的数组时出现错误 'warning: returning ‘float (*)[3]’ from a function with incompatible return type ‘float *’'。我读过 C 在 returning 数组方面存在问题,但并不真正理解为什么以及如何修复它。这是我的代码:
float * buildlocs(int L, int W, int H){
int c = 0, xmin, xmax, x, ymin, ymax, y, h;
unsigned int nX, nY;
L = L/4;
W = W/4;
float cellarray[16][3];
for(nX = 0; nX < 4;nX++) {
for(nY = 0; nY < 4;nY++) {
xmin = 0+L*(nX-1);
xmax = L*nX;
x = xmin+rand()*(xmax-xmin);
ymin = 0+W*(nY-1);
ymax = W*nY;
y = ymin+rand()*(ymax-ymin);
h = rand()*H;
for(int i = 0; i < 3; i++){
if(i == 0){
cellarray[c][i] = x;
}
if(i == 1){
cellarray[c][i] = y;
}
if(i == 2){
cellarray[c][i] = h;
}
}
c = c + 1;
}
}
return cellarray;
}
目标是拥有一个包含 16 个条目的二维数组,其中包含 3 个变量。有人可以帮我解决这个错误吗?
有两个问题:
首先,float[16][3]
是 而不是 float*
。
其次,float cellArray[16][3]
在函数的末尾不再存在——它是一个只存在于该函数中的局部变量。当您 return 数组的地址时,指针将指向不存在的东西 - 所谓的 悬挂指针 .
要解决这个问题,您需要动态分配数组和 return 指向动态分配数组的指针,就像这样(完成 [=16 后不要忘记 free
=]):
float* cellArray = malloc(sizeof(float)*16*3); // this is one contiguous block of floats, you have to figure out how you want to index into this block, since it's stricly speaking not a two dimensional array.
//...//
return cellArray;
或者,我觉得更优雅的是,将指针传递给一个已经存在的数组:
void buildlocs(float* outLocs, int L, int W, int H); // added parameter to take a float*
//in your function that calls buildlocs:
float[16][3] cellArray;
buildlocs(&cellArray[0],L,W,H); // pass allocated array into function, again, this is a pointer, not a two-dimensional array
当我尝试 return 函数中的数组时出现错误 'warning: returning ‘float (*)[3]’ from a function with incompatible return type ‘float *’'。我读过 C 在 returning 数组方面存在问题,但并不真正理解为什么以及如何修复它。这是我的代码:
float * buildlocs(int L, int W, int H){
int c = 0, xmin, xmax, x, ymin, ymax, y, h;
unsigned int nX, nY;
L = L/4;
W = W/4;
float cellarray[16][3];
for(nX = 0; nX < 4;nX++) {
for(nY = 0; nY < 4;nY++) {
xmin = 0+L*(nX-1);
xmax = L*nX;
x = xmin+rand()*(xmax-xmin);
ymin = 0+W*(nY-1);
ymax = W*nY;
y = ymin+rand()*(ymax-ymin);
h = rand()*H;
for(int i = 0; i < 3; i++){
if(i == 0){
cellarray[c][i] = x;
}
if(i == 1){
cellarray[c][i] = y;
}
if(i == 2){
cellarray[c][i] = h;
}
}
c = c + 1;
}
}
return cellarray;
}
目标是拥有一个包含 16 个条目的二维数组,其中包含 3 个变量。有人可以帮我解决这个错误吗?
有两个问题:
首先,float[16][3]
是 而不是 float*
。
其次,float cellArray[16][3]
在函数的末尾不再存在——它是一个只存在于该函数中的局部变量。当您 return 数组的地址时,指针将指向不存在的东西 - 所谓的 悬挂指针 .
要解决这个问题,您需要动态分配数组和 return 指向动态分配数组的指针,就像这样(完成 [=16 后不要忘记 free
=]):
float* cellArray = malloc(sizeof(float)*16*3); // this is one contiguous block of floats, you have to figure out how you want to index into this block, since it's stricly speaking not a two dimensional array.
//...//
return cellArray;
或者,我觉得更优雅的是,将指针传递给一个已经存在的数组:
void buildlocs(float* outLocs, int L, int W, int H); // added parameter to take a float*
//in your function that calls buildlocs:
float[16][3] cellArray;
buildlocs(&cellArray[0],L,W,H); // pass allocated array into function, again, this is a pointer, not a two-dimensional array