|
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
Mensajes - Forly
Páginas: [1]
1
« en: Martes 19 de Agosto de 2008, 21:18 »
Gracias a ambos: Segui los consejos de Eternal Idol, y me metí con las API. Como resultado logré escribir una librería "teclado.h", que si bien recién tiene 2 (dos) funciones, bastan para la lectura de teclas en modo texto.
Las dos funciones son:
1) leerTecla() -> equivalente a getch(); 2) hayTecla() -> equivalente a kbhit();
En agradecimiento a sus consejos y con el solo interés de compartir, les adjunto el código.
Nuevamente gracias.
2
« en: Martes 12 de Agosto de 2008, 17:24 »
Hola a todos:
Me he pasado del Turbo C++ de Borland a Code::Blocks.
En general me las estoy arreglando bien, pero tengo un problema con la lectura de teclas especiales como ESCAPE, las teclas de Función, Inicio, flechas y otras.
En Turbo C++, usaba algo así
//==================================================== int main() { char tecla=0; while(tecla!=27) { tecla=cin.get(); cout << tecla << " - " << (int) tecla; if (!tecla) { // En este caso la tecla es especial // Hago una segunda lectura tecla=cin.get(); cout << " --> " << tecla << " - " << (int) tecla; } cout << endl; } getchar(); return 0; } //====================================================
Pero una codificación de estas características, adaptada a la sintaxis del code::blocls, claro está, no funciona.
¿Alguien puede darme una pista de cómo hacerlo?
Desde ya les agradezco el tiempo que me dedican.
Un abrazo.
3
« en: Domingo 22 de Junio de 2008, 03:30 »
Nuevamente en tema:
Si recien comienzas con Dev C++, te recomiendo que cambies por Code::Blocks, ya que Dev C++ es un proyecto discontinuado, mientras que el Code:: Blocks, se parece bastante, es un proyecto joven, que utiliza el mismo compilador, es multi plataforma y tiene futuro.
En cuanto a comenzar con Allegro, nuevamente me permito sugerirte que lo cambies por las librerias SDL.
Son solo consejos.
Suerte
4
« en: Domingo 22 de Junio de 2008, 00:01 »
Hola: Espero que no sea demasiado tarde.
Te cuento que no existe una forma estandar de borrar la pantalla en C ni en C++.
Como te han contestado ya otros foreros, la funcion system() de la libreria stdlib.h, si es estandar, y utiliza el comando del sistema operativo para borrar la pantalla. Es no es nada portable, ya que cada sistema operativo tiene su forma particular d limpiar la pantalla.
Por otro lado, te cuento que el IDE Turbo C de Borland, no es nada estandar, y ademas solo se puede utlizar bajo sistema operativo DOS o en maquinas virtuales que lo emulen.
Como bien sabras, el DOS esta diseñado, para una plataforma Intel I8086, por lo que lo hace menos portable aun.
Sin saber por que tienes que trabajar en este entorno obsoleto, te envio una solucion que encontre para este entorno tan exclusivo y alejado de los estandares:
Espero que te sirva.
////////////////////////////////////////////////////////////////////////// // NOMBRE: clrscr() // AUTOR : Forly. // CREADA : 21/06/2008 // // ACCION: Borra la pantalla en modo texto. Es una funcion alternativa a // la funcion "clrscr()" de la libreria "conio.h" de Borland. // // Utiliza codigo ensamblador de la familia de procesadores // I8086, por lo que se transforma en una funcion NO PORTABLE. // // Funciona bien en entornos DOS y en maquinas virtuales DOS // que se ejecutan bajo las arquitecturas I8086. // // PARAMETROS: Ninguno. // RETORNOS : Ninguno. //----------------------------------------------------------------------- #include <stdio.h> #include <iostream.h>
void clrscr(void) { asm { push ax mov ah,0fh int 10h mov ah,00h int 10h pop ax } }
//------------------------------------------------------------------------ // PORCION DE main() PARA PROBAR EN TURBO C++ V.3.0 DE BORLAND. //------------------------------------------------------------------------ int main() { cout << "Esto lo escribo para que veas algo en pantalla" << endl; cout << "(presiona una tecla para continuar...)" << endl; getchar(); // Hago una pausa.
clrscr(); // Limpia la pantalla con la funcion desarrollada.
cout << "Si ves solo esto es que la funcion trabaja bien." << endl; cout << "(presiona otra tecla para terminar...)" << endl; getchar(); clrscr(); return 0; }
////////////////////////// FIN DE ARCHIVO //////////////////////////////////
Saludos
5
« en: Miércoles 28 de Mayo de 2008, 03:57 »
Muchas gracias ProfesorX por tu atención, pero creo que encontré la solución.
Les acerco un pequeño tutorial que preparé sobre como lo hice.
Espero que le sirva todos aquellos que, como yo, quieran inciarse en Code::Blocks y las SDL
6
« en: Lunes 26 de Mayo de 2008, 21:31 »
Hola a todos: Tengo un problemita. Decidí migrar de Dev-C++ a Code::Blocks, y todo anda bien, con excepción de que no puedo instalar las SDL. ¿Alguien me puede explicar cómo hacerlo?
Desde ya muchas gracias por su atención.
7
« en: Jueves 15 de Marzo de 2007, 23:47 »
Estoy casi seguro de que es BASIC, "el original", el que no era estructurado.
El primer tramo, hasta el RETURN, es un subrutina a la que se ha invocado desde algun GOSUB
saludos
8
« en: Jueves 15 de Marzo de 2007, 23:38 »
Hola a todos:
Tengo hecho un trabajo (un libro) en PowerPoint, que consta de varios archivos PPS.
La estructura del libro consta de un PPS indice, dede el que se llama a otros PPS independientes que constituyen los capitulos.
La navegacion dentro del libro se hace por medio de hipervinculos a presentaciones externas, que generan desplazamientos en todos los sentidos (desde el indice a los capitulos, dentro de los mismos capitulos, y de regreso desde los capitulos al indice).
El grupo de presentaciones fue desarrollado hace algunos años en PowerPoint 97, y siempre se ejecutó perfectamente en Windows 98.
Pero, ahora que quiero presentarlo en Windows XP, cada vez que invoco a un capitulo, este se abre en una ventana indpendiente, la que ademas no se cierra, cuando se regresa al indice. Inclusive, si uno invoca varias veces a un mismo capitulo, se abre una nueva instancia por cada una.
¿Alguno de Uds. puede explicarme a que se debe, y como puedo solucionarlo?
Desde ya muchas gracias a todos por atender mi consulta.
9
« en: Viernes 2 de Diciembre de 2005, 15:25 »
Realmente les estoy muy agradecido a todos, pero ya encontré una solución aceptable para mi trabajo, se la cuento:
1) Leo el archivo PCX con su paleta original. 2) Busco, revisando la imagen, 16 posiciones de la paleta que no hayan sido utilzadas en la imagen. 3) Reubico los primeros 16 colores en esas 16 posiciones no utilizadas. 4) Pongo en las 16 posiciones iniciales, los 16 colores básicos. (esto transforma mínimamente la imagen leida.). 5) Vuelvo a grabar el archivo PCX pero con la paleta transformada.
Hasta pronto, y nuevamente MUCHAS GRACIAS
10
« en: Lunes 14 de Noviembre de 2005, 18:32 »
Hola a todos: Estoy haciendo un editor en modo 320x200x256 (modo 13h) y he llegado a leer archivos con formato PCX.
El problema es que el formato PCX guarda la paleta de colores, y cuando cargo un archivo de este tipo me cambia la paleta de colores original, cambiándome el aspecto de todo el entorno.
Alguien conoce algún método para independizar el mapa de la paleta?.
A mí se me había ocurrido leer los valores rgb de la paleta leída y guardarlos en un archivo, pero lo que no sé cómo hacer, es poner los rgb directamente en pantalla.
Desde ya, muchas gracias a todos.
11
« en: Viernes 29 de Abril de 2005, 20:49 »
Gracias Amigos!!! En verdad les agradezco su preocupación, pero yo necesito hacerlo en ANSI C o en un C++ portable que sirva para cualquier sistema operativo. Voy a ver si le encuentro la salida por el lado del ASSEMBLER. Intentaré hacer una función en ASM y la llamaré desde C/C++. Si tengo éxito les mando una copia. Un abrazo.
12
« en: Martes 26 de Abril de 2005, 20:47 »
Gracias Amigo por tu ayuda, pero el caso es que mi intención no es usar memoria, ya que con un archivo muy voluminoso esto no resultaría.
Mi propuesta es poner un END OF FILE en el byte posterior al último registro que quiero conservar, pero justamente esto es lo que no puedo hacer.
Si el C/C++ es capaz de leer una marca de EOF, la lógica dice que si la corro de lugar, el fin de archivo cambiaría su posición.
Este es el QUID.
De todos modos te agradezco tu preocupación.
Te mando un abrazo.
13
« en: Sábado 23 de Abril de 2005, 20:17 »
Hola a todos:
Les agradecería si alguien me puede informar cómo puedo hacer para truncar un archivo a partir de un registro determinado.
Yo lo intenté escribendo en esa posición el ASCII 26 (EOF) pero no resultó.
Existe algina manera?...
Uso el Turbo C++ 3.0.
No quiero generar un archivo auxiliar sino trabajar sobre el original.
Desde ya muchas gracias por leer mi consulta.
14
« en: Miércoles 16 de Febrero de 2005, 11:34 »
Hola a todos:
SE DESLIZO UN ERROR
En la declaracion de la variable Factor
donde dice
Factor db 10
debe decir
Factor dw 10
Disculpen mi torpeza
les mando un abrazo.
15
« en: Martes 15 de Febrero de 2005, 11:26 »
Hola a todos:
Primero quiero agradecer a Amilius por haberme dado una pista de como resolver el problema.
Y... Como nobleza obliga..., ahora mando para todos los que puedan necesitarlo, el codigo con la solucion a la que pude llegar gracias a su ayuda.
Aclaro que esta compilado con TASM.
;#################################################### ; ENUNCIADO: Convertir una cadena de 4 caracteres formada por digitos ; a un numero entero. ; ; NOTA: La cadena debe ser ingresada por codigo y no debe ; ser validada. ; ;==================================================== .model SMALL
.stack
.data CadNum db '3245' ; Cadena con digitos. Entero dw 0 ; Numero entero. Factor db 10 ; Factor multiplicador.
.code INICIO: mov AX,@data ; Apuntar al segmento de datos. mov DS,AX
mov SI,offset CadNum ; Apuntar al digito mas ; significativo. CLD ; Establecer el sentido de ; de recorrido de la cadena ; de izquierda a derecha. mov CX,3 ; Poner el contador de pro- ; grama en 4. C1: mov AX,Entero ; Multiplicar el contenido mul Factor ; de Entero por 10. mov Entero,AX ; xor AX,AX ; Limpiar AX lodsb ; Leer el caracter apuntado. sub AL,30h ; Pasar de caracter a numero. add AX,Entero ; Sumar el numero resultante mov Entero,AX ; a Entero. loop C1 ; Ir a leer otro digito.
FIN: mov AH,4Ch int 21h end INICIO end ;====================================================
;#################################################################### ; ENUNCIADO: Convertir una cadena de 4 caracteres formada por digitos ; a un numero entero. ; ; NOTA: La cadena debe ser ingresada por codigo y no debe ; ser validada. ; ;==================================================================== .model SMALL
.stack
.data CadNum db '3245' Entero dw 0 Factor db 10
.code INICIO: mov AX,@data mov DS,AX
mov SI,offset CadNum ; Apuntar al digito mas ; significativo. CLD ; Establecer el sentido de ; de recorrido de la cadena ; de izquierda a derecha. mov CX,3 ; Poner el contador de pro- ; grama en 4. C1: mov AX,Entero ; Multiplicar el contenido mul Factor ; de Entero por 10. mov Entero,AX ; xor AX,AX ; Limpiar AX lodsb ; Leer el caracter apuntado. sub AL,30h ; Pasar de caracter a numero. add AX,Entero ; Sumar el numero resultante mov Entero,AX ; a Entero. loop C1 ; Ir a leer otro digito.
FIN: mov AH,4Ch int 21h end INICIO end ;====================================================
Un abrazo para todos
16
« en: Domingo 13 de Febrero de 2005, 23:21 »
Gracias Amilius:
Voy a intentarlo.
Te mando un abrazo.
17
« en: Domingo 13 de Febrero de 2005, 14:53 »
Hola Bob:
Yo también soy nuevo en estas lides, pero como lo explicó Jorje8603, para que la división resulte, siempre el divisor debe ser más pequeño que el dividendo.
Por ejemplo: DIVIDENDO DIVISOR word byte doble word word etc.
En el caso de dividendos que ocupan más de un byte, deberás poner el byte más significativo en el registro DX y el menos significativo en AX.
El resultado quedará en AX.
Espero que te sirva.
Te mando un abrazo.
18
« en: Sábado 12 de Febrero de 2005, 22:18 »
Hola a todos. Soy nuevo en este tipo de programación, y no se cómo hacer para convertir una cadena de caracteres con más de 2 digitos a un número entero.
Por ejemplo:
CadNum db '95' ; Cadena con 2 digitos. Num db 0 ; Numero entero resultado. VPos db 1 ; Valor posicional.
Esto se como hacerlo: 1) tomo el digito menos significativo de la cadena CadNum ('5') 2) lo convierto a número restándole 48 decimal. 3) multiplico el numero resultante por VPos (Valor posicional). 4) Sumo el resultado obtenido al contenido de Num. 5) Multiplico el valor posicional (VPos) por 10 decimal. 6) guardo el resultado en VPos. 7) tomo el digito siguiente y repito las operaciones desde el punto (2)
Esto que sigue no se como hacerlo
CadNum db '1234' Num dd 0 VPos qw 1
(El tema es que no entiendo cómo manejar el número resultante cuando se encuentra en dos registros - DX:AX).
¿Alguno de ustedes podría explicármelo?
Desde ya les quedo muy agradecido por dedicarme su tiempo.
19
« en: Sábado 29 de Enero de 2005, 22:56 »
Muchas Gracias ArKaNtOs. Funciona a la perfección. Te mando un abrazo.
20
« en: Sábado 29 de Enero de 2005, 16:21 »
Hola Amigo:
Yo también soy nuevo en esto del ASM. De hecho no utilizo el MASM sino el TASM para mis ejercicios.
Por otro lado, no tengo acceso al código que dices haber adjuntado.
Sin embargo, te puedo decir que el SEGMENTO DE STACK (segmento de PILA), es una porción de memoria RAM reservada para almacenar variables transitorias que utiliza el procesador durante la ejecución de los programas.
Tú también pudes hacer uso de él por intermedio de órdenes tales como PUSH o POP.
Lo importante de esto, es que lo utilices o no, es necesario reservar espacio para este tipo de segmento.
Esto lo puedes hacer con la directiva:
.STACK 100h
Para ser un poco más claro te agrego un esquema de código:
; ESTE ES UN ESQUMA DE CODIGO .model SMALL ; Declaracion del modelo de memoria
.stack ; Declaracion del segmento de pila. ; Puedes agregar el tamaño, aunque por defecto ; toma 100h
.data ; Declaracion del area de datos. Aqui se declaran ; todas las variables que vayas a usar.
.code ; Inicio del area de codigo del programa. INICIO: ; Sector de comienzo del programa.
; En este espacio van todas las instruciones de ; tu programa
end INICIO ; Aqui terminan las instrucciones.
end ; Aqui termina el programa.
Bueno Amigo, esperando que esto te ayude, te mando un abrazo.
21
« en: Sábado 29 de Enero de 2005, 15:58 »
Hola Amigos: Soy nuevo en el foro y también en la programación en Ensamblador.
Estoy intentando como un simple ejercicio emular la función clrscr() del lenguaje C.
Para ello, he optado por el uso de la interrupción INT 10h con el servicio 06h.
He probado con todas las combinaciones que vinieron a mi mente: cambios de coordenadas de ventana, cambio de fondo, etc.
Lo cierto es que, si bien en algunos casos se ha borrado la pantalla como dicen los manualesy tutoriales, en el mejor de ellos, me ha quedado el cursor en la última línea de la pantalla, y no en la primera como lo hace la función verdadera.
También he intentado reubicar el cursor después de borrar la pantalla, pero tampoco resultó.
Adujunto el archivo clrscr.asm para que lo examinen, y me sería de gran aprendizaje, si alguno de ustedes me puediera decir en qué me estoy equivocando.
De todos modos, conozcan o no la respuesta, desde ya les estoy agradecido por el tiempo que han gastado en atenderme.
Páginas: [1]
|
|
|