[Jde-dev] uso de arrays en interfaces ICE

David Lobato dav.lobato en gmail.com
Lun Mayo 3 09:34:50 CEST 2010


Hola,

En C++ *s**equence<int> se transforma en vector<int> por lo que debemos
seguir las reglas de uso de los vectores stl de c++, es decir, o bien
añadimos elementos con push_back o bien ajustamos el tamaño con resize (tras
la inicialización están vacíos).*

Para la asignación de posiciones consecutivas la STL no tiene ningún
mecanismo, pero dado que la representación en memoria es idéntica a los
arrays de C, podemos usar el memmove (memcpy) para copiar valores. Siempre
teniendo cuidado de asignar los mismos tipos de datos o compatibles. De ahí
el memmove/memcpy que veías en mi código, que no es mas que una copia rápida
de datos en el vector (en vez de iterar sobre sus elementos).

Espero haber aclarado la duda,
David.


**
2010/5/2 Javier Vazquez <javiervazper en yahoo.es>

> Hola de nuevo.
>
> Pues justo ahora lo saco. Dejando el atributuencia de enteros, faltaba
> llamar al método "resize", antes de empezar a asignar valores:
>
>        laserData->distanceData.resize(sizeof(int)*NUM_LASER);
>
>       laserData->distanceData[0]=0;
> ....
>
> Así ya funciona!!
>
> Un saludo,
> Javier.
>
>
>
> ------------------------------
> *De:* Javier Vazquez <javiervazper en yahoo.es>
> *Para:* jde-developers <Jde-developers en gsyc.es>
> *Enviado:* dom,2 mayo, 2010 00:50
> *Asunto:* uso de arrays en interfaces ICE
>
> Hola,
>
> tengo una duda con la que me he atascado desde hace varios días y no se
> cómo continuar. Necesito definir una interfaz con una operación de devuelva
> un array de un número de posiciones constantes.
>
> Inicialmente pensé en declarar una clase, con un atributo aaray para que la
> operación devuelva dicho objeto. La declaración siguiente, parece no estar
> soportada por el traductor de ICE:
>
> module jderobot{
>
>     /* laser information */
>   class LaserData
>   {
>     int distanceData[10];
>   };
>
>
>   /**
>    * Interface to the Gazebo laser sensor.
>    */
>   interface Laser
>   {
>      idempotent     LaserData getLaserData();
>   };
>
> }; //module
>
> A continuación, fijándome en código hecho de JDE5.0, he visto que se
> utiliza " sequence<int> IntSeq;" para el tipo del atributo que devuelve un
> array (por ejemplo, la imagen. Redefiní mi atributo distanceData de esta
> forma, esto es: " IntSeq distanceData;" y obtengo el código cpp.
>
> Sin embargo, ahora no soy capaz de usarlo. He probado a asignar valores de
> varias formas pero siempre me da un "Segmentation Fault" en tiempo de
> ejecución (por que compilar, compila bien). Este es uno de los muchas
> pruebas básicas que he realizado pero nada:
>
> ....
>                int a[2];
>                 a[0]=0;
>                 a[1]=1;
>
>                 memcpy(&(laserData->distanceData),a,sizeof(a));
>                 printf("data 0: %d\ndata 1:
> %d\n%d\n%d\n",laserData->distanceData[0],a[1],sizeof(a),sizeof(&(laserData->distanceData)));
>
> ...
>
> ¿Alguien tiene alguna idea?
>
> Veo que David usa una clase "pipeline" para instanciar un buffer y luego lo
> copia con memcpy. No obstante, yo siempre quiero trabajar con un array de
> 180 posiciones.
>
> Gracias de antemano,
> Javier.
>
>
>
> _______________________________________________
> Jde-developers mailing list
> Jde-developers en gsyc.es
> http://gsyc.escet.urjc.es/cgi-bin/mailman/listinfo/jde-developers
>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://gsyc.escet.urjc.es/pipermail/jde-developers/attachments/20100503/9b2b85dc/attachment.htm 


More information about the Jde-developers mailing list