1

I have a function(in some library) whose signature is this:

extern LIB3DSAPI void lib3ds_mesh_calculate_face_normals(Lib3dsMesh *mesh, float (*face_normals)[3]);

what does it expect in second argument?

I tried this:

        float   *norm_verts[3];
        norm_verts=(float(*)[3])malloc(3*sizeof(float[3])*mesh->nfaces);
        lib3ds_mesh_calculate_face_normals(mesh, norm_faces);

on the second line, it says Expression must be modifiable value and the third line says argument of type float** is incompatible with parameter of type float(*)[3]

My intuition was that float* [3] is just 3 pointers but why the hell is the * wrapped in brackets?

4

3 回答 3

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)

指针不是数组,数组不是指针。我建议您从第 6 节开始阅读comp.lang.c 常见问题解答。

于 2012-10-26T14:37:57.140 回答
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);
于 2012-10-26T14:37:36.150 回答
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,而不是某些副本,也不是某个名称衰减到没有维度信息的指针。

这是使用数组“输出”参数方法,而无需传递float*一个单独的长度参数。

于 2012-10-26T14:36:49.183 回答