Re: Passing floats/doubles to C
- Posted by Todd Riggins <triggins at AIRMAIL.NET> Feb 13, 2000
- 555 views
Robert: In my exotica_api.ew file that defines the dll functions, I have this: SET_MATERIALS=link_c_func2(edx, "SET_MATERIALS",{C_POINTER},C_INT) In my Exotica C code I have this for SET_MATERIALS: DllExport int SET_MATERIALS(LPMATERIAL material) { //D3DMATERIAL7 mtrl; HRESULT hr=0; char txt[255]; FILE_REPORT("LPD3DMATERIAL7 material:"); sprintf(txt,"%f",material->diffuse_r); FILE_REPORT(txt); sprintf(txt,"%f",material->diffuse_g); FILE_REPORT(txt); sprintf(txt,"%f",material->diffuse_b); FILE_REPORT(txt); sprintf(txt,"%f",material->diffuse_a); FILE_REPORT(txt); sprintf(txt,"%f",material->ambient_r); FILE_REPORT(txt); sprintf(txt,"%f",material->ambient_g); FILE_REPORT(txt); sprintf(txt,"%f",material->ambient_b); FILE_REPORT(txt); sprintf(txt,"%f",material->ambient_a); FILE_REPORT(txt); sprintf(txt,"%f",material->specular_r); FILE_REPORT(txt); sprintf(txt,"%f",material->specular_g); FILE_REPORT(txt); sprintf(txt,"%f",material->specular_b); FILE_REPORT(txt); sprintf(txt,"%f",material->specular_a); FILE_REPORT(txt); sprintf(txt,"%f",material->emissive_r); FILE_REPORT(txt); sprintf(txt,"%f",material->emissive_g); FILE_REPORT(txt); sprintf(txt,"%f",material->emissive_b); FILE_REPORT(txt); sprintf(txt,"%f",material->emissive_a); FILE_REPORT(txt); sprintf(txt,"%f",material->power); FILE_REPORT(txt); /* ZeroMemory( &mtrl, sizeof(mtrl) ); mtrl.diffuse.r = material.diffuse.r; mtrl.diffuse.g = material.diffuse.g; mtrl.diffuse.b = material.diffuse.b; mtrl.diffuse.a = material.diffuse.a; mtrl.ambient.r = material.ambient.r; mtrl.ambient.g = material.ambient.g; mtrl.ambient.b = material.ambient.b; mtrl.ambient.a = material.ambient.a; mtrl.specular.r = material.specular.r; mtrl.specular.g = material.specular.g; mtrl.specular.b = material.specular.b; mtrl.specular.a = material.specular.a; mtrl.emissive.r = material.emissive.r; mtrl.emissive.g = material.emissive.g; mtrl.emissive.b = material.emissive.b; mtrl.emissive.a = material.emissive.a; mtrl.power = material.power; g_pd3dDevice->lpVtbl->SetMaterial(g_pd3dDevice, &mtrl ); if(hr!=D3D_OK) { FILE_REPORT(" !!! SET_MATERIALS FAILED !!!"); return 1; } */ return 0; } This for my MATERIAL C coded structure: typedef struct tagMATERIAL { double diffuse_r; double diffuse_g; double diffuse_b; double diffuse_a; double ambient_r; double ambient_g; double ambient_b; double ambient_a; double specular_r; double specular_g; double specular_b; double specular_a; double emissive_r; double emissive_g; double emissive_b; double emissive_a; double power; } MATERIAL; typedef struct tagMATERIAL __RPC_FAR *LPMATERIAL; Now, in Euphoria code, I have this for my material structure: atom material material=allocate(146) . . . poke(material, atom_to_float64(1.0)) poke(material+8, atom_to_float64(1.1)) poke(material+16, atom_to_float64(1.2)) poke(material+24, atom_to_float64(1.3)) poke(material+32, atom_to_float64(1.4)) poke(material+40, atom_to_float64(1.5)) poke(material+48, atom_to_float64(1.6)) poke(material+56, atom_to_float64(1.7)) poke(material+64, atom_to_float64(1.8)) poke(material+72, atom_to_float64(1.9)) poke(material+80, atom_to_float64(1.11)) poke(material+88, atom_to_float64(1.12)) poke(material+96, atom_to_float64(1.13)) poke(material+114, atom_to_float64(1.14)) poke(material+122, atom_to_float64(1.15)) poke(material+130, atom_to_float64(1.16)) poke(material+138, atom_to_float64(1.17)) and then update my c coded structure with my SET_MATERIAL function: funcval=c_func(SET_MATERIALS,{material}) Now, this is what is printed: 1.000000 1.100000 1.200000 1.300000 1.400000 1.500000 1.600000 1.700000 1.800000 1.900000 1.110000 1.120000 1.130000 0.000000 0.000000 -0.000000 when I change the C coded function SET_MATERIAL to this: DllExport int SET_MATERIALS(double *material[17]) { //D3DMATERIAL7 mtrl; HRESULT hr=0; char txt[255]; FILE_REPORT("LPD3DMATERIAL7 material:"); sprintf(txt,"%f",material[0]); FILE_REPORT(txt); sprintf(txt,"%f",material[1]); FILE_REPORT(txt); sprintf(txt,"%f",material[2]); FILE_REPORT(txt); sprintf(txt,"%f",material[3]); FILE_REPORT(txt); sprintf(txt,"%f",material[4]); FILE_REPORT(txt); sprintf(txt,"%f",material[5]); FILE_REPORT(txt); sprintf(txt,"%f",material[6]); FILE_REPORT(txt); sprintf(txt,"%f",material[7]); FILE_REPORT(txt); sprintf(txt,"%f",material[8]); FILE_REPORT(txt); sprintf(txt,"%f",material[9]); FILE_REPORT(txt); sprintf(txt,"%f",material[10]); FILE_REPORT(txt); sprintf(txt,"%f",material[11]); FILE_REPORT(txt); sprintf(txt,"%f",material[12]); FILE_REPORT(txt); sprintf(txt,"%f",material[13]); FILE_REPORT(txt); sprintf(txt,"%f",material[14]); FILE_REPORT(txt); sprintf(txt,"%f",material[15]); FILE_REPORT(txt); sprintf(txt,"%f",material[16]); FILE_REPORT(txt); /* ZeroMemory( &mtrl, sizeof(mtrl) ); mtrl.diffuse.r = material.diffuse.r; mtrl.diffuse.g = material.diffuse.g; mtrl.diffuse.b = material.diffuse.b; mtrl.diffuse.a = material.diffuse.a; mtrl.ambient.r = material.ambient.r; mtrl.ambient.g = material.ambient.g; mtrl.ambient.b = material.ambient.b; mtrl.ambient.a = material.ambient.a; mtrl.specular.r = material.specular.r; mtrl.specular.g = material.specular.g; mtrl.specular.b = material.specular.b; mtrl.specular.a = material.specular.a; mtrl.emissive.r = material.emissive.r; mtrl.emissive.g = material.emissive.g; mtrl.emissive.b = material.emissive.b; mtrl.emissive.a = material.emissive.a; mtrl.power = material.power; g_pd3dDevice->lpVtbl->SetMaterial(g_pd3dDevice, &mtrl ); if(hr!=D3D_OK) { FILE_REPORT(" !!! SET_MATERIALS FAILED !!!"); return 1; } */ return 0; } I get these values printed: 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 and if I change it to: DllExport int SET_MATERIALS(double *material) { //D3DMATERIAL7 mtrl; HRESULT hr=0; char txt[255]; FILE_REPORT("LPD3DMATERIAL7 material:"); sprintf(txt,"%f",material[0]); FILE_REPORT(txt); sprintf(txt,"%f",material[1]); FILE_REPORT(txt); sprintf(txt,"%f",material[2]); FILE_REPORT(txt); sprintf(txt,"%f",material[3]); FILE_REPORT(txt); sprintf(txt,"%f",material[4]); FILE_REPORT(txt); sprintf(txt,"%f",material[5]); FILE_REPORT(txt); sprintf(txt,"%f",material[6]); FILE_REPORT(txt); sprintf(txt,"%f",material[7]); FILE_REPORT(txt); sprintf(txt,"%f",material[8]); FILE_REPORT(txt); sprintf(txt,"%f",material[9]); FILE_REPORT(txt); sprintf(txt,"%f",material[10]); FILE_REPORT(txt); sprintf(txt,"%f",material[11]); FILE_REPORT(txt); sprintf(txt,"%f",material[12]); FILE_REPORT(txt); sprintf(txt,"%f",material[13]); FILE_REPORT(txt); sprintf(txt,"%f",material[14]); FILE_REPORT(txt); sprintf(txt,"%f",material[15]); FILE_REPORT(txt); sprintf(txt,"%f",material[16]); FILE_REPORT(txt); /* ZeroMemory( &mtrl, sizeof(mtrl) ); mtrl.diffuse.r = material.diffuse.r; mtrl.diffuse.g = material.diffuse.g; mtrl.diffuse.b = material.diffuse.b; mtrl.diffuse.a = material.diffuse.a; mtrl.ambient.r = material.ambient.r; mtrl.ambient.g = material.ambient.g; mtrl.ambient.b = material.ambient.b; mtrl.ambient.a = material.ambient.a; mtrl.specular.r = material.specular.r; mtrl.specular.g = material.specular.g; mtrl.specular.b = material.specular.b; mtrl.specular.a = material.specular.a; mtrl.emissive.r = material.emissive.r; mtrl.emissive.g = material.emissive.g; mtrl.emissive.b = material.emissive.b; mtrl.emissive.a = material.emissive.a; mtrl.power = material.power; g_pd3dDevice->lpVtbl->SetMaterial(g_pd3dDevice, &mtrl ); if(hr!=D3D_OK) { FILE_REPORT(" !!! SET_MATERIALS FAILED !!!"); return 1; } */ return 0; } I get the same values as if I used the DllExport int SET_MATERIALS(LPMATERIAL material) way of doing it like the one way above: 1.000000 1.100000 1.200000 1.300000 1.400000 1.500000 1.600000 1.700000 1.800000 1.900000 1.110000 1.120000 1.130000 0.000000 0.000000 -0.000000 I understand the need for using pointers for passing the pointer to the structure for it's data. I use MS Visual Studio 6.0, if that helps anything. -- Todd Riggins