Ayuda sobre Arrays dinámicos multidimensionales

Ayuda sobre Arrays dinámicos multidimensionales

Postby sjingo » Sun Jun 04, 2006 8:42 pm

Hola Amigos.

Quisiera saber cómo adicionar valores a un array multidimensional, me explico:

1. Declaro el array que tendrá n líneas y n columnas
aprueba:=Array(1,3+LastRec())

Para empezar el arreglo tiene 1 línea y 3 columnas fijas mas el número de registros de un dbf (que no va a ser muy grande)

2. En el proceso yo voy haciendo un Add() al arreglo. Cuando el número de columnas es fijo no hay problema porque puedo hacer:

Add(aprueba, {val1,val2,val3,val4,val5,val6})

Aquí viene mi problema: cómo hago para inicializar las columnas, porque bien pueden ser unas 5 como unas 50 columnas del arreglo.

O tal vez si usara Add(aprueba,{}), se adicionan todas las columnas declaradas al principio? . Si es así estaría resuelto el problema. Por favor confírmenme.

Es la primera vez que se me presenta esta necesidad, pues antes siempre cambiaba dinámicamente las filas con columnas fijas, pero hoy tengo que cambiar dinámicamente tanto filas como columnas

Un saludo y Gracias anticipadas

Marcelo Jingo
Last edited by sjingo on Sun Jun 04, 2006 11:29 pm, edited 1 time in total.
User avatar
sjingo
 
Posts: 229
Joined: Sat Mar 18, 2006 3:42 pm
Location: Ibarra-Ecuador

SOLUCIONADO

Postby sjingo » Sun Jun 04, 2006 11:27 pm

Ya lo he solucionado usando macrosustitución:

texto:="{"+str(diafin)

for j:=1 to numregs
texto+=",0.00"
next

texto+="}"

aadd(asem,&texto)


Un saludo

Marcelo Jingo
User avatar
sjingo
 
Posts: 229
Joined: Sat Mar 18, 2006 3:42 pm
Location: Ibarra-Ecuador

Re: SOLUCIONADO

Postby thefull » Tue Jun 13, 2006 2:47 pm

sjingo wrote:Ya lo he solucionado usando macrosustitución:

texto:="{"+str(diafin)

for j:=1 to numregs
texto+=",0.00"
next

texto+="}"

aadd(asem,&texto)


Un saludo

Marcelo Jingo


Marcelo, y no te es mas facil CREAR un array dinamico temporal y despues simplemente añadirlo al principal ?

Es decir, aTmp := {}

AADD( aTmp, mis_valores1 )
AADD( aTmp, mis_valores2 )
AADD( aTmp, mis_valores3 )

Y despues:
AADD( asem, aTmp )

Prueba, pero yo creo que seria mas rapido que la macro.
Ademas, podrias crear el array temporal ya con las dimensiones apropiadas, aTMp := ARRAY( X )
Y en vez de usar AADD( aTmp, valor ), usar una asignacion:
aTmp[x] := valor, asi todavia sera mas rapido.

No se si sera esto lo que buscas, pero asi lo entidi yo ;-)
Saludos
Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)
User avatar
thefull
 
Posts: 731
Joined: Fri Oct 07, 2005 7:42 am
Location: Barcelona

Postby sjingo » Wed Jun 14, 2006 1:53 am

gracias por tu interés "TheFull"

Probé tu propuesta, que a primera vista debería haber funcionado pero no obtuve lo que quería.

Según entiendo entonces es lo mismo hacer:

atmp[1]:=val1
atmp[2]:=val2
atmp[3]:=val3
atmp[4]:=val4
atmp[5]:=val5
atmp[6]:=val6

aadd(asem,atmp)



en comparación con este que es el que uso:

aadd(asem,{val1,val2,val3,val4,val5,val6})

de esta forma estoy seguro de que estoy añadiendo una fila con todos esos valores a asem

Es lo mismo usar cualquiera de las 2 formas?

Un saludo

Marcelo Jingo
User avatar
sjingo
 
Posts: 229
Joined: Sat Mar 18, 2006 3:42 pm
Location: Ibarra-Ecuador

Re:

Postby thefull » Wed Jun 14, 2006 7:36 am

sjingo wrote:Es lo mismo usar cualquiera de las 2 formas?

Un saludo

Marcelo Jingo


Si, es exactamente lo mismo, y lo mismo que:

aSem := {}
atmp := { }
AADD( atmp,1)
AADD( atmp,2)
AADD( atmp,3)
AADD( atmp,4)

AADD( aSem, aTmp )

Al final , lo que obtienes es un array multidimensional, que visto seria:

aSem := { { 1,2,3,4} }

Si quieres mas arrays, pues repites la accion:

atmp := { }
AADD( atmp,6)
AADD( atmp,7)

AADD( aSem, aTmp )

Y visto el array aSem, tendrias:
aSem := { { 1,2,3,4},;
{ 6,7} }

Espero que ahora esta mas simple
Saludos
Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)
User avatar
thefull
 
Posts: 731
Joined: Fri Oct 07, 2005 7:42 am
Location: Barcelona

Postby sjingo » Wed Jun 14, 2006 1:29 pm

Seguramente algo hice mal, porque cambie por la forma que me indicaste y me salieron los datos en ubicaciones distintas, así que por el momento opté mantener la forma anterior, hasta darme un poquito de tiempo y revisarlo bien.

De todas formas, muchas gracias Rafa, que ahora sí lo tango más claro.

Un saludo

Marcelo Jingo
User avatar
sjingo
 
Posts: 229
Joined: Sat Mar 18, 2006 3:42 pm
Location: Ibarra-Ecuador

Postby sjingo » Sun Jun 18, 2006 8:45 pm

Finalmente, la recomendación de Rafa es la adecuada. Porque al usar macros tuve problemas cuando la expresión es demasiado grande. Hasta unos 15 valores funcionaba bien, pero cuando se me presentaban con más valores obtenía el error de expresión demasiada compleja y caía.

Así que inmediatamente tuve que buscar el tiempo que no tenía para buscar el detalle que impedía que la recomendación de Rafa no me funcionaba. Luego de romperme la cabeza por varias noches, haciendo corridas de escritorio y otras cosas más, pude encontrar la solución.

Todo estaba bién, el único detalle había sido en la declaración del array temporal.

A breves rasgos les explico que primero declaraba el array temporal , el aadd() se hacía dentro de un do while:

atmp:=array(3+nRecs)
do while.....
//aqui hago la asignación de valores a atmp
//para luego adicionar al array asem
aadd(asem,atmp)
enddo

El resultado era que inexplicablemente (para mí), todas las filas, tanto las nuevas adcionadas como las anteriores tomaban los valores de la última asignación hecha a atmp. Osea que todas las filas de asem tenian los valores del último atmp.

Sin saber qué hacer, y sólo pro probar realicé la asignación del atmp dentro del do While y VOALA, funcionó. Quedando así:

do while.....
atmp:=array(3+nRecs)
//aqui hago la asignación de valores a atmp
//para luego adicionar al array asem
aadd(asem,atmp)
enddo

Esta es una de esas cosas que no logro comprender bien. Pero finalmente ha funcionado y no hay problema si son 5 , 50 o más valores.

Gracias nuevamente a Rafa por darme una luz en el camino

Un saludo

Marcelo Jingo
User avatar
sjingo
 
Posts: 229
Joined: Sat Mar 18, 2006 3:42 pm
Location: Ibarra-Ecuador


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 53 guests