PROBLEMA CON MATRICES EN VB6
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
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
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
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
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
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
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
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
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.
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.
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
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
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
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
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
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
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...
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...
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.
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.
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...
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...