jueves, noviembre 19, 2009

Harbour VS xHarbour, Las diferencias verdaderas (Parte 4)

Arreglos (arrays) tipo "hash".

Ambos compiladores tienen soporte para arreglos tipo "hash". Estos son similares a los arreglos normales pero también permiten el uso de valores no enteros como índices de los arreglos, como cadenas de caracteres, fechas, números no enteros o apuntadores (en Harobur). Se crean usando el operador => para las listas de llaves y los valores se encierran entre {}. Ejemplo:

hVal := { "ABC" => 123.45, ;
100.1 => date(), ;
100.2 => 10, ;
100 => 5, ;
date()-1 => .t. }

Y luego los elementos se accesan usando el operador [], así:
      ? hVal[ "ABC" ]      // 123.45
? hVal[ 100 ] // 5
? hVal[ date()-1 ] // .t.
? hVal[ 100.2 ] // 10
? hVal[ 100.1 ] // date()

Por default, en ambos compiladores los arreglos hash soportan adición automática de nuevos elementos en operaciones de asignación. Esto se puede deshabilitar usando alguna de las funciones para hashes.

Harbour tiene extensiones adicionales las cuales permiten habilitar la auto adición con valores por default tanta para operaciones de acceso como para operadores de acceso. También soporta el paso de elementos de un arreglo hash por referencia junto con otras extensiones menores.

xHarbour no soporta auto adición en operciones de acceso o referencia y no funciona el paso de los elementos de un array hash por referencia. (véase pasnado elementos de un arreglo o de un hash por referencia ).

xHarbour tiene una funcionalidad adicional la cual puede ser activada para cada arreglo hash. Se trata de un índice que almacena información sobre el orden en el cual los elementos del hash fueron añadidos y un conjunto de funciones para operar sobre este índice (HAA*()). Son llamdos "arreglos asociativos" en xHarbour. Harbour no tiene esta funcionalidad.

Ambos compiladores tienen un conjunto de fuciones para hacer diferentes operaciones sobre arreglos hash con funcionalidad similar. En Harbour se usa el prefico HB_H (p.ej. HB_SCAN()) y en xHarbour el prefijo H (p.ej. HSCAN()).

Continuará....

1 comentario:

Walter Negro dijo...

xHarbour tambien soporta busquedas de clave que respeten o no mayúsculas y minúsculas.
Por omisión, el Hash respeta el texto tal cual está escrito.
HSetCaseMatch( h, lCaseSensitive ).

También en xHarbour es posible desactivar el agregado automático de claves y si esta no se encuentra, generar un error.
Es muy útil en momentos de depuración del programa.
La función es HSetAutoAdd(h, lAutoAdd)
Desconozco si Harbour soporta estas funciones, simplemente era un complemento al comportamiento del Hash()