Author | Topic: Como se guarda un parmetro FLOAT en un puntero? | |
---|---|---|
Ernesto Avedillo | Como se guarda un parmetro FLOAT en un puntero? on Mon, 24 Nov 2008 18:49:52 +0100 Hola a todos, Estoy utilizando las librerias de Pablo Botella para comunicarme con una libreria C++ Tengo la siguiente estructura: BEGIN STRUCTURE PT_AIVoltageIn MEMBER WORD chan MEMBER WORD gain MEMBER WORD TrigMode MEMBER WORD wdummy MEMBER POINTER32 voltage END STRUCTURE que proviene de la siguiente de C++ typedef struct tagPT_AIVoltageIn { USHORT chan; USHORT gain; USHORT TrigMode; FLOAT *voltage; } PT_AIVoltageIn, * LPT_AIVoltageIn; Al ser "voltage" un puntero de una variable FLOAT, no se cmo guardar en l un valor FLOAT ni cmo recogerlo. Que funcin es la correcta y la mas rpida?GraciasErnesto | |
Hector Pezoa Gonzalez | Re: Como se guarda un parmetro FLOAT en un puntero? on Mon, 24 Nov 2008 16:42:01 -0300 Ernesto Debiera funcionarte con la instruccion que le estas dando MEMBER POINTER32 voltage Mira si te funciona con eso Declare Function DRV_AIVoltageInExp Lib "adsapi32.dll" (ByVal DriverHandle As Long, AIVoltageInExp As PT_AIVoltageInExp) As Long Con la libreria de Pablo --------- DLL adsapi32 IMPORT DRV_AIVoltageInExp AS Long ; PARAM cDriver AS Long ,; PARAM lpVoltager AS POINTER32 Hector "Ernesto Avedillo" <eavedillo@iacsl.e.telefonica.net> escribi en el mensaje news:2bd6340e$261cbae6$722@news.alaska-software.com... > Hola a todos, > Estoy utilizando las librerias de Pablo Botella para comunicarme con una > libreria C++ > Tengo la siguiente estructura: > > BEGIN STRUCTURE PT_AIVoltageIn > MEMBER WORD chan > MEMBER WORD gain > MEMBER WORD TrigMode > MEMBER WORD wdummy > MEMBER POINTER32 voltage > END STRUCTURE > > que proviene de la siguiente de C++ > typedef struct tagPT_AIVoltageIn > { > USHORT chan; > USHORT gain; > USHORT TrigMode; > FLOAT *voltage; > } PT_AIVoltageIn, * LPT_AIVoltageIn; > Al ser "voltage" un puntero de una variable FLOAT, no se cmo guardar en > l un valor FLOAT ni cmo recogerlo. Que funcin es la correcta y la mas > rpida?GraciasErnesto > | |
Pablo Botella | Re: Como se guarda un parámetro FLOAT en un puntero? on Mon, 24 Nov 2008 21:18:18 +0100 Hola Ilustrísimo Señor Don Hector, > DLL adsapi32 IMPORT DRV_AIVoltageInExp AS Long ; > PARAM cDriver AS Long ,; > PARAM lpVoltager AS POINTER32 Ernesto ya está hecho todo un maestro usando DLL IMPORT, el problema es que en su día me olvidé de meterle PeekFloat/PeekUnfloat al ot4xb y como nunca me ha hecho falta pues no me acordé más y ahi se quedaron sin hacer, pero ahi le puse una chapucilla en el otro mensaje para que se pueda apañar mientras tanto. Un abrazo, Pablo | |
Pablo Botella | Re: Como se guarda un parámetro FLOAT en un puntero? on Mon, 24 Nov 2008 20:49:51 +0100 Hola, > BEGIN STRUCTURE PT_AIVoltageIn > MEMBER WORD chan > MEMBER WORD gain > MEMBER WORD TrigMode > MEMBER WORD wdummy > MEMBER POINTER32 voltage > END STRUCTURE Pues mas o menos igual que hacias con el USHORT en el otro ejemplo creamos nuestro objeto para la estructura local oSt := PT_AIVoltageIn():New() local nVoltage oSt:chan := nChannel oSt:... asignamos los otros miembros asignamos un puntero de 4 bytes para recoger nuestro FLOAT oSt:voltage := _xgrab(4) llamamos a la funcion en la dll @nombredeladll:Funcion( parametros , oSt ) recogemos el valor del float nVoltage := PeekFloat( oSt:voltage ) liberamos el buffer cuando no lo necesitemos _xfree( oSt:voltage ) ........... ¡¡oh , mi&&da !!!!! ot4xb no trae la funcion PeekFloat() bueno no es para cortarse las venas hay solución ... .... en el proximo build de ot4xb metere PokeFloat/PeekFloat .... y de momento podemos usar esta chapucilla ... nVoltage := UnPackFloat32(PeekDWord(oSt:voltage)) o lo que es lo mismo para escribir empaquetamos con PackFloat32() y lo escribimos con PokeDWord() como si fuera un int32 y para leer pues justo al reves leemos con PeekDWord() y desempaquetamos con UnpackFloat32() Saludos, Pablo Botella | |
Ernesto Avedillo | Re: Como se guarda un parmetro FLOAT en un puntero? on Mon, 24 Nov 2008 21:55:43 +0100 Gracias a los dos Hector, veo que tabien trabajas las tarjetas de Advantech? Pablo, gracias por tu ayuda, habia visto en tu pgina la instruccin PackFloat32/UnPackFloat32 pero para variar estaba haciendo algo mal. Gracias Ernesto "Pablo Botella" <pb_no_spam_@_remove_all_betwen_underscores_xbwin.com> escribi en el mensaje news:154b86db$4c3ea1fd$624@news.alaska-software.com... Hola, > BEGIN STRUCTURE PT_AIVoltageIn > MEMBER WORD chan > MEMBER WORD gain > MEMBER WORD TrigMode > MEMBER WORD wdummy > MEMBER POINTER32 voltage > END STRUCTURE Pues mas o menos igual que hacias con el USHORT en el otro ejemplo creamos nuestro objeto para la estructura local oSt := PT_AIVoltageIn():New() local nVoltage oSt:chan := nChannel oSt:... asignamos los otros miembros asignamos un puntero de 4 bytes para recoger nuestro FLOAT oSt:voltage := _xgrab(4) llamamos a la funcion en la dll @nombredeladll:Funcion( parametros , oSt ) recogemos el valor del float nVoltage := PeekFloat( oSt:voltage ) liberamos el buffer cuando no lo necesitemos _xfree( oSt:voltage ) ........... oh , mi&&da !!!!! ot4xb no trae la funcion PeekFloat() bueno no es para cortarse las venas hay solucin ... .... en el proximo build de ot4xb metere PokeFloat/PeekFloat .... y de momento podemos usar esta chapucilla ... nVoltage := UnPackFloat32(PeekDWord(oSt:voltage)) o lo que es lo mismo para escribir empaquetamos con PackFloat32() y lo escribimos con PokeDWord() como si fuera un int32 y para leer pues justo al reves leemos con PeekDWord() y desempaquetamos con UnpackFloat32() Saludos, Pablo Botella |