Página 1 de 1

Pasar Variables y Funciones por Referencia

Enviado: 27 Ago 2012 13:08
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

Pasar Variables y Funciones por Referencia

Enviado: 27 Ago 2012 13:47
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

Pasar Variables y Funciones por Referencia

Enviado: 27 Ago 2012 14:06
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 !

Pasar Variables y Funciones por Referencia

Enviado: 27 Ago 2012 15:11
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

Pasar Variables y Funciones por Referencia

Enviado: 27 Ago 2012 17:28
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

Pasar Variables y Funciones por Referencia

Enviado: 27 Ago 2012 19:36
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

Pasar Variables y Funciones por Referencia

Enviado: 27 Ago 2012 19:39
por Pablo César
Bravo Claudio ! Quedo más tranquilo saber que te pude ayudar en algo.

Un gran abrazo !