Re: Passing floats/doubles to C

new topic     » goto parent     » topic index » view thread      » older message » newer message

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

new topic     » goto parent     » topic index » view thread      » older message » newer message

Search



Quick Links

User menu

Not signed in.

Misc Menu