[erlang-questions] Accessing A Binary as an Array of Floats/Doubles Within a NIF

Sverker Eriksson sverker.eriksson@REDACTED
Mon Jun 20 21:50:58 CEST 2016

If you use <<1.0/float-native>>
then it's just type cast to a 'double' pointer:

double* my_array;

my_array = (double*) Bin.data;

printf("%lf", my_array[0]);

Default byte order is 'float-big', which will not work on little endian 
machines (x86).

Depending on architecture you also might have to ensure 8 byte alignment.
x86 will accept unaligned floats but the performance may suffer.

/Sverker, Erlang/OTP

On 06/20/2016 09:04 PM, John Duffy wrote:
> Hi
> I'm using FreeBSD 10.3 & Erlang 18.3 and I'm trying to get to grips with passing a binary of floats to a NIF for further processing as as array of C doubles.
> My simple NIF module compiles and I can access my "my_nif_1" function from the erlang shell. I can access the 'size' structure member but I can't figure out how to access the 'data' structure member as a C array. I understand that 'data' is a block of memory of UINT bytes but I can't figure out how to "cast" this to a C array within the NIF.
> Any help would be mud appreciated.
> Kind regards
> John
> #include "erl_nif.h"
> static ERL_NIF_TERM my_nif_1(ErlNifEnv * env, int argc, const ERL_NIF_TERM argv[])
> {
>      ErlNifBinary Bin;
>      if (!enif_inspect_binary(env, argv[0], &Bin)) {
>          return enif_make_badarg(env);
>      }
>      // So far, so good...
>      // From the erl shell...
>      // my_nifs:my_nif_1(<<1.0/float>>). returns a Bin.size of 8
>      // my_nifs:my_nif_1(<<1.0/float,2.0/float>>. returns a Bin.size of 16
>      //
>      // How do I access Bin.data as an array of doubles?
>      //
>      return enif_make_int(env, Bin.size); // For testing... this works.
> }
> static ErlNifFunc nif_funcs[] = {
>      {"my_nif_1", 1, my_nif_1}
> };
> ERL_NIF_INIT(my_nifs, nif_funcs, NULL, NULL, NULL, NULL);
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20160620/f2c9a11b/attachment.htm>

More information about the erlang-questions mailing list