Página 1 de 1

Endereço de memória de um Array...

Enviado: 15 Jul 2009 14:58
por ademilson
Boa tarde pessoal...

Alguém sabe como faço para acessar um endereço de memória (ponteiro) de um array?

Obrigado.

Re: Endereço de memória de um Array...

Enviado: 15 Jul 2009 16:04
por vailton
EU não tive tempo de testar, mas lendo dos sources deduzo que seja algo como o abaixo:

Código: Selecionar todos

#include "hbapi.h"
HB_FUNC( ARR2PTR )
{
   PHB_ITEM pArray = hb_param( 1, HB_IT_ARRAY );

   if( pArray )
   {
      hb_retptr( ( void * ) pArray->item.asArray.value );
   }
}
Use deste modo:

Código: Selecionar todos

? ARR2PTR( <Array> )

Re: Endereço de memória de um Array...

Enviado: 15 Jul 2009 17:45
por ademilson
Vailton, testei aqui o seu cógifo e a DLL me retonra um erro.
Na verdade tenho aqui uma função de uma dll declarada em VB, se possível vc poderia me dizer como fazer para declarar e usar esta função em xharbour:

Tenho esta declaração em VB:

Public Declare Function radio_recv5 Lib "RioCom" (ByRef Funcao As Long, ByRef terminal As Long, ByRef Licenca As Long, ByRef Msg As Long, ByRef Pratos As Long, ByRef Mesa1 As Long, ByRef Mesa2 As Long, ByRef AuxData As Long, ByRef Lugar1 As Long, ByRef Lugar2 As Long, ByVal addr_plus As Long, ByVal addr_qtds As Long, ByVal st_mesa1 As String, ByVal st_mesa2 As String) As Long

Declarei para xHarbour+FW:

DLL FUNCTION radio_recv5( Funcao AS LONG,;
terminal AS LONG,;
Licenca AS LONG,;
Msg AS LONG,;
Pratos AS LONG,;
Mesa1 AS LONG,;
Mesa2 AS LONG,;
AuxData AS LONG,;
Lugar1 AS LONG,;
Lugar2 AS LONG,;
addr_plus AS LONG,;
addr_qtds AS LONG,;
st_mesa1 AS STRING,;
st_mesa2 AS STRING) AS LONG PASCAL LIB "riocom.dll"

No exemplo em VB de utilização desta função esta assim:

Dim p_plus(100) As Long
Dim p_qtds(100) As Long

addr_plus = VarPtr(p_plus(0))
addr_qtds = VarPtr(p_qtds(0))
radio_recv5(p_funcao, p_terminal, p_licenca, p_msg, p_pratos, p_mesa1, p_mesa2, p_auxdata, p_lugar1, p_lugar2, addr_plus, addr_qtds, st_mesa1, st_mesa2)

Minha dúvida esta na variaveis:
addr_plus
addr_qtds

Como fazer isto ?

Segue o que diz o manual:

Função :
int stdcall radio_recv3(int *Funcao,int *Terminal, int *Licenca,int *MsgNumber,int *Pratos,int *Mesa1,int *Mesa2, int *AuxData,int *lugar1,int *lugar2,int *plus,int *qtds)

Esta função é equivalente a radio_recv (descrita abaixo) , mas é mais fácil de utilizar.

int *plus é um apontador para um array de inteiros de 32 bits.
int *qtds é um apontador para um array de inteiros de 32 bits.

VB
Public Declare Function radio_recv Lib "RioCom" (ByVal Msg As String) As Long

Re: Endereço de memória de um Array...

Enviado: 16 Jul 2009 13:03
por vailton
Eu já vi um código semelhante que o Antonio me mostrou outro dia... Mas sinto não poder ajudar, visto que não utilizo estas funçoes. Talvez mais alguem do forum possa dar uma dica neste caso.