Pasar Variables y Funciones por Referencia

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

Moderador: Moderadores

Claudio Soto
Colaborador
Colaborador
Mensagens: 566
Registrado em: 27 Ago 2012 12:31
Localização: Uruguay
Contato:

Pasar Variables y Funciones por Referencia

Mensagem por Claudio Soto »

Hola a todos.
Perdón por mi ignorancia, alguien me puede decir como se pasa desde Harbour a C una variable y una función por referencia.
Les dejo aquí un ejemplo "bruto" que no funciona para hacerme entender mejor.
Desde ya muchas gracias.
Saludos desde Uruguay,
Claudio Soto

Código: Selecionar todos

Fuction Main

aa := 0
REF_VAR (@aa)
PUNTERO_FUNC (@Ejemplo, 10, 20)

Return

Function Ejemplo (x,y)
Local Suma
Suma := x + y
Return Suma


#pragma BEGINDUMP

#include <windows.h>
#include "hbapi.h"

HB_FUNC (REF_VAR)
{  int *pNum;
   pNum = (int*) hb_parptr (1); // retrieve a parameter as a pointer 
   if (pNum)
        *pNum = 33;
}   

HB_FUNC (PUNTERO_FUNC)
{  void **pFunc;
   int total;
   pFunc = (void**) hb_parptr (1); // retrieve a parameter as a pointer 
   if (pFunc) 
       total = *pFunc (hb_parni(2),hb_parni(3));
}   

   
#pragma ENDDUMP
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
sambomb
Usuário Nível 3
Usuário Nível 3
Mensagens: 250
Registrado em: 24 Out 2008 17:02
Localização: Itaocara - RJ - Brasil

Pasar Variables y Funciones por Referencia

Mensagem por sambomb »

Código: Selecionar todos

Procedure Main()
Local nVar1, nVar2, nVar3

   nVar1 := 1
   nVar2 := 10
   nVar3 := 100

   ?TesteReferencia( @nVar1, @nVar2, nVar3 ) // 40

   ? nVar1 // 9 - Passado por referência, é alterado
   ? nVar2 // 20 - Passado por referência, é alterado
   ? nVar3 // 100 - Não foi passado por referência, não foi alterado

Return nil

Function TesteReferencia( n1, n2, n3 )

   ?n1 // 1
   ?n2 // 10
   ?n3 // 100
   n3 := n1 + n2
   ?n3 // 11
   n1 := n2 - n1
   ?n1 // 9
   n2 := (n3 - n1) * n2 
   ?n2 // 20
 
Return (n1+n2+n3) // 40
Imagem

Rca Sistemas - Itaocara - RJ
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Pasar Variables y Funciones por Referencia

Mensagem por Pablo César »

Hola Claudio ! Sea muy bien venido a nuestro forum !

Samir (sambomb), o colega está pedindo para saber como faz para passar uma variavel por referência, mas de Harbour para código em C.

Claudio, yo creo que es utilizado en el código C: hb_storc, hb_stornd y hb_stornl y que normalmente usaríamos en lugar de hb_parc()/hb_parcx()/hb_itemGetCPtr() segun el tipo de dato que contiene la viariable. No obstante, no tengo seguridad si es por referencia, creo que se debe buscar como puntero en que está locado en la memoria. Ahora, no sé como es hecho con Harbour.

No se explicarte, pero aqui tienes un ejemplo: C:\MiniGUI\SAMPLES\Advanced\FileMan\FileMan.prg fiajte en la linea 1537 donde cVolume está pasando por referencia: GetVolumeInformation( cDrv + ":\", @cVolume )

En el código C parece que está recibiendolo com asteritico "*" para determinar que es un pointer. Otra funcion que es aliada para saber si el parametro fué pasado por referencia es ISBYREF

Disculpame mi falta de precision, espero que algun otro colega, consiga explicar-nos mejor !
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Claudio Soto
Colaborador
Colaborador
Mensagens: 566
Registrado em: 27 Ago 2012 12:31
Localização: Uruguay
Contato:

Pasar Variables y Funciones por Referencia

Mensagem por Claudio Soto »

Gracias Pablo César por la bien venida y por la respuesta.
Es una alegría haber encontrado este foro porque estoy seguro que tengo mucho que aprender con ustedes.
Saludos cordiales,
Claudio
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
Adalberto
Usuário Nível 3
Usuário Nível 3
Mensagens: 343
Registrado em: 01 Set 2007 01:09
Localização: Santa Cruz de la Sierra - Bolivia

Pasar Variables y Funciones por Referencia

Mensagem por Adalberto »

Hola Claudio, tambien deseo darte la bienvenida a este foro.
Seguro que tengo mucho que aprender con ustedes.
Esto es verdad, aqui hay mucho para aprender y muchos que con generosidad brindan su ayuda; sin embargo creo que nosotros hemos sido bendecidos al tenerte en este foro, he visto tus exlentes trabajos, como el que nos bridaste en:

C:\MINIGUI\SAMPLES\ADVANCED\VIEW_IMAGE\BITMAP.PRG

Gracias Claudio.

Con referencia al tema de tu interes, confío en que el gran maestro "maligno"- moderador de este foro y que sabe muchisimo de lenguaje C, podrá ser parte de la solucion que buscas.

[] Adalberto
Claudio Soto
Colaborador
Colaborador
Mensagens: 566
Registrado em: 27 Ago 2012 12:31
Localização: Uruguay
Contato:

Pasar Variables y Funciones por Referencia

Mensagem por Claudio Soto »

Gracias Adalberto por tus palabras.
yo creo que es utilizado en el código C: hb_storc, hb_stornd y hb_stornl
Pablo César tenias razón, aquí dejo el código de como pasar por referencia una variable de Harbour a una función en C, cuando descubra como pasar por referencia una función posteo el código.

Código: Selecionar todos

Function Main
Private aa:= 10
total := REF_VAR (10, @aa)
?? aa, total
Return


#pragma BEGINDUMP

#include "hbapi.h"

HB_FUNC (REF_VAR)
{  int Num1=0, Num2=0, suma=0;

   Num1 = hb_parni (1);
   Num2 = hb_parni (2);

   suma = Num1 + Num2;   

// hb_storXXX (Valor, Indice)  asigna Valor a la variable pasada por referencia en el parámetro indicado por indice.

  if (HB_ISBYREF (2))  // cheque que sea una referencia para asegurarme que el usuario no paso como parámetro una constante. 
       hb_storni(suma, 2);  /* stores an integer on a variable by reference */   

hb_retni (suma); 
}   

#pragma ENDDUMP
Saludos cordiales,
Claudio
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Pasar Variables y Funciones por Referencia

Mensagem por Pablo César »

Bravo Claudio ! Quedo más tranquilo saber que te pude ayudar en algo.

Un gran abrazo !
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Responder