1

私は(いくつかのライブラリに)そのシグネチャがこれである関数を持っています:

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

2番目の引数で何を期待しますか?

私はこれを試しました:

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

2行目にはExpression must be modifiable value、3行目にはargument of type float** is incompatible with parameter of type float(*)[3]

私の直感では、それfloat* [3]はたった3つのポインターですが、なぜ地獄は*角かっこで囲まれているのですか?

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.cFAQを読むことをお勧めします。

于 2012-10-26T14:37:57.140 に答える
1

私の直感はそれfloat* [3]がたった3つのポインターであるということでした

です。

それはまた、コードが言っていることでもありません。

この関数は、3つのfloatの配列へのポインターを要求しています。*括弧は、タイプではなく名前に「バインド」することにより、そのように解析されることを確認します。

Lib3dsMesh *mesh    = getMeshFromSomewhere();
float norm_faces[3] = {};

lib3ds_mesh_calculate_face_normals(mesh, &norm_faces);

このようにして、関数lib3ds_mesh_calculate_face_normalsは、元の実際の配列を処理していることを認識しており、norm_facesディメンション情報なしでポインターに減衰したコピーや名前は処理していません。

これは、別の長さの引数を渡すことなく、配列を使用して「out」引数を実行する方法です。float*

于 2012-10-26T14:36:49.183 に答える
1

*ブラケットで包まれており、しっかりと固定されています。2番目の引数lib3ds_mesh_calculate_face_normalsは「face_normalsは3つのfloatの配列へのポインタです」と読み取られます。

試す:

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 に答える