我有一个函数(在某些库中),其签名是:
extern LIB3DSAPI void lib3ds_mesh_calculate_face_normals(Lib3dsMesh *mesh, float (*face_normals)[3]);
它在第二个论点中的期望是什么?
我试过了:
float *norm_verts[3];
norm_verts=(float(*)[3])malloc(3*sizeof(float[3])*mesh->nfaces);
lib3ds_mesh_calculate_face_normals(mesh, norm_faces);
在第二行,它显示Expression must be modifiable value
,第三行显示argument of type float** is incompatible with parameter of type float(*)[3]
我的直觉是float* [3]
只有3个指针,但为什么地狱是*
用括号括起来的?
答案 0 :(得分:2)
float (*face_normals)[3] // face_normals is a pointer (to an array of 3 floats)
float *norm_verts[3]; // norm_verts is an array of 3 pointers (to float)
指针不是数组,数组不是指针。 我建议你阅读comp.lang.c FAQ,从第6节开始。
答案 1 :(得分:1)
我的直觉是
float* [3]
只有3个指针
是。
这也不是代码所说的。
该函数要求指向三个浮点数组的指针。括号确保通过将*
“绑定”到名称而不是类型来解析它。
Lib3dsMesh *mesh = getMeshFromSomewhere();
float norm_faces[3] = {};
lib3ds_mesh_calculate_face_normals(mesh, &norm_faces);
以这种方式,函数lib3ds_mesh_calculate_face_normals
知道它正在处理原始的,实际的数组norm_faces
,而不是某些副本而不是某些名称在没有维度信息的情况下衰减到指针。
这是 对数组执行“out”参数的方法,而不必传递float*
和单独的长度参数。
答案 2 :(得分:1)
*
用括号括起来,使其更紧密。读取lib3ds_mesh_calculate_face_normals
的第二个参数“face_normals是一个指向3个浮点数组的指针。
尝试:
float (*norm_verts)[3];
norm_verts=(float(*)[3])malloc(sizeof(*norm_verts)*mesh->nfaces);
lib3ds_mesh_calculate_face_normals(mesh, norm_vets);