Me gustaría pasar un float [] a un método de C. La firma C parece:¿Pasar un flotador [] como ref flotar al código no administrado es una buena idea?
EXTERN int process_raw(float *inBuffer, float *outBuffer);
en C# la firma es:
public static extern int process_raw(ref float inBuffer, ref float outBuffer);
va a ser problemático para pasar matrices con una referencia al primer elemento:
process_raw(ref someArray[0], ref anotherArray[0])
gracias!
EDITAR: Por supuesto, es importante saber qué hace el código C con los flotadores: los tratará como matrices y leerá valores de inBuffer y escribirá valores en outBuffer. Como se analiza a continuación, la pregunta es si toda la memoria se fijará durante la llamada PInvoke.
EDIT 2: Otro comentario. Elegí el flotador ref a propósito, porque yo también quería hacer cosas como:
fixed(byte* outBuff = buffer)
{
Process(ticks, ref aFloat, ref ((float*)outBuff)[0]);
}
En este caso no debería ser un problema, porque el puntero se fija de todos modos, pero la pregunta para la gama normal se mantiene por encima.
Tenga en cuenta que debe considerar el rediseño de API para incluir tamaños de búferes de "entrada" y "salida". Especialmente si existe la posibilidad de que el tamaño del buffer "out" tenga una longitud diferente a la del buffer "in". También facilitará la clasificación. –
en este caso es claro, el método toma por definición 64 muestras. pero hay otros métodos como este que tienen un argumento de tamaño, pero los omite por simplicidad. mi única preocupación es el GC y si la memoria se fijará. el código C leerá 64 valores de inBuffer y escribirá 64 valores en outBuffer. – thalm