Page 1 of 2

Ayuda en programa

Posted: Fri May 13, 2016 6:00 am
by colthop
Hola a todos:

Hoy os pido, ayuda sobre todo a los master, por un motivo no relacionado con FiveWin sino con C++:

Estoy haciendo un programa en el cual quiero hacer una cosa que en FiveWin lo hace muy sencillo y en C++ no se como se hace y si es posible hacerlo.

Me explico:

Yo con FiveWin hago

a = "función()"
&a

y lo que resulta es que ejecuta "función()". Esto no se como se hace y si es posible hacerlo en C++, es una cosa parecida a lo que hace el GET cuando ponemos la clausula VALID con una función, que ejecuta esa función.

Un saludo y gracias.

Carlos

Re: Ayuda en programa

Posted: Fri May 13, 2016 7:01 am
by Carlos Mora
Hola Carlos,

hasta donde sé, eso no es posible. C++ es un lenguaje compilado, puro, donde los simbolos y variable se reemplazan por su dirección en tiempo de compilación.
De la misma forma que no existen PUBLICs ni PRIVATEs, me temo que eso no sería viable.
Desconozco que problema quieres resolver con una macro, tal vez puedas usar metodos virtuales si estas haciendo POO.

Un saludo

Re: Ayuda en programa

Posted: Fri May 13, 2016 7:51 am
by Antonio Linares
El nombre de una función en C es su puntero. Es decir si tenemos la función Test(), Test es la dirección de Test()
y por lo tanto se puede "saltar" a ella y ejecutarla, dada su puntero.

En realidad la diferencia entre C++ y C, es un array "invisible" (lpVtbl) que C++ construye de punteros a funciones
(que se convierten en métodos al recibir automaticamente Self como primer parámetro).

Clipper 5 heredó mucho esta filosofía de C++, y en los RDDs, en los GT, etc. usó esta técnica de arrays de punteros
a funciones. Es la forma en que se puede simular el C++ usando solo C. Harbour lo usa igualmente.

Re: Ayuda en programa

Posted: Fri May 13, 2016 8:35 am
by colthop
Hola a todos:

Gracias por vuestras respuestas.

Antonio no se si me estas diciendo que se puede o que no se puede.

Si Harbour y Clipper se realizaron C tendrán una manera de realizar la operativa y si es así podrías orientarme con algún ejemplo.

Un saludo

Carlos

Re: Ayuda en programa

Posted: Fri May 13, 2016 9:11 am
by Antonio Linares
Carlos,

Claro que se puede. Aqui tienes un ejemplo:

Code: Select all

#include "FiveWin.ch"

function Main()

   Test()

return nil

#pragma BEGINDUMP

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

static void Test( void )
{
   MessageBox( 0, "dentro de Test()", "ok", 0 );
}

typedef void ( * PFUNC ) ( void );

HB_FUNC( TEST )
{
   PFUNC pFunction = Test;

   pFunction();
}

#pragma ENDDUMP  

Re: Ayuda en programa

Posted: Fri May 13, 2016 5:40 pm
by carlos vargas
Son babosadas, el que sabe, sabe.
:-)
estas son las explicaciones que vale siempre tener a mano, a guardar post.

gracias antonio.

salu2
carlos vargas

Re: Ayuda en programa

Posted: Fri May 13, 2016 7:40 pm
by sysctrl2
Maestro !

Re: Ayuda en programa

Posted: Mon May 23, 2016 7:34 am
by colthop
Hola Antonio:

Ante todo disculpa por la tardanza pero la semana pasada no pude hacer nada sobre este tema:

Y gracias por tu respuesta el que sabe, sabe.

Solo dos preguntas:

1.- En tu ejemplo en el Main() pones solo Test(), como yo expuse era que una variable valiese "Test()" y después siempre pongo & y la variable, para ejecutar esa variable por lo que si modifico tu código a:

Code: Select all

#include "FiveWin.ch"

function Main()

   cVar = "Test()"
   &cVar

return nil

#pragma BEGINDUMP

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

static void Test( void )
{
   MessageBox( 0, "dentro de Test()", "ok", 0 );
}

typedef void ( * PFUNC ) ( void );

HB_FUNC( TEST )
{
   PFUNC pFunction = Test;

   pFunction();
}

#pragma ENDDUMP
 
¿Esto funcionaría?. Pero lo utilizo para mas cosas como la declaración de variables o para quitar OBJETOS de pantalla. Por ejemplo:

Code: Select all

PROCEDURE QuiBotPan(zOpc,zOpc1)
zNum = zOpc
do While .T.
  do case
    case zNum > 9
      zVar = "xPul"  + str(zNum,2,0)
    otherwise
      zVar = "xPul0" + str(zNum,1,0)
  endcase
  &zVar:End()
  zNum = zNum + 1
  if zNum = zOpc1+1
    exit
  endif
enddo
RETURN (NIL)
Que lo que hace es quitar botones desde un numero a otro. Aquí también funcionaría.

2.- En tu ejemplo usas una función de harbour "HB_FUNC" para llamar a la otra y usas "hbapi.h" como expresé yo lo quiero hacer en C++, tendría que incluir esta .h para poder hacerlo o lo tendría que hacer de otra manera.

Un saludo y gracias de nuevo.

Carlos

Re: Ayuda en programa

Posted: Mon May 23, 2016 4:17 pm
by Antonio Linares
Carlos,

Necesito que me muestres un ejemplo en C++ de lo que estás haciendo o de lo que quieres hacer

Re: Ayuda en programa

Posted: Tue May 24, 2016 6:14 am
by colthop
Hola Antonio:

El ejemplo puede ser lo mismo que te expuse en el otro post pero en C++, algo asi:

Code: Select all

....
void  QuiBotPan(int, int)
....

Main()
....
QuiBotPan(2, 6)
....


void  QuiBotPan(int zOpc, int zOpc1)
{
char* zVar;
zNum = zOpc;
do  
{
  if (zNum > 9)
    {
      zVarC = "xPul";
      itoc(zNum,zNumC,2);
    }
  else
    {
      zVarC = "xPul0";
      itoc(zNum,zNumC,1);
    }
  strcpy(&zVar[ strlen(zVarC) ], zNumC); 
  CloseWindow(&zVar);
  zNum++
}
While zNum < zOpc1+1;
}
Imaginemos una Ventana Principal en donde tengamos otras 10 llamadas secuencialmente desde xPul01 a xPul10. Esta función debería cerrar las ventanas creadas desde xPul02 a xPul06, con la función "CloseWindow(&zVar)".

Que es básicamente lo que quiero que yo creo una variable ("zVar")con unos valores ("xPul02", "xPul03", "xPul04", "xPul05" y "xPul06") y después mediante una opción ("&" o lo que sea) el programa reemplace en la función lo que vale la variable ("CloseWindow(xPul02)", "CloseWindow(xPul03)", "CloseWindow(xPul04)", "CloseWindow(xPul05)", "CloseWindow(xPul06)").

Un saludo

Carlos

Re: Ayuda en programa

Posted: Tue May 24, 2016 8:22 am
by Antonio Linares
Carlos,

Tendrias que mantener un array y recorrer el array cerrando las ventanas.

Por los nombres con comillas no puedes hacerlo. C++ no mantiene una tabla de símbolos como en Harbour.

Re: Ayuda en programa

Posted: Tue May 24, 2016 8:38 am
by colthop
Hola Antonio:

Gracias por tu orientación, esto funcionaría con el primer caso crear un array con "test()" y luego poner:

array [1];

Ejecutaría "test()"

Un saludo

Y gracias.

Carlos

Re: Ayuda en programa

Posted: Tue May 24, 2016 9:09 am
by Antonio Linares
Puedes declarar un array del tipo que quieras, por ejemplo "punteros a funciones" y luego
usar esos valores para lo que necesites.

Tienes algo ya funcionando que pueda probar aqui ?

Re: Ayuda en programa

Posted: Tue May 24, 2016 9:15 am
by colthop
Hola Antonio:

Todavía no estoy buscando todo lo que necesito y no tengo nada enlazado.

Pero ya me has orientado y si necesito mas ayuda te la pediré.

Gracias por todo.

Un saludo

Calros

Re: Ayuda en programa

Posted: Tue May 24, 2016 9:39 am
by Antonio Linares
Carlos,

En el 2012 y por probar, comencé a escribir una librería en C++ a la que llamé FiveCpp
que simulaba un poco el comportamiento de FWH pero desarrollada en C++.

Tal vez pueda interesarte. Aun no se con certeza lo que necesitas :-)