Alaska Software Inc. - Como se guarda un parmetro FLOAT en un puntero?
Username: Password:
AuthorTopic: Como se guarda un parmetro FLOAT en un puntero?
Ernesto AvedilloComo 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 GonzalezRe: 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 BotellaRe: 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 BotellaRe: 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 AvedilloRe: 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