FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Devolver una Matriz o Array desde una funci贸n en C
Posts: 563
Joined: Sun Oct 09, 2005 07:23 PM
Devolver una Matriz o Array desde una funci贸n en C
Posted: Mon May 06, 2013 09:40 AM
Debido a requerir bastante velocidad en un proceso estoy tratando de implementar una funci贸n en C que necesito que me devuelva una matriz de caracteres.
He buscado alg煤n ejemplo parecido pero no logro encontrarlo.
Adjunto el c贸digo con el que estoy probando, aunque no funciona, para ver si alguien puede decir c贸mo hacerlo o poner alg煤n ejemplo.
Gracias de antemano.

Code (fw): Select all Collapse
#pragma BEGINDUMP
#include "windows.h"
#include "hbapi.h"
#include "string.h"

HB_FUNC( DEVUELVEMATRIZ )
{
   LPSTR szTitle = "Nuevo valor";
   //LPSTR szMsg = "Hasta Aqu铆 llega";

   PHB_ITEM pArray; 

   char cadena[] = "STATES 1:2|200,2,1:2|201,2,1:7923|202,2,1:5568|203,2,1:1423|204,2,1:1423|205,2,1:1|206,2,1:1|208,2,1:1|209,2,1:17|210,2,1:1|213,2,1:A2DED32F|";
  
   char *elemento;

   elemento = [b]strtok[/b](cadena," |");

   pArray = hb_itemArrayNew(0);

   while (elemento != NULL)
   {
      //printf("%s\n",elemento);
      MessageBox( GetActiveWindow(), elemento, szTitle, 0x40 ); 

      hb_arrayAddForward(pArray,( PHB_ITEM ) elemento );
      elemento = strtok(NULL," |");
   }
   
   /* Manejo de la matriz dentro de la funci贸n en C.
   for(i=1;i<=13;i++)
   {
     MessageBox( GetActiveWindow(), pArray+i-1, szTitle, 0x40 );
   }      
   */
   
  //Devolver matriz al prg:
   hb_itemReturn( pArray );

   //return pArray;
}
#pragma ENDDUMP
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Devolver una Matriz o Array desde una funci贸n en C
Posted: Mon May 06, 2013 10:46 AM

Usa la funci贸n hb_ATokens( cTuCadena, "|" )

Tienes varios errores en tu c贸digo, si quieres te los comento.

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 563
Joined: Sun Oct 09, 2005 07:23 PM
Re: Devolver una Matriz o Array desde una funci贸n en C
Posted: Mon May 06, 2013 11:43 AM
Gracias Antonio por contestar.
He intentado utilizar esa funci贸n que dices pero el problema que tiene es que solo "filtra" mediante un 煤nico caracter y yo necesito que sean al menos 3 cualesquiera de ellos, cosa que si admite esa funci贸n de C llamada strtok, si te fijas bien, en esa funci贸n pongo dos caracteres para el filtrado, el espacio y el s铆mbolo |, por eso tiene dos caracteres an el segundo par谩metro: strtok(cadena," |").

Por supuesto que te agradezco que me corrijas los errores (algunos ser谩n horrores) que hayas encontrado.

Por cierto, he conseguido un ejemplo para devolver una matriz num茅rica desde el c贸digo C al PRG con el siguiente c贸digo:

Code (fw): Select all Collapse
   hb_reta( 3 );
   hb_stornl(  1, -1, 1 );
   hb_stornl( 12, -1, 2 );
   hb_stornl( 13, -1, 3 );


Pero no tengo mucha seguridad en lo que he hecho porque no tengo la documentaci贸n de ese tipo de funciones hb_stor... que parece que son necesarias para este asunto.
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Devolver una Matriz o Array desde una funci贸n en C
Posted: Mon May 06, 2013 01:15 PM
Prueba asi:

Code (fw): Select all Collapse
HB_FUNC( DEVUELVEMATRIZ )
{
   LPSTR szTitle = "Nuevo valor";
   //LPSTR szMsg = "Hasta Aqu铆 llega";

   PHB_ITEM pArray; 

   char cadena[] = "STATES 1:2|200,2,1:2|201,2,1:7923|202,2,1:5568|203,2,1:1423|204,2,1:1423|205,2,1:1|206,2,1:1|208,2,1:1|209,2,1:17|210,2,1:1|213,2,1:A2DED32F|";
  
   char *elemento;

   elemento = [b]strtok[/b](cadena," |");

   pArray = hb_itemArrayNew( 0 );

   while (elemento != NULL)
   {
      PHB_ITEM pItem = hb_itemPutC( NULL, elemento );

      //printf("%s\n",elemento);
      MessageBox( GetActiveWindow(), elemento, szTitle, 0x40 ); 

      hb_arrayAddForward( pArray,( PHB_ITEM ) pItem );
      hb_itemRelease( pItem );

      elemento = strtok(NULL," |");
   }
   
   /* Manejo de la matriz dentro de la funci贸n en C.
   for(i=1;i<=13;i++)
   {
     MessageBox( GetActiveWindow(), pArray+i-1, szTitle, 0x40 );
   }      
   */
   
  //Devolver matriz al prg:
   hb_itemReturn( pArray );

   //return pArray;
}
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 563
Joined: Sun Oct 09, 2005 07:23 PM
Re: Devolver una Matriz o Array desde una funci贸n en C
Posted: Mon May 06, 2013 03:00 PM

Ha funcionado prefectamente.
Muchas gracias Antonio.

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Devolver una Matriz o Array desde una funci贸n en C
Posted: Mon May 06, 2013 05:48 PM

Prueba a a帽adir esta l铆nea al final y comprueba si sigue funcionando bien, gracias:

hb_itemRelease( pArray );

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 563
Joined: Sun Oct 09, 2005 07:23 PM
Re: Devolver una Matriz o Array desde una funci贸n en C
Posted: Tue May 07, 2013 10:29 AM
Va perfecto.
He modificado el c贸digo para poderle pasar como par谩metro una cadena.
Como strtok modifica el par谩metro que se le pasa hago antes una copia para trabajar con ella.
Adjunto c贸digo a ver si te parece que est谩 bien y por si a alguien m谩s le viene bien.

Code (fw): Select all Collapse
#pragma BEGINDUMP

#include "windows.h"
#include "hbapi.h"
#include "string.h"

HB_FUNC( DEVUELVEMATRIZ )
{
   PHB_ITEM pArray;

   size_t nSize = 0;
   char *cadena;    // Contendr谩 una copia para trabajar de la cadena pasada a la funci贸n
   char *elemento;
       
   nSize = strlen( hb_parc( 1 ) )+1; //Suma uno para incluir el caracter de final de cadena='\0'
   cadena=(char *)malloc(nSize);     // Reserva la memoria para la variable: cadena.
   //memset(cadena,NULL,nSize);      // Inecesario porque cadena ser谩 igual que hb_parc( 1 )
       
   memcpy( ( void * ) cadena, ( void * ) hb_parc( 1 ), nSize );

   elemento = strtok(cadena," |");

   pArray = hb_itemArrayNew( 0 );

   while (elemento != NULL)
       {
          PHB_ITEM pItem = hb_itemPutC( NULL, elemento );

          //printf("%s\n",elemento);
          //MessageBox( GetActiveWindow(), elemento, "elemento", 0x40 );

          hb_arrayAddForward( pArray,( PHB_ITEM ) pItem );
          hb_itemRelease( pItem );

          elemento = strtok(NULL," |");
       }
       
   free(cadena);  //Libera la memoria reservada para la variable: cadena
   //Devolver matriz al prg:
   hb_itemReturn( pArray );
   hb_itemRelease( pArray );
}
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Devolver una Matriz o Array desde una funci贸n en C
Posted: Tue May 07, 2013 11:13 AM

En vez de usar malloc() y free() usa hb_xgrab() y hb_xfree() de Harbour

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 563
Joined: Sun Oct 09, 2005 07:23 PM
Re: Devolver una Matriz o Array desde una funci贸n en C
Posted: Tue May 07, 2013 05:56 PM

Tu consejo me dejas con algunas dudas de llam茅mosle principios, como:
驴 Porqu茅 es mejor utilizar las funciones de Harbour que las standard de C ?.
驴 No ser铆a m谩s portable el c贸digo "cuanto m谩s en C" est茅 ?, al fin y al cabo, Harbour lo pasa primero a C para que luego el BCC o cualquier otro lo pasen a obj.

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Devolver una Matriz o Array desde una funci贸n en C
Posted: Tue May 07, 2013 06:50 PM

Harbour (lo aprendimos con Clipper) cuida de la robustez de la aplicaci贸n y para esto evita posible errores.

hb_xgrab() llama a malloc() pero comprueba que no se le pase un valor cero, tambien controla que el resultado no sea nulo, y ademas anota en un sistema propio de Harbour datos acerca del bloque de memoria solicitado, para que si la memoria al final no se libera, lo sepamos y asi se pueda corregir.

Como ves, es una capa muy delgada y robusta sobre funciones propias de C, para evitar errores que harian que nuestra aplicaci贸n generase un GPF (algo muy tipico en aplicaciones C puras) :-)

De hecho, la filosofia de la maquina virtual de Harbour es precisamente la misma: evitar errores, controlar el flujo de la aplicaci贸n, darle robustez. La robustez por la que Clipper siempre ha sido famoso, sin usar excesivas capas que lo enlentecerian :-)

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 563
Joined: Sun Oct 09, 2005 07:23 PM
Re: Devolver una Matriz o Array desde una funci贸n en C
Posted: Wed May 08, 2013 07:44 AM

Desde luego que esos son ARGUMENTOS y con ello, me parece oportuno reconocer que es un placer leer tus explicaciones, siempre se aprende algo.
Mi m谩s sincero agradecimiento.

L谩stima que no tengamos una documentaci贸n mejor de Harbour para sacarle mejor provecho.

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Devolver una Matriz o Array desde una funci贸n en C
Posted: Wed May 08, 2013 10:18 AM
Nosotros ofrecemos esta documentaci贸n de Harbour, aunque no es la m谩s completa ni cubre todo:

http://www.fivetechsoft.com/harbour-docs/harbour.html

De todas formas, acabo de preguntar en la lista de desarrollo de Harbour, cual ser铆a el sitio en donde est茅 la mejor documentaci贸n de Harbour disponible:

https://groups.google.com/forum/?fromgroups=#!topic/harbour-devel/ddUuezv7sgA
regards, saludos

Antonio Linares
www.fivetechsoft.com

Continue the discussion