[SOLUCIONADO] Matriz de objetos no admite elementos nuevos - Versión para impresión +- Comunidad Gambas-es (https://gambas-es.org) +-- Foro: Gambas (https://gambas-es.org/forum-3.html) +--- Foro: General (https://gambas-es.org/forum-4.html) +--- Tema: [SOLUCIONADO] Matriz de objetos no admite elementos nuevos (/thread-1896.html) Páginas:
1
2
|
Matriz de objetos no admite elementos nuevos - Grandamakulo - 17-03-2025 Hola, compañeros: Me temo que no he sido capaz de explicar convenientemente el problema en el título del tema. En realidad, es que no es sencillo de explicar. Vayamos por partes, como dijo Jack. Defino una estructura en un formulario y tres matrices —en realidad, vectores, pero vamos, no nos pongamos quejicosos—: Código: Public Struct struCampos —Olvidémonos de los comentarios y de las malas praxis con los nombres, por el momento ![]() Inserto algunos elementos vacíos, pero les cambio la propiedad .Nombre: Código: For i = 0 To lsoRemanentes.Count - 1 Y resulta que siempre añade el mismo, es decir, cuando exploro la matriz todos, absolutamente todos los elementos son el mismo, en concreto, el último que he pasado. Además, si se me ocurre pasar estas matrices entre formularios, por ejemplo: Código: $cRemanentesP = FPral.$cRemanentes Resulta que pasa las matrices por referencia, no por valor, por lo que me las modifica en el origen. Es decir, si hago $cFijosP en el nuevo formulario para trabajar y después ver si hago los cambios definitivos y los paso o no a FPral.$cFijos, resulta que no, porque modifica ambas matrices como si fuesen la misma. Estoy convencidísimo que es una auténtica chorrada, pero mi torpeza e ignorancia me impide verlo. en fin, a ver si algún alma caritativa me ilumina. ¡Y muchas gracias de antemano! RE: Matriz de objetos no admite elementos nuevos - Shordi - 17-03-2025 He intentado manejar tu código, pero no he sido capaz de hacerlo funcionar. Sube un pequeño proyecto simplificado que reproduzca ese comportamiento y te podré ayudar. Por otro lado, yo cambiaría esto: Código: For i = 0 To lsoRemanentes.Count - 1 Código: Dim cDos As New StruCampos Saludes RE: Matriz de objetos no admite elementos nuevos - Grandamakulo - 17-03-2025 ¡Perfecto!, a tu código solo le he cambiado cDos.Texto = lsoRemanentes[i].Text. Ahora me queda lo del cambio de matrices. Voy a ver si soy capaz de hacer un miniejemplo y pasarlo. RE: Matriz de objetos no admite elementos nuevos - guizans - 17-03-2025 No he probado tu código Shordi, pero veo algo raro que me llama mucho la atención y debería estar mal según mi opinión. El la primera línea creas una variable cDos como StruCampos y la instancias con New. Y después dentro del bucles vuelves a instanciar la variable cDos, ¿Esto es correcto? Es que me chirria mucho. RE: Matriz de objetos no admite elementos nuevos - Grandamakulo - 17-03-2025 (17-03-2025, 22:09)guizans escribió: No he probado tu código Shordi, pero veo algo raro que me llama mucho la atención y debería estar mal según mi opinión. El la primera línea creas una variable cDos como StruCampos y la instancias con New. Y después dentro del bucles vuelves a instanciar la variable cDos, ¿Esto es correcto? Es que me chirria mucho. La verdad es que lo he probado, y ha funcionado perfecto. RE: Matriz de objetos no admite elementos nuevos - Shordi - 18-03-2025 (17-03-2025, 22:09)guizans escribió: No he probado tu código Shordi, pero veo algo raro que me llama mucho la atención y debería estar mal según mi opinión. El la primera línea creas una variable cDos como StruCampos y la instancias con New. Y después dentro del bucles vuelves a instanciar la variable cDos, ¿Esto es correcto? Es que me chirria mucho. No sé si es correcto. Como digo, al no poder reproducir el código de Grandamakulo, no sé si funcionaría sin el New dentro del Dim. Pero sí estoy seguro de que funcionaría con él. Explicación: El problema, tal como yo lo veo, es que si incluyes el Dim, es decir la asignación de la ubicación en memoria, en el bucle, el compilador utilizará siempre la misma dirección que para él estará "limpia" (Explicación estúpida porque no tengo ni puta idea de qué hace exactamente el compilador con el Dim). Sin embargo, si declaras la variable fuera del bucle, y queda declarada, cada "New" implicará una nueva dirección de memoria, es decir un objeto nuevo. Si Grandamakulo quiere, que pruebe sin el New en la declaración y nos saca de dudas. Saludos Por cierto, he notado que cuando subimos código, al encontrar el caracter ' de los comentarios se pone toíto coloraíto hasta que encuentra otro ' . Habrá que "Abrir y Cerrar" los comentarios para que quede más mono... RE: Matriz de objetos no admite elementos nuevos - Grandamakulo - 18-03-2025 Resumen ejecutivo: Con New funciona. Sin New no funciona. Matizando. Efectivamente, con New funciona perfectamente. Sin New no asigna un «espacio nuevo» —yo aquí me limito a parafrasear a @Shordi, porque mi ignorancia se exacerba cosa mala—, y el resultado es que todos los valores son el último. PS.—Tomo nota de lo del cierre de comillas. A ver, aquí añado un miniejemplo que muestra tanto lo del New como el problema que tengo con las matrices —insisto, seguro que es una tontería—. ![]() RE: Matriz de objetos no admite elementos nuevos - Shordi - 18-03-2025 Respecto a lo del New, el new que hay que eliminar el el de la declaración: Dim Anhadir As New MiTipo si lo dejas en Dim Anhadir As MiTipo Sigue funcionando bien. Guizan tenía razón y sobraba. Error mío (pero no volveré a pedir perdón porque "Un anciano nunca se disculpa dos veces". Maestro Po. Serie televisión Kung-Fú capítulo 1) Respecto a la pasa por referencia no es un problema de referencias es un problema de ámbitos. Declaras: Private Pasada As New MiTipo[] Eso otorga una vida y visibilidad a MiTipo relativa al formulario, con lo que el FMain ni se entera. Cambia a Public Pasada As New MiTipo[] y te funcionará bien. Saludos. RE: Matriz de objetos no admite elementos nuevos - Grandamakulo - 18-03-2025 Lo de New, perfecto. Listo y funcionando. Pero lo de las matrices, sigue ocurriendo. Esto es, declaro la matriz primaria en FMain, la leo desde Form1 y la paso a la secundaria. Modifico la secundaria y, sin hacer nada más, la primaria automáticamente cambia para ser igual que la secundaria. No sé si me he explicado: FMain: A=Valor1 Form1: B=A Form1: B=Valor2 Form1: automáticamente ¡A=B! Y esto, independientemente del ámbito de B. A, claramente, debe ser pública RE: Matriz de objetos no admite elementos nuevos - Shordi - 18-03-2025 Ah... Lo había entendido al revés. Está tarde te lo miro. Después de la obligatoria siesta española, claro. Slaudos |