none
Pasar short[] de c# a c++ RRS feed

  • Pregunta

  • Hola, 

    Necesito realizar una llamada a una función desde C# a C++ CLR pasándole un short[]. El problema es que desde C# el tipo short[] es visto como un puntero, y no se como convertirlo

    Si en C++ defino el parámetro de entrada con InPtr, después no sé como convertir short[] a IntPtr y en destino IntPtr a short[]. He probado con Alloc pero no me funciona.

    Alguna idea?

    Gracias.

    viernes, 4 de agosto de 2017 11:24

Respuestas

  • Hola, 

    El problema que tengo es el contrario. Desde C# short[]  es interpretado como short*, con lo qu eya no sería necesario definir la función en C++ como short* values.

    El problema es que no tengo forma de convertir en C# de short[] a short*

    Un saludo,

    martes, 8 de agosto de 2017 8:46

Todas las respuestas

  • Buenas, 

    Podrías ponernos tu código?

    La llamada la haces desde un proyecto en c++ a una libreria compilada en c# o al reves?

    La manera de indicar un puntero en c++ es con *

    void MyMethod(short* myVariable)
    {
        //Estamos pasando un puntero a un array de tipo short
        short val = 1;
        myVariable[0] = &val;
    }



    Atte



    No olvides votar si mi comentario te ha ayudado y marcarlo como respuesta si ha sido la solución!






    viernes, 4 de agosto de 2017 11:37
  • Hola, 

    La llamada la hago desde un proyecto de C# a uno de C++.

    El método de C++ al que tengo que llamar es el siguiente:

    int MedianCalculatorAPI::CalculateMedian(short values[])
    

    No obstante, ese método C#  lo ve como short* en vez de short[] y no se como convertirlo. La alternativa es hacer un "wrapper" de la forma:

    int MedianCalculatorAPI::CalculateMedianArray(array<short>^ valuesArray)
    {
    	short values[] = Convertir de array<short>^
    
    	return CalculateMedian(valuesArray);
    }

    No obstante, no he conseguido realizar dicha conversión.

    La otra alternativa es utilizar IntPtr, de la forma siguiente. La llamada en C#

    public int GetMedian(short[] values)
            {
                MedianCalculatorAPI  calculator = new MedianCalculatorAPI();
                IntPtr ptr = Convertir short[] a intptr.
                return calculator.CalculateMedian(ptr);
                
    
            }

    La parte de C++:

    int MedianCalculatorAPI::CalculateMedianIntPtr(IntPtr valuesArray)
    {
    	short values[] = Convertir de IntPtr a short[]
    
    		return CalculateMedian(valuesArray);
    }

    Lo que no sé como hacer es las conversiones de short[] a IntPtr y viceversa.

    lunes, 7 de agosto de 2017 10:21
  • Buenas, 

    Prueba a declarar así el método de c++:

    int MedianCalculatorAPI::CalculateMedian(const short* values) 

    Con eso vas a hacer que reciba un puntero de "solo lectura",  y al considerarse la matrices como punteros en c++,  puede que te funcione. 

    Atte


    No olvides votar si mi comentario te ha ayudado y marcarlo como respuesta si ha sido la solución!


    lunes, 7 de agosto de 2017 10:57
  • Hola, 

    El problema que tengo es el contrario. Desde C# short[]  es interpretado como short*, con lo qu eya no sería necesario definir la función en C++ como short* values.

    El problema es que no tengo forma de convertir en C# de short[] a short*

    Un saludo,

    martes, 8 de agosto de 2017 8:46