Autor
|
Tema: Generar lista evitando ", " al inicio sin repetir code. (Leído 5,071 veces)
|
Tachikomaia
Desconectado
Mensajes: 1.224
Superhacker (es broma xD )
|
Tengo un programa que en resumen hace esto: ListasegunGeneracion = ""; Repetir: // Generar N. ListasegunGeneracion = ListasegunGeneracion+", "+N; Y el resultado final es: , 0, 33, 16, etc. Es decir inicia con ", " al inicio. ¿Es posible mejorarlo? En cierto punto podría borrar esa parte, pero me pregunto si es posible sin usar ese "parche". Otro modo sería que el 1er N se generara de otro modo, o poner un if para que si es el 1er N se haga ListasegunGeneracion = N ...pero eso implica "repetir código", es decir, hacer casi lo mismo por sólo 1 caso, o poner un if que será chequeado muchas veces cuando sabemos que lo suyo sólo se aplicaría en el 1er caso. Quisiera saber si hay una mejor solución a eso. GPT no entendió lo que dije al final: Sí, es posible mejorar el programa para evitar la necesidad de eliminar la parte inicial ", " después de generar la lista. Una forma de hacerlo es utilizando un enfoque condicional para agregar la coma solo cuando sea necesario.
Aquí hay una sugerencia de cómo podría ser el programa mejorado:
``` ListasegunGeneracion = ""; Repetir: // Generar N. si ListasegunGeneracion está vacía: ListasegunGeneracion = N; en caso contrario: ListasegunGeneracion = ListasegunGeneracion + ", " + N; ```
En este caso, se verifica si `ListasegunGeneracion` está vacía antes de agregar el valor `N`. Si la lista está vacía, se asigna el valor directamente sin agregar la coma. De lo contrario, se agrega la coma y luego el valor `N`.
De esta manera, no es necesario eliminar la parte inicial ", " después de generar la lista y se evita repetir código o usar condicionales innecesarios para el primer caso.
|
|
|
En línea
|
|
|
|
profinet
Desconectado
Mensajes: 30
|
Te sugiero emplear un operador ternario en esta situación. La operación ternaria es atómica, ejecutándose como una única operación, y suele ser más eficiente que un bloque if-else, especialmente cuando la condición es simple. No obstante, es importante tener en cuenta que los compiladores tienden a optimizar el código durante la traducción a código máquina, por lo que generalmente no hay necesidad de preocuparse por el rendimiento en este contexto. Si ListasegunGeneracion es un arreglo de caracteres, podrías implementar esto en C de la siguiente manera: #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <stdbool.h> #include <string.h>
int main() {
int16_t N; bool cond = true; char charN[6]; // Ajustar el tamaño para manejar números de hasta 5 dígitos y el carácter nulo
// Reservar memoria para la cadena char * ListasegunGeneracion = (char * ) malloc(1);
// Calcular N // ...
// Inicializar la cadena vacía ListasegunGeneracion[0] = '\0';
// Generar la lista while (cond) { // Ajustar el tamaño de la cadena ListasegunGeneracion = realloc(ListasegunGeneracion, strlen(ListasegunGeneracion) + sizeof(charN) + 1);
// Agregar la coma y el número a la cadena snprintf(charN, sizeof(charN), "%d", N); strcat(ListasegunGeneracion, (N > 0) ? ", " : ""); // Operador ternario strcat(ListasegunGeneracion, charN);
// Modificar condición o establecer un punto de salida, de lo contrario, habrá un bucle infinito // Aquí deberías modificar 'cond' o agregar una sentencia 'break' en algún momento. }
// Imprimir la cadena final printf("%s\n", ListasegunGeneracion);
// Liberar la memoria free(ListasegunGeneracion);
return 0; }
|
|
|
En línea
|
Don't shy away from the terminal; embrace it! In the GNU world, everything is a file.
|
|
|
EdePC
|
Supongo que lo más sencillo sería quitar los dos primeros caracteres (coma+espacio) al final, siempre y cuando se sepa la cantidad de caracteres a quitar no debería haber problemas // Agrega 5 números generados var ListaSegunGeneracion = ""; for (var i = 0; i < 5; i++) { ListaSegunGeneracion += ", " + GenerarN(); } // Imprime la String pero le quita los dos primeros caracteres trace(ListaSegunGeneracion.substring(2)); stop(); // Genera un número aleatorio entre 1 y 100 inclusive function GenerarN() { return Math.ceil(Math.random(100)*100); }
Otra opción interesante es usar un Array que ya tiene métodos para unir (join) sus elementos especificando un separador, en tu caso una coma+espacio, así solo se colocarían donde deben, por ejemplo: var ListaSegunGeneracion = new Array(); // Agrega 5 números generados al Array for (var i = 0; i <5; i++) { ListaSegunGeneracion[i] = GenerarN(); } // Imprime el Array como String unidos por coma+espacio trace(ListaSegunGeneracion.join(", ")); stop(); // Genera un número aleatorio entre 1 y 100 inclusive function GenerarN() { return Math.ceil(Math.random(100)*100); }
NOTA: todos mis ejemplos están basados en ActionScript 2 y mínimo Flash 5, versiones anteriores serían extremadamente antiguas
|
|
|
En línea
|
|
|
|
Tachikomaia
Desconectado
Mensajes: 1.224
Superhacker (es broma xD )
|
profinet yo no sé lenguaje tan técnico. Te sugiero emplear un operador ternario en esta situación. La operación ternaria es atómica, ejecutándose como una única operación, y suele ser más eficiente que un bloque if-else, especialmente cuando la condición es simple. https://lenguajejs.com/fundamentos/estructuras-de-control/operador-ternario/No me sirve, es casi como un if. Según vi en tu código haces eso. Además no uso arrays.
|
|
|
En línea
|
|
|
|
profinet
Desconectado
Mensajes: 30
|
Si he comprendido correctamente, estás indagando sobre la manera más eficiente de ejecutar código. En ese caso, si prefieres evitar el uso de una estructura if-else, la opción más eficiente, especialmente para operaciones simples, sería emplear un operador ternario. No son, como mencionaste, "casi lo mismo". Permíteme demostrarte la diferencia. He escrito los siguientes códigos de pruebas: # Código 1 void hal_entry(void) {
volatile uint32_t seed, randNumm; volatile bool isGreater; SysTick_Config(SystemCoreClock / 960);
while (true) { seed = (_ulTickCount * 1664525 + 1013904223) % 4294967296; randNumm = seed % (10 - 2 + 1) + 2;
if (randNumm >= 5) { isGreater = true; } else { isGreater = false; } } }
Este código realiza las siguientes operaciones: - Inicializa el contador de pulsos de un microcontrolador basado en ARM Cortex-M. - Genera un número aleatorio acotado entre 2 y 10. - Comprueba si el número obtenido es mayor o igual a 5 y actualiza una flag en consecuencia. Al examinar el desensamblado de la instrucción condicional, se revela lo siguiente: 115 if (randNumm >= 5) { 00001084: ldr r3, [sp, #12] ; Load the value of randNumm from the stack into register r3 00001086: cmp r3, #4 ; Compare the value in r3 (randNumm) with 4 116 isGreater = true; ; Set isGreater to true if the condition is met 00001088: ite hi ; Conditional (IT) block, executing based on "If Higher" logic 0000108a: strbhi.w r4, [sp, #7] ; Store 1 in memory at [sp + #7] if the condition is true (hi) 118 isGreater = false; ; Set isGreater to false if the condition is not met 0000108e: strbls.w r5, [sp, #7] ; Store 0 in memory at [sp + #7] if the condition is false (ls) 00001092: b.n 0x106a <hal_entry()+58> ; Branch to the specified address (conditional, not taken if the condition is false)
- Se extrae el valor de randNumm del stack y se almacena en el registro r3. - Se realiza una comparación para verificar si el valor en r3 es mayor que 4: - Si la afirmación es verdadera, se guarda el valor de r4 (1) en [sp +#7]. - En caso contrario, se guarda el valor de r5 (0) en [sp +#7]. - Se realiza un salto a la dirección de memoria 0x106a si el resultado de la comparación es verdadero. # Código 2 void hal_entry(void) {
volatile uint32_t seed, randNumm; volatile bool isGreater; SysTick_Config(SystemCoreClock / 960);
while (true) { seed = (_ulTickCount * 1664525 + 1013904223) % 4294967296; randNumm = seed % (10 - 2 + 1) + 2; isGreater = (randNumm >= 5) ? true : false; } }
Este ejecuta la misma lógica que el código 1, pero usando un operador ternario. Si nos vamos a su código ensamblador, vemos que: 113 isGreater = (randNumm >= 5) ? true : false; 00001080: ldr r3, [sp, #12] ; Load the value of randNumm from the stack into register r3 00001082: cmp r3, #4 ; Compare the value in r3 (randNumm) with 4 00001084: ite ls ; Conditional IT block, executing based on "If Lower or Same" logic 00001086: movls r3, #0 ; If less than or equal to 4 (ls condition), set r3 to 0 00001088: movhi r3, #1 ; If greater than 4 (hi condition), set r3 to 1 0000108a: strb.w r3, [sp, #7] ; Store the result in the memory at [sp + #7]
- Se recupera el valor de randNumm desde el stack y se almacena en el registro r3. - Se compara el valor de r3 con 4: - Si es menor o igual, se asigna 0 a r3. - Si es mayor, se asigna 1 a r3. - Se guarda el valor actualizado de r3 en la posición de memoria [sp, #7]. En términos de eficiencia, el segundo bloque de código sobresale por varias razones: - Simplicidad: En el segundo bloque, el valor de isGreater se asigna directamente, simplificando la lógica del código. - Menor número de saltos: Mientras que el primer bloque utiliza dos instrucciones de salto condicional (ite, strbhi.w, y strbls.w), el segundo bloque se limita a una sola instrucción (it y strb.w), reduciendo la complejidad y el consumo de recursos. - Eliminación de redundancia: En el segundo bloque, se utiliza el mismo registro r3 de manera consistente, a diferencia del primer bloque que emplea los registros r3, r4 y r5. Esto elimina la necesidad de instrucciones adicionales para cambiar el valor de isGreater después de la comparación, como se evidencia en el primer bloque. No obstante, es importante señalar que las optimizaciones del compilador pueden atenuar las diferencias prácticas entre ambas implementaciones. De modo que declaré las variables como volátiles para evitar estas optimizaciones, permitiendo una evaluación más precisa del rendimiento.
|
|
« Última modificación: 23 Noviembre 2023, 13:42 pm por profinet »
|
En línea
|
Don't shy away from the terminal; embrace it! In the GNU world, everything is a file.
|
|
|
Serapis
|
Es sencillo..
Crea primero el primer elemento, por ejemplo: 'a' Luego el resto ',b,c,d...'
|
|
|
En línea
|
|
|
|
Tachikomaia
Desconectado
Mensajes: 1.224
Superhacker (es broma xD )
|
EdePC: Bien, me funcionó esto que me dijiste: String.substr Sintaxis
myString.substr(inicio, longitud); Argumentos
inicio Un número entero que indica la posición del primer carácter de la subcadena que se está creando. Si inicio es un número negativo, el punto inicial se determina desde el final de la matriz, donde -1 es el último carácter.
longitud El número de caracteres en la subcadena que se está creando. Si no se especifica longitud, la subcadena incluye todos los caracteres desde el inicio al final de la cadena.
Descripción
Método; devuelve los caracteres de una cadena desde el índice especificado en el argumento inicio, hasta el número de caracteres especificados en el argumento longitud.
Reproductor
Flash 5 o posterior. Pensaba probar algo de eso. Para mí eso es medio confuso porque le llaman "borrar" creo pero no es que borre desde el caracter 2 en este caso, sino que genera una cadena desde el caracter 2. Sería más claro si por ejemplo le llamaran take o get (from, until). Los arrays no me gustan, no sé, mañas mías xD todos mis ejemplos están basados en ActionScript 2 y mínimo Flash 5, versiones anteriores serían extremadamente antiguas Ah, ya que sabes del tema, y suponiendo que te refieres a Macromedia Flash 5, no el de Adobe (creo que es CS5). ¿MF5 usa AS2 entonces? Te pregunto porque sé que en cierto punto salió el AS3, pero nunca supe cual uso, que yo sepa no dice "es AS2", además en cada nueva versión de Flash agregaron/quitaron cosas, por lo que yo en el fondo dudo que existan sólo 3 versiones de AS... Ojo con eso.
|
|
« Última modificación: 25 Noviembre 2023, 07:17 am por Tachikomaia »
|
En línea
|
|
|
|
MCKSys Argentina
|
Hola! Ah, ya que sabes del tema, y suponiendo que te refieres a Macromedia Flash 5, no el de Adobe (creo que es CS5). ¿MF5 usa AS2 entonces? Te pregunto porque sé que en cierto punto salió el AS3, pero nunca supe cual uso, que yo sepa no dice "es AS2", además en cada nueva versión de Flash agregaron/quitaron cosas, por lo que yo en el fondo dudo que existan sólo 3 versiones de AS... Ojo con eso.
Wikipedia lo explica sencillo (revisa el apartado Timeline by player version): https://en.wikipedia.org/wiki/ActionScriptAS1 nace con Flash5. AS2 nace con Flash 7 y mejora con Flash 8. AS3 nace con Flash 9 (inicialmente llamado Flash 8.5) y, aparte, el producto cambia a llamarse Adobe Flash Player (No es más de Macromedia). Saludos!
|
|
|
En línea
|
MCKSys Argentina "Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."
|
|
|
EdePC
|
EdePC: 1. Bien, me funcionó esto que me dijiste: Pensaba probar algo de eso. Para mí eso es medio confuso porque le llaman "borrar" creo pero no es que borre desde el caracter 2 en este caso, sino que genera una cadena desde el caracter 2. Sería más claro si por ejemplo le llamaran take o get (from, until).
2. Los arrays no me gustan, no sé, mañas mías xD
3. Ah, ya que sabes del tema, y suponiendo que te refieres a Macromedia Flash 5, no el de Adobe (creo que es CS5). ¿MF5 usa AS2 entonces? Te pregunto porque sé que en cierto punto salió el AS3, pero nunca supe cual uso, que yo sepa no dice "es AS2", además en cada nueva versión de Flash agregaron/quitaron cosas, por lo que yo en el fondo dudo que existan sólo 3 versiones de AS... Ojo con eso.
1. Exacto, la variable original no se modifica, sino que se toma su valor, se le hacen modificaciones en memoria y eso es lo que devuelve, ya dependerá de cada uno que hacer con ese valor devuelto, si se sobreescribe la variable original o simplemente se lo usa para mostrar, o trabajarla aparte como una copia modificada 2. Sería buena idea aprender a usarlos porque están presentes en prácticamente todos los lenguaje de programación y da una mínima introducción a objetos y propiedades, en ActionScript 2.0 ya se pueden usar Clases que se asemejan más a la programación orientada a objetos de los lenguajes comunes, en ActionScript 1.0 también se puede implementar algo similar pero ya es un poquito más raro XD 3. En resumen con respecto a ese rango de versiones sería así: Macromedia Flash 4.0, junio de 1999, Flash Player 4 Macromedia Flash 5.0, agosto de 2000, ActionScript 1.0, Flash Player 5 Macromedia Flash MX, marzo de 2002, ActionScript 1.0, Flash Player 6 Macromedia Flash MX 2004, septiembre de 2003, ActionScript 1.0 y 2.0, Flash Player 7 Como tienes Macromedia Flash 5.0 tienes disponible ActionScript 1.0 y Flash Player 5. Por un lado está el Programa en si (Macromedia Flash) y sus capacidades, luego el Lenguaje de Programación (ActionScript) y al final el Reproductor (Flash Player) que ejecutará/mostrará lo que has programado/escenificado (swf).
|
|
|
En línea
|
|
|
|
Tachikomaia
Desconectado
Mensajes: 1.224
Superhacker (es broma xD )
|
profinet: Aunque un operador ternario fuese más eficiente como dices, estás haciendo varias comprobaciones por algo que sabemos a priori que sólo se aplicará en el 1er caso, por eso tampoco me sirve. Crea primero el primer elemento, por ejemplo: 'a' Luego el resto ',b,c,d...'
Sí, pero resumí o simplifiqué demasiado el problema, si hago eso repito código creo, tengo esto (no quise postearlo porque es complicado de entender/explicar): Escena 1 actions for fotograma 1 function ChequearCandidato () { C = String(N).charat(N); trace (N+" resulta "+C); if (C == 0) { if (Solfor0 == undefined) { Solfor0 = N; } } else if (C == -9) { if (Solfor9 == undefined) { Solfor9 = N; } } else if (C == 4.5) { if (Solfor4 == undefined) { Solfor4 = N; } } else if (C == -7.2) { if (Solfor7 == undefined) { Solfor7 = N; } } ListasegunGeneracion = ListasegunGeneracion+", "+N; } MinN = 0; MaxN = 33; Rango = MaxN-MinN+1; MenoroMayor = -1; ListPart1 = MinN; ListPart2 = MaxN; ListParts = 2; N = MinN-MaxN; ListasegunGeneracion = ""; do { N = N+MaxN; ChequearCandidato(); } while (N != MaxN); Mayordistancia = 0; Puntero = ListParts; Lista = ""; actions for fotograma 2 Distancia = eval("ListPart"+Puntero)-eval("ListPart"+(Puntero-1)); if (MenoroMayor == -1) { if (Distancia == Mayordistancia) { NElegido = Puntero; CambiarMenoroMayor = "Sí"; } else if (Distancia>Mayordistancia) { NElegido = Puntero; Mayordistancia = Distancia; CambiarMenoroMayor = "No"; } } else if (Distancia == Mayordistancia) { CambiarMenoroMayor = "Sí"; } else if (Distancia>Mayordistancia) { NElegido = Puntero; Mayordistancia = Distancia; CambiarMenoroMayor = "No"; } Puntero = Puntero-1; actions for fotograma 3 if (Puntero>1) { gotoAndPlay (2); } else { if (MenoroMayor == -1) { N = Math.floor((eval("ListPart"+NElegido)+eval("ListPart"+(NElegido-1)))/2); } else { N = Math.ceil((eval("ListPart"+NElegido)+eval("ListPart"+(NElegido-1)))/2); } ChequearCandidato(); Lista = ""; } actions for fotograma 5 if (N<eval("ListPart"+Puntero)) { Saver = eval("ListPart"+Puntero); set ("ListPart"+Puntero, N); Lista = Lista+", "+N; N = Saver; } else { Puntero = Puntero+1; Lista = Lista+", "+eval("ListPart"+(Puntero-1)); gotoAndPlay (4); } actions for fotograma 7 if (Puntero == ListParts) { ListParts = ListParts+1; // Sólo falta correr al último elemento. set ("ListPart"+ListParts, N); // ¿Se analizaron todos los números del rango? if (Rango == ListParts) { // Sí, mostrar los Ns que cumplen la condición y finalizar. if (Solfor0 != undefined) { trace ("Para que C sea 0 usar N: "+Solfor0); } if (Solfor9 != undefined) { trace ("Para que C sea -9 usar N: "+Solfor9); } if (Solfor4 != undefined) { trace ("Para que C sea 4.5 usar N: "+Solfor4); } if (Solfor7 != undefined) { trace ("Para que C sea -7.2 usar N: "+Solfor7); } ListasegunGeneracion = ListasegunGeneracion.substring(2); stop (); } else { // Analizar otro N. if (CambiarMenoroMayor == "Sí") { MenoroMayor = MenoroMayor*-1; CambiarMenoroMayor = "No"; } Mayordistancia = 0; Puntero = ListParts; Lista = ""; gotoAndPlay (2); } } else { Puntero = Puntero+1; // Correr hacia el final a las partes de la lista. Saver = eval("ListPart"+Puntero); set ("ListPart"+Puntero, N); Lista = Lista+", "+N; N = Saver; gotoAndPlay (6); }
Básicamente es como si se fuese a crear una lista de números del 0 al 33 pero en un orden especial. El número se agrega a la lista (ListasegunGeneracion) mediante la función del frame 1. Si el 1er número se agregara de distinta manera, eso que hace la función tendría que copiarlo para ese caso particular, cambiando sólo 1 cosa. Eso es repetición de código, todo igual excepto 1 cosa, por eso no quería hacer eso. Esto: actions for fotograma 1 function ChequearCandidato () { C = String(N).charat(N); trace (N+" resulta "+C); if (C == 0) { if (Solfor0 == undefined) { Solfor0 = N; } } else if (C == -9) { if (Solfor9 == undefined) { Solfor9 = N; } } else if (C == 4.5) { if (Solfor4 == undefined) { Solfor4 = N; } } else if (C == -7.2) { if (Solfor7 == undefined) { Solfor7 = N; } } ListasegunGeneracion = ListasegunGeneracion+", "+N; } MinN = 0; MaxN = 33; Rango = MaxN-MinN+1; MenoroMayor = -1; ListPart1 = MinN; ListPart2 = MaxN; ListParts = 2; N = MinN-MaxN; ListasegunGeneracion = ""; do { N = N+MaxN; ChequearCandidato(); } while (N != MaxN);
Con tu método tendría que hacerlo así: actions for fotograma 1 function ChequearCandidato () { C = String(N).charat(N); trace (N+" resulta "+C); if (C == 0) { if (Solfor0 == undefined) { Solfor0 = N; } } else if (C == -9) { if (Solfor9 == undefined) { Solfor9 = N; } } else if (C == 4.5) { if (Solfor4 == undefined) { Solfor4 = N; } } else if (C == -7.2) { if (Solfor7 == undefined) { Solfor7 = N; } } ListasegunGeneracion = ListasegunGeneracion+", "+N; } MinN = 0; MaxN = 33; Rango = MaxN-MinN+1; MenoroMayor = -1; ListPart1 = MinN; ListPart2 = MaxN; ListParts = 2; C = String(MinN).charat(MinN); trace (MinN+" resulta "+C); if (C == 0) { if (Solfor0 == undefined) { Solfor0 = MinN; } } else if (C == -9) { if (Solfor9 == undefined) { Solfor9 = MinN; } } else if (C == 4.5) { if (Solfor4 == undefined) { Solfor4 = MinN; } } else if (C == -7.2) { if (Solfor7 == undefined) { Solfor7 = MinN; } } ListasegunGeneracion = MinN; N = MaxN; ChequearCandidato();
También podría quitar esto de la función: ListasegunGeneracion = ListasegunGeneracion+", "+N Y ponerlo fuera de ella en todos los casos menos en el 1ero, como has dicho, no estoy seguro de cómo quedaría, algo así: Escena 1 actions for fotograma 1 function ChequearCandidato () { C = String(N).charat(N); trace (N+" resulta "+C); if (C == 0) { if (Solfor0 == undefined) { Solfor0 = N; } } else if (C == -9) { if (Solfor9 == undefined) { Solfor9 = N; } } else if (C == 4.5) { if (Solfor4 == undefined) { Solfor4 = N; } } else if (C == -7.2) { if (Solfor7 == undefined) { Solfor7 = N; } } } MinN = 0; MaxN = 33; Rango = MaxN-MinN+1; MenoroMayor = -1; ListPart1 = MinN; ListPart2 = MaxN; ListParts = 2; N = MinN-MaxN; do { N = N+MaxN; ChequearCandidato(); } while (N != MaxN); ListasegunGeneracion = MinN+", "+MaxN; Mayordistancia = 0; Puntero = ListParts; Lista = ""; actions for fotograma 2 Distancia = eval("ListPart"+Puntero)-eval("ListPart"+(Puntero-1)); if (MenoroMayor == -1) { if (Distancia == Mayordistancia) { NElegido = Puntero; CambiarMenoroMayor = "Sí"; } else if (Distancia>Mayordistancia) { NElegido = Puntero; Mayordistancia = Distancia; CambiarMenoroMayor = "No"; } } else if (Distancia == Mayordistancia) { CambiarMenoroMayor = "Sí"; } else if (Distancia>Mayordistancia) { NElegido = Puntero; Mayordistancia = Distancia; CambiarMenoroMayor = "No"; } Puntero = Puntero-1; actions for fotograma 3 if (Puntero>1) { gotoAndPlay (2); } else { if (MenoroMayor == -1) { N = Math.floor((eval("ListPart"+NElegido)+eval("ListPart"+(NElegido-1)))/2); } else { N = Math.ceil((eval("ListPart"+NElegido)+eval("ListPart"+(NElegido-1)))/2); } ChequearCandidato(); ListasegunGeneracion = ListasegunGeneracion+", "+N Lista = ""; } // El resto no cambia, sólo se quita el substring que me dijo EdePC.
Sí, es mejor, pero sirve porque la función sólo se ejecuta en 2 frames: En el 1 cuando la lista se genera distinto, y en el frame 3 donde se genera "normal". Si la función se ejecutara más veces esa línea de código que estaba dentro habría que repetirla fuera varias veces, pensé que ocurriría eso, por eso no me parecía buena idea. Bueno, no era lo que esperaba pero le doy solucionado al tema porque efectivamente lo solucionó. Pero sigo respondiendo otro día.
|
|
« Última modificación: 27 Noviembre 2023, 04:38 am por Tachikomaia »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
recursos visual basic, """"""proceso inmortal"""""
Análisis y Diseño de Malware
|
Dark4ngel
|
7
|
13,306
|
3 Noviembre 2011, 10:42 am
por Dark4ngel
|
|
|
[C++][?]Code::blocks + wxformbuilder "generate code error"
Programación C/C++
|
vitoafk
|
0
|
1,725
|
2 Octubre 2015, 04:06 am
por vitoafk
|
|
|
MOVIDO: Ayuda a crear en visual basic "Generar Enlace"
Programación C/C++
|
Eternal Idol
|
0
|
1,341
|
3 Enero 2016, 00:05 am
por Eternal Idol
|
|
|
lenguaje c cargar "clientes" sin repetir
Programación C/C++
|
darkwilly08
|
0
|
1,133
|
20 Marzo 2016, 22:06 pm
por darkwilly08
|
|
|
Generar Tique-Factura (Comprobante "A") con Epson TM220-U220
.NET (C#, VB.NET, ASP)
|
IvanDev
|
1
|
2,495
|
25 Agosto 2017, 04:58 am
por IvanDev
|
|