Page 1 of 1
Ayuda sobre Arrays dinámicos multidimensionales
Posted: Sun Jun 04, 2006 8:42 pm
by sjingo
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
SOLUCIONADO
Posted: Sun Jun 04, 2006 11:27 pm
by sjingo
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
Re: SOLUCIONADO
Posted: Tue Jun 13, 2006 2:47 pm
by thefull
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
Posted: Wed Jun 14, 2006 1:53 am
by sjingo
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
Re:
Posted: Wed Jun 14, 2006 7:36 am
by thefull
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
Posted: Wed Jun 14, 2006 1:29 pm
by sjingo
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
Posted: Sun Jun 18, 2006 8:45 pm
by sjingo
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