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

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
ademilson
Usuário Nível 2
Usuário Nível 2
Mensagens: 87
Registrado em: 07 Ago 2007 10:01
Localização: Maringá
Contato:

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

Mensagem por ademilson »

Boa tarde pessoal...

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

Obrigado.
_____________________
José Ademilson da Cruz
Gerente de Desenvolvimento Harbour
SG Sistemas de Automação ltda.
Avatar do usuário
vailton
Colaborador
Colaborador
Mensagens: 390
Registrado em: 17 Nov 2005 19:08
Localização: Brasil
Contato:

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

Mensagem 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> )
Vailton Renato
"No dia mais claro, na noite mais escura... o bug sucumbirá ante a minha presença"

E-mail/MSN: contato@vailton.com.br
Skype: vailtom
Avatar do usuário
ademilson
Usuário Nível 2
Usuário Nível 2
Mensagens: 87
Registrado em: 07 Ago 2007 10:01
Localização: Maringá
Contato:

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

Mensagem 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
_____________________
José Ademilson da Cruz
Gerente de Desenvolvimento Harbour
SG Sistemas de Automação ltda.
Avatar do usuário
vailton
Colaborador
Colaborador
Mensagens: 390
Registrado em: 17 Nov 2005 19:08
Localização: Brasil
Contato:

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

Mensagem 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.
Vailton Renato
"No dia mais claro, na noite mais escura... o bug sucumbirá ante a minha presença"

E-mail/MSN: contato@vailton.com.br
Skype: vailtom
Responder