Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Alien-Z

#52
No es posible, QT genera código no-C++ que es traducido al estándar de C++ cuando se ejecuta la IDE de Nokia usando un Meta Object Compiler (MOC). Otras IDE's como Code::Blocks no tienen los procesos necesarios para hacer esta traducción y no consiguen compilar; pero como ha comentado eferion siempre podrías lanzar los MOC manualmente.

¿Hay alguna manera de ejecutarlos consecutivamente sin ir de uno en uno? Si, por ejemplo con guiones shell.

Un saludo.
#53
Aqui tienes un tutorial en castellano: http://javapiola.blogspot.com.es/2009/11/tutorial-de-jfilechooser.html

Si sabes inglés podrás encontrar cientos en el buscador. Un saludo.
#54
Semántica de referencia, si está todo inventado.

Un saludo.
#55
Ten en cuenta que no todos los métodos que te ha comentado eferion sirven para lo mismo, es decir, ¿podrías usar cualquiera de esos algoritmos para ordenar tu cadena? SI; ¿Es igual de eficiente? NO, cada uno sirve para un caso distinto; deberías leer al menos una descripción para saber cuál utilizar en cada aplicación.
#56
Java / Re: Problema con el inicio del programa
11 Agosto 2013, 16:30 PM
Cita de: TheFICBoss en 10 Agosto 2013, 16:12 PM
Ya encontré el fallo! No puedo declarar pz=null en el constructor de Pieza.

Saludos :D

En teoría si deberías poder inicializarlo a null, otra cosa es que luego intentes usarlo sin haberle asignado ningún valor.

Un saludo.
#57
Las ideas son el plato fuerte del día.

Primeramente, resumiendo tu proyecto: estás diseñando un compilador interpretado al estilo de java, generas código intermedio que equivaldría a los bytecodes pero en este caso para un lenguaje ensamblador. Dicho esto, ideas y anotaciones que se me ocurren:

-Puedes tomar como referencia MIPS o DLX, son lenguajes ensamblador muy completos, legibles sintácticamente hablando y programados de una manera muy eficiente; además tienes mucha documentación por internet.

-Cuando tengas avanzado el lenguaje, lo normal es que programes pequeñas aplicaciones para comprobar que todo funciona correctamente; ahora si, también debes saber que esa fase se utiliza para averiguar si hay algún dato o valor que se use repetidamente en las aplicaciones en general y así declararlo como una constante en un registro. El más común y que habremos visto todos en el 90% de lenguajes ensamblador es el famoso Registro Cero que siempre tiene el valor "0" porque resulta sobradamente útil para hacer comparaciones en bucles, copiar registros, etc.

-Quizá de las cosas más pesadas que te vas a encontrar es tratar en todas las instrucciones los espacios/tabulador y saltos de línea. Por ejemplo, has comentado que las funciones se definen del siguiente modo:

%nombredefuncion,parametro1,param...%

Instrucciones

%end nombredefuncion%


¿Y si entre la coma y el parámetro dejo un espacio?, ¿y si dejo 10 espacios?.

Esto me recuerda: ¿Al final has utilizado las expresiones regulares para el analizador léxico-sintáctico como te comenté en el otro post?, si es así no vas a tener problemas para reconocer comentarios, saltos de línea sin ningún valor para el programa, espacios seguidos, etc.

-El anterior punto es bastante importante porque cuando generes el bytecodes tienes que procurar que sea un fichero pensado únicamente para su comprensión por parte del PC (como no usa un compilador sino un compilador interpretado realmente hablamos de la máquina virtual); es decir, los comentarios, espacios, saltos de línea, y demás carácteres que solo ayudan a la legibilidad del programador deben ser eliminados al crear el fichero intermedio (bytecode u opcode), así harás el programa más ligero y rápido cuando llegue el momento en que la máquina virtual lo interprete y ejecute las instrucciones.

-¿Las instrucciones son monoformato o multiformato?.

-Has escrito algo muy importante pero un poco implícito en el mensaje, por si acaso no le has dado vueltas te lo comento para que lo tengas en cuenta: Debes organizar el lenguaje de manera que:

1- Tenga el menor número posible de instrucciones.
2- Las instrucciones realicen operaciones básicas. A partir de instrucciones aritmetico-lógicas elementales, el programador construirá otras más complejas.


Estos dos puntos harán que la ejecución de los programas creados con tu lenguaje sean 100 veces más eficientes. Como se podrán incluir librerías o API's, para mantener la eficiencia que conseguimos en el apartado anterior te recomiendo que:

1- La inlusión de estas librerías sea totalmente opcional.
2- Su especificación e implementación sea libre y cualquiera pueda ver cómo está diseñada; esto permite que un programador de tu lenguaje pueda comprobar si la manera en que está implementada la librería merece la pena incluirla o no (lleva demasiadas funciones (o tareas en ensamblador) y prefiere crear él mismo las que necesita); parece una tontería desde el punto de vista de un lenguaje de alto nivel pero estamos hablando de un lenguaje ensamblador.

-No me ha quedado claro si vas a incluir una instrucción para copiar un registro a otro, pero resultaría una operación sobrecargada, es decir, puedes hacer lo mismo con otras más básicas:

r0; <- Registro Cero
addr r2, r1, r0; <- Hemos copiado el valor de r1 en el r2


-Para intercambiar registros se puede usar un tercero que sirva de auxiliar o la pila, tampoco merece la pena crear una operación solo para eso.

Un proyecto genial, espero que vayas comentando según avances. Si se me ocurre algo más lo posteo; plantea cualquier duda que tengas.

Un saludo.



EI: juntando mensajes.


Nueva anotación:

Si aún así te da por incluir operaciones complejas existe un método para mantener la eficiencia: "pre-traductor" (no precompilador). Es un proceso que se ejecuta antes del compilador y que se dedica a traducir las operaciones complejas a otras más elementales. Por ejemplo, el programador diseña el siguiente código:

addr r2, r1, r3
sub r2, r4, r5
operacion_compleja
addr r2, r1, r3


Antes de que se ejecute el compilador un proceso debe traducir la operación a su equivalente en instrucciones básicas:

addr r2, r1, r3
sub r2, r4, r5
addr r0, r1, r4 //operacion_elemental 1
setr r0, 8 //operacion_elemental 2
... //operacion elemental x
addr r2, r1, r3


Seguro que te suena esto y resulta que se trata de la extensión que pones en la consola de comandos cuando quieres ejecutar un compilador de ensamblador para que aplique ténicas como: desenrrollado de bucles, intercambio de iteraciones, arrays combinados, etc. aunque lo que te he comentado mucho más sencillo que cualquiera de estas.

Ya nos dirás qué camino has seguido en tu proyecto. Un saludo.
#58
Se puede hacer más sencillo y eficiente.

1- Inicializa las posiciones del array a -1.
2- Crea un bucle que vaya generando números aleatorios y tenga como condición de continuación "while(V[5] == -1)", es decir, mientras no hayamos conseguido el último número aleatorio.
3- Dentro debe haber otro bucle anidado que, después de generar un número aleatorio, recorra el array comprobando que no lo tengas ya, si no lo tienes lo guarda en la siguiente posición y comienza una nueva iteración del bucle principal.

Tu código tiene 3 errores sintácticos:

Código (java) [Seleccionar]
V=1+rand()%(50-1);
Debes señalar a qué posición del array V quieres acceder.

Código (java) [Seleccionar]
if (V==V[j]) rep=1;
Aqui lo mismo.

Código (java) [Seleccionar]
}while(rep=1)
Los bucles do-while llevan un punto y coma ";" al final.

Un saludo.
#59
Miky Gonzalez:

Estás planteando uno de los tres grandes aspectos necesarios para programar un compilador:

1-Analizador Léxico
2-Analizador Sintáctico
3-Analizador Semántico

Se suelen utilizar otros métodos que harían tu aplicación más eficiente y cómoda de programar, pero usando lenguajes de alto nivel también es posible con las Expresiones Regulares, busca información sobre ello, es la herramienta clave para el analizador léxico.

Esto que planteas es un tema muy interesante, en la universidad tuve que dar una asignatura cuatrimestral solo para poder diseñar un compilador que analizara instrucciones básicas de lenguajes imperativos, en cambio los compiladores para lenguajes de programación orientados a objetos son otro mundo.

Un saludo.
#60
Procura no usar librerías basura como "conio.h".

Iostream es la librería de entrada y salida (Input Output Stream) de C++, no hay que añadir ".h" al final para incluirla como se haría en C donde es necesario indicar que se trata de la cabecera.

Un saludo.