PROBLEMA CON MATRICES EN VB6

maya
03 de Enero del 2004
Estoy realizando un programa que me calcule una orientacion fotogrametrica mediante el lenguaje VBasic 6 y tengo varios problemas:

1.- como hago para que me lea desde un fichero en el cual estan guardadas las coordenadas??

2.- al ejecutar el procedimiento siguiente, me da un error de "no coinciden los tipos" al llegar al punto que he marcado en rojo:

Private Sub Command1_Click()

ReDim m1d(1) ' redimensionamos las matrices
ReDim m2d(1)
ReDim m3d(1)
ReDim m4d(1)

ReDim n1d(0 To (2 * n - 2))
ReDim n2d(0 To (2 * n - 2))
ReDim n3d(0 To (2 * n - 2))
ReDim n4d(0 To (2 * n - 2))

ReDim matA_dch(n1d(), n2d(), n3d(), n4d()) 'calculamos la matriz A


For fila = 0 To n - 1

m1d(0) = Text2(fila).Text
m1d(1) = Text3(fila).Text

m2d(0) = m1d(1)
m2d(1) = -m1d(0)

m3d(0) = 1
m3d(1) = 0

m4d(0) = 0
m4d(1) = 1

Next

n1d(fila) = m1d()
n2d(fila) = m2d()
n3d(fila) = m3d()
n4d(fila) = m4d()


matA_dch(fila) = matA_dch(n1d(), n2d(), n3d(), [color=red]n4d())[/color]

solucion1 = matA_dch()


End Sub



¿que puede fallar, por mas que lo intento no veo el fallo

las variables se dimensionaron antes de la forma siguiente:
Dim m1d(), m2d(), m3d(), m4d() As Variant
Dim n1d(), n2d(), n3d(), n4d() As Long
Dim matA_dch() As Long

gracias por la ayuda

reventador
03 de Enero del 2004
hola maya,

he visto varios problemas en tu codigo. lo de la marca roja no es donde lo has puesto si no en el redim de matA_dch, es porque no la redimensionas bien, debes hacerlo asi:

ReDim matA_dch0 To (2 * n - 2), 0 To (2 * n - 2), 0 To (2 * n - 2), 0 To (2 * n - 2)) 'calculamos la matriz A

Lo que tienes después del Next es algo que no he entendido nada, no es lógico lo que pones, por una parte haces referencia a la variable fila fuera del For, y opr otra parta no haces referencia a ningun elemento de las matrices m1d, m2d, m3d, m4d.

Revisa todo ese codigo porque te producirá bastantes fallos.

Un saludo

maya
03 de Enero del 2004
ya se soluciono el redim pero sigue dando el mismo error ahora al llegar a la matriz n4d()

en cuanto a lo de que me lea un fichero por filas y me coloque el los textbox los valores encontrados como lo haria?? mediante un commondialog? y como seria el procedimiento


gracias

maya
03 de Enero del 2004
no se si se ha enviado el mensaje anterior, asi que lo vuelvo a escribir. si esta dos veces perdonar...

lo que pretendo con este procedimiento es que a partir de unos datos x, y de un numero de puntos (n)
opbtener una matriz de n filas por 4 columnas en la que sus datos son, para cada punto los siguientes:

x y 1 0 esto seria la 1ª fila
y -x 0 1 esto seria la 2ª fila

estos datos se repetirian para cada punto y por ello la dimension de la matriz final es de 0 to 2*n-2

espero que esto ayude para entender el codigo, y si lo he puesto mal por favor AYUDAAAAA!!!!

gracias por todo


reventador
03 de Enero del 2004
hola de nuevo maya, posteo para darte el ejemplo para abrir los puntos desde un archivo.

En este ejemplo he considerado que el archivo de puntos debe ser .txt y tiene la siguiente estructura, por cada vez que ponga *PUNTO debe haber un valor de x y un valor de y a continuacion:
Recuerda que debes tener un control CommonDialog1 metido en el Form.


Puntos.txt
-------------------------------

*PUNTO
x=23
y=14
*PUNTO
x=55
y=21
*PUNTO
x=11
y=6

*FIN_ARCHIVO_PUNTOS

-------------------------------




Public Sub CargarPuntos()

Dim fs, f, Ruta


CommonDialog1.Filter = "Archivos de Texto (*.txt)|*.txt"
CommonDialog1.FilterIndex = 1
CommonDialog1.ShowOpen

rutapuntos = CommonDialog1.FileName


Set fs = CreateObject("Scripting.FileSystemObject")

If Not fs.FileExists(rutapuntos) Then Exit Sub


Set f = fs.OpenTextFile(rutapuntos, 1, TristateFalse)

strprev = f.ReadAll
lenprev = Len(strprev)

Dim total_puntos As Long
total_puntos=0

posF = InStr(1, strprev, "*FIN_ARCHIVO_PUNTOS", vbTextCompare)
If posF = 0 Or IsNull(posF) Then
'No se ha encontrado el final del archivo
Respuesta = MsgBox("Archivo de Puntos no válido", vbOKOnly, "Error en el archivo")
f.Close
Exit Sub
Else

posI = 1
salir_bucle = False

Do While salir_bucle = False

'Miramos si existe un nuevo Punto
pos1 = InStr(posI, strprev, "*PUNTO", vbTextCompare)
If pos1 = 0 Or IsNull(pos1) Then
salir_bucle = True
Else
total_puntos = total_puntos + 1
'Existe un nuevo punto, obtenemos las variables x e y

'la x
pos2 = InStr(pos1, strprev, "x=", vbTextCompare)
If pos2 = 0 Or IsNull(pos2) Then
Respuesta = MsgBox("Archivo de Puntos no válido", vbOKOnly, "Error en el archivo")
f.Close
Exit Sub
End If

pos1 = InStr(pos2, strprev, vbCrLf, vbTextCompare)
If pos1 = 0 Or IsNull(pos1) Then
Respuesta = MsgBox("Archivo de Puntos no válido", vbOKOnly, "Error en el archivo")
f.Close
Exit Sub
End If

Texto2(total_puntos - 1).Text = Mid(strprev, pos2 + 2, pos1 - pos2 - 2)

'la y
pos2 = InStr(pos1, strprev, "y=", vbTextCompare)
If pos2 = 0 Or IsNull(pos2) Then
Respuesta = MsgBox("Archivo de Puntos no válido", vbOKOnly, "Error en el archivo")
f.Close
Exit Sub
End If

pos1 = InStr(pos2, strprev, vbCrLf, vbTextCompare)
If pos1 = 0 Or IsNull(pos1) Then
Respuesta = MsgBox("Archivo de Puntos no válido", vbOKOnly, "Error en el archivo")
f.Close
Exit Sub
End If

Texto3(total_puntos - 1).Text = Mid(strprev, pos2 + 2, pos1 - pos2 - 2)
End If

posI = pos1

Loop

End If

f.Close

End Sub




Espero que te sirva, si no completo, que sea una orientación para lo que quieres hacer.


Un saludo.

reventador
03 de Enero del 2004
hola maya, un pequeño apunte al anterior post:

quita el n=1
y donde pone Text2.Text y Text3.Text debe poner, para que a ti te funcione:

Text2(fila).Text
Text3(fila).Text


Son las prisas, jeje, lo siento

reventador
03 de Enero del 2004
hola maya, si creo que he entendido bien lo que has dicho, en la variable final te quedarian 2 filas por cada punto. Esto lo he he probado y te puede resultar mucho mas facil si lo haces de la siguiente forma:


Dim matA_dch() As Long

Private Sub Command1_Click()

n = 1


ReDim matA_dch(0 To (2 * n - 1), 0 To 3) 'calculamos la matriz A


For fila = 0 To n - 1 Step 2

matA_dch(fila, 0) = CLng(Text2.Text)
matA_dch(fila, 1) = CLng(Text3.Text)
matA_dch(fila, 2) = 1
matA_dch(fila, 3) = 0

matA_dch(fila + 1, 0) = CLng(Text3.Text)
matA_dch(fila + 1, 1) = -CLng(Text2.Text)
matA_dch(fila + 1, 2) = 0
matA_dch(fila + 1, 3) = 1


Next


solucion1 = matA_dch()


End Sub



Espero que te sirva y que te funcione para lo que quieres hacer, te estoy escribiendo un ejemplito para coger todos los datos de un archivo de texto.

Un saludo

maya
03 de Enero del 2004
ya estoy aqui otra vez..... ¿que pesada soy!!!

gracias por la pagina sobre calculos matriciales, parece que tiene muy buena pinta...

por otro lado, he estado observando el codigo para obtener la matriz matA_dcha() y he hecho algunos cambios porque asi me daba error.

la historia esta en que las coordenadas de los puntos estan en textbosçx puestos de la siguiente forma:

text1(0) text2(0) ' esto seria coordx y coordy del 1er punto
tex1(1) text2(1) ' segundo punto
....
text1(n-1) text2(n-1) ' ultimo punto


mientras que la matriz tiene por cada punto dos filas

el cambio que he hecho es el siguiente:

Dim matA_dch() As Long
dim fila as integer
dim contador as integer

Private Sub Command1_Click()

ReDim matA_dch(0 To (2 * n - 1), 0 To 3)

contador = 0

For fila = 0 To (2*n - 2) Step 2

matA_dch(fila, 0) = CLng(Text2(contador).Text)
matA_dch(fila, 1) = CLng(Text3(contador).Text)
matA_dch(fila, 2) = 1
matA_dch(fila, 3) = 0

matA_dch(fila + 1, 0) = CLng(Text3(contador).Text)
matA_dch(fila + 1, 1) = -CLng(Text2(contador).Text)
matA_dch(fila + 1, 2) = 0
matA_dch(fila + 1, 3) = 1

contador=contador+1

Next


solucion1 = matA_dch()


End Sub


funcionaria asi el bucle? el problema es que hasta que no tenga la solucion de todos los calculos matriciales no se si esta bien.... aunque para ello he pensado poner provisionalmente un nuevo form en el cual me visualice el valor de la matriz (asi llevo un control de si esta bien).

Salu2 y gracias de nuevo

maya
03 de Enero del 2004
Gracias por la ayuda la verdad es que asi es mucho menos complicado y utiliza menos variables jeje...

probare a ver si me funciona bien.

En cuannto al codigo para leer el fichero de texto, si que era para txt, y yo tenia colocado een el form el commondialog, pero no sabia como usarlo, asi que haciendo cambios por el pormato de puntos (que van seguidos solo numeros) me servira de guia el codigo que me has enviado.

Gracias otra vez.

Salu2

pd: mañana seguro que andare otra vez por aqui con mas dudas....

por cierto, alguien sabe como se opera matematicamente con matrices, si vb las reconoce y solo hace falta poner por ejemplo:

para sumar 2 matrices: sum()=a()+b()

o necesita otro metodo...

reventador
03 de Enero del 2004
hola maya.

He encontrado en una página código fuente que te ahorrará la faena del cálculo de matrices, y funciona bien:

http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=42477&lngWId=1


Un saludo.

reventador
03 de Enero del 2004
Por desgracia el vb6 no es tan listo, jeje.

No tienes más remedio que hacerte tú tus propias funciones de cálculo con matrices (usando bucles), o buscar por internet algún control ocx especializado en matrices y así no tienes que implementar todo ese código tan aburrido, jeje.

Un saludo.

PD: mañana te espero...