|
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 - Amilius
Páginas: 1 ... 5 6 [7] 8 9 ... 27
151
« en: Lunes 29 de Mayo de 2006, 20:05 »
Bueno, eso depende de que OS hablamos. Supongo que lo vas hacer por UDP. includ <sys/sockets.h> int socket(int family, int type, int protocol) ... int closesocket(int socket) Bueno era algo asi, no se de C++, pero tienes que saber en que OS, porque no todas son compatibles con la de BSD libnet http://en.wikipedia.org/wiki/Berkeley_socakets Por UDP es más complicado por que no te asegura que los datagramas lleguen en orden ni que todos lleguen. Generalmente usando UDP envian informacion que se desactualiza constantemente, como la posición de un objeto cuando se esta moviendo. Si el datagrama no llega en orden entonces es informacion caduca y se tiene que desechar por que antes llego otra informacion más actual. Pero si el objeto se detiene es mejor asegurar que ese mensaje si llege a todos y en el orden correcto. Por esto te recomendaria que comiences con TCP y luego si lo ves necesario optimizas usando en parte UDP para algunas cosas.
152
« en: Lunes 29 de Mayo de 2006, 19:58 »
Busca un código de un ejemplo de chat por TCP/IP basado en un servidor central, es decir todos los mensajes van primero al servidor y luego a las máquinas de los usuarios.
Luego tienes que definir prefijos para tus comandos, cada comando debe tener un prefijo distinto y debe tener una longitud fija. Si necesitas enviar informacion de longitud variable indica la cantidad de bytes previamente.
Por ejemplo:
cNXXXXYYYYZZZZ
Podría significar las coordenadas "c" de un tanque "N", 3 numeros en punto flotante de simple precisión (cada letra corresponderia a un byte y tendrias que enviar y recibir arreglos de bytes).
Y esto: dN
Podria significar que el tanque N hace un disparo.
Tienes que agregar además un buffer de recepción y procesar los mensajes a medida que se completan por que te puede llegar todo junto como:
cNXXXXYYYYZZZZdNdNdNcNXXXXYYYYZZZZ
Asi que tu codigo tiene que saber separar cada mensaje, sabiendo que cada uno tiene un prefijo único y una longitud fija es mejor.
Pero tambien te puede llegar esto:
cNXXXXYY
y luego recien el resto:
YYZZZZdNdNdNcNXXXXYYYYZZZZ
Asi que también tienes que poder reconocer cuando aún no ha llegado todo el mensaje y tienes que esperar hasta que este completo. Una forma fácil es verificar que la cantidad de bytes que tienes en el buffer es mayor o igual a la longitud del mensaje actual que estas procesando.
153
« en: Lunes 22 de Mayo de 2006, 23:20 »
Eso tienes que buscarlo en la ayuda del compilador más que en manuales del lenguaje. El tipo real es un flotante de 6 bytes, muy lento de procesar y no es recomendado usarlo. Los estándares son de 4(single) y 8(double) bytes.... lo que no recuerdo es si el pascal soporta ambos o solo el de 4 bytes... Hay que considerar que los antiguos compiladores de pascal salieron antes que los coprocesadores matemáticos sean comunes y vinieran en paquete junto al procesador. En pascal shortint es entero con signo de 8 bits... si la memoria no me falla... El longint es entero con signo de 32 bits. Ese si recuerdo. :roll: En realidad siempre es mejor revisar la documentacion de compilador para tipos ordinales. Estas cosas varian de compilador a compilador. Por ejemplo en un compilador de 16 bits un tipo integer es de 16 bits, pero si es compilador de 32 bits un tipo integer es de 32 bits. De todos modos en la ayuda biene una muy buena descripcion de cada tipo y de sus límites, incluyendo precisión en el caso de los tipos punto flotante.
154
« en: Lunes 15 de Mayo de 2006, 18:12 »
Filtra todos los caracteres cuya funcionalidad no deseas alterar. Los detectas con un if y sales inmediatamente, evitando destruir el Key al ponerlo en 0.
155
« en: Domingo 14 de Mayo de 2006, 22:57 »
Pero necesita saber que buscar en google... "backpropagation" "Logistic Equation" Básicamente la complejidad radica en diseñarlas de forma que sean de utilidad, que reciban la información pertinente y sobre todo completa y por supuesto el gran problema de entrenarlas. Luego que están diseñadas y entrenadas su funcionamiento no es complicado y "vuelo de pájaro" basta una multiplicacion por dendrita, una sumatoria por neurona y aplicar una funcion que simule el axon a la sumatoria que generalmente es la función logística por la conveniencia que supone al momento de entrenar la red neuronal. Lo realmente complicado es hacer que aprendan, es decir minimizar el error en sus resultados. Para esto hay que cuantificar el error y propagarlo hacia atrás para tener idea de cuales sinapsis de neuronas deben ser corregidas, y tener idea de en que medida. Eso se hace con un algoritmo de "backpropagation". http://www.cse.unsw.edu.au/~billw/cs9414/n...p/backprop.htmlhttp://www.bedaux.net/nnet/http://www.willamette.edu/~gorr/classes/cs449/intro.html
156
« en: Domingo 14 de Mayo de 2006, 22:33 »
Lo más directo es un arreglo de bytes de unos 512, con onkeydown colocas en 1 y con onkeyup en 0, inicialmente todo en 0. Luego lees el estado de la matriz desde donde quieras. Ojo que muchas combinaciones de teclas bloquean a otras, por ejemplo no puedes hacer que los cuatro cursores estén presionados al mismo tiempo, por lo menos en mi teclado. Grave problema para jugar Mortal Kombat en un solo teclado.
157
« en: Jueves 11 de Mayo de 2006, 01:53 »
Belleza de menús y belleza de código.
158
« en: Lunes 8 de Mayo de 2006, 03:32 »
Usa OnKeypress si te interesa saber el caracter traducido por la configuración regional, por ejemplo "á" "ü", sirve de mucho para evitar que introduzcan caracteres que no deseamos en un formulario. Usa Onkeydown/up si te interesa saber el código te tecla que presiono el usuario sin ser traducido si es el caso. Sirve más que todo para capturar teclas especiales que no disparan el evento onkeypress y desde luego para juegos. Para formar una "á" tienes que presionar 2 teclas que disparan sólo un evento "OnKeyPress", pero disparan 2 eventos onKeyDown con sus respectivos onKeyUp.
159
« en: Lunes 8 de Mayo de 2006, 02:46 »
En realidad esa asignación no libera memoria, sólo es una asignación de un valor a una variable.
La liberación de memoria ocurre DESPUES de ejecutar el código del evento OnClose: Se revisa el valor de esa variable y si es el caso se procede a liberar la memoria utilizada por el formulario, OJO que antes de esto se llama al evento onDestroy para que puedas liberar la memoria que reservaste por tu cuenta y luego procede a liberar la memoria de los controles "hijos" que tiene el formulario en cascada (botones, edits, etc.) llamando a cada respectivo destructor que a su vez se encarga de llamar a otros hasta que todo el proceso termine al final con la destrucción (liberación de la memoria) del formulario padre.
Asi que no importa donde pongas la asignación, sólo es para avisar que lo que quieres es cerrar y además destruir el formulario.
160
« en: Sábado 6 de Mayo de 2006, 23:28 »
Hemos creado la ventana con el asistente y no encontramos esa funcion en niguno de los archivos del proyecto, donde está escrita esta funcion para poder modificarla o donde deberiamos escribirla para poder eliminar esa barra. Gracias. Es que estas usando un RAD y eso lo puedes configurar usando el panel de propiedades del formulario, generalmente alguna propiedad "borde del formulario". Como estas usando un RAD para desarrollar tu aplicación tienes esas facilidades asi que no esperes ver directamente llamadas a la API de windows.
161
« en: Sábado 6 de Mayo de 2006, 23:21 »
Pues claro que es necesario liberar la memoria y mejor si es justo después que ya no se necesita más.
Existe una herramienta para delphi llamada "MemProof" que te permite saber si al finalizar el programa quedaron algunos punteros "vivos", es decir que no liberaste memoria.
Si no notaste "memory leaks" aparentes es por que Delphi tiene un sistema que optimiza esto de reservar y liberar memoria. En lugar de molestar al sistema operativo para reservar y liberar pequeños bloques de memoria lo que hace delphi es reservar y liberar bloques de memoria de tamaño razonable en megas, dependiendo de la necesidad del momento. Esta técnica es bastante beneficiosa en tiempo de CPU si tienes un algoritmo que reserva y libera en todo momento apenas unos puñados de bytes. Por otra parte si un programador se olvido de liberar memoria en su programa, al cerrar el programa hecho en delphi correrá el código de gestión de memoria liberando toda la memoria que reservo el usuario (siempre y cuando lo hizo con las funciones estándar de Delphi y directamente del S.O.).
Sin embargo en el caso de servicios que corren 24 horas al día y 7 días a la semana el simple hecho de no liberar algunos bytes de memoria es terrible por que estos se van acumulando y al cabo de unos meses terminan reventando al servidor y ocasinando la necesidad de reiniciarlo. En este caso el codigo generado por el compilador delphi no te ayudará a evitar este desastre puesto que la liberación final sólo corre al terminar la ejecución del programa y estamos hablando de servicios que se suponen que tienen que correr por lo menos un año continuo sin perder estabilidad.
162
« en: Sábado 6 de Mayo de 2006, 03:27 »
El codigo es para .NET 2.0 (no lo probé en otros) y permite correr una aplicación en un determinado conjunto de procesadores. Algunas aplicaciones como mozilla firefox 1.0.5 tienen algunos problemas al correrlos en un procesador Intel prescott de multiples procesadores con "hyperthreading" activado. Por ejemplo una mascara "1" define que sólo correra en el primer procesador, si es "3" correrá en los dos primeros procesadores, si es "2" correrá sólo en el segundo procesador, etc. Como ven cada bit del numero corresponde a un procesador. using System; namespace StartWithAffinity { class Program { static int Main(string[] args) { if((args.Length > 3) || (args.Length < 1)) { Console.WriteLine(@">StartWithAffinity ""Filename.exe"" AffinityMask ""Params"""); return 1; } //Check file name string mFileName = args[0]; if(!System.IO.File.Exists(mFileName)) { Console.WriteLine("The provided exe file does not exists"); return 2; } //check optional mask string mMaskString = (args.Length == 2) ? args[1] : "1"; int mMask; try { mMask = Convert.ToInt32(mMaskString); } catch { Console.WriteLine("Bad mask: provide an int32 number"); return 3; } //check optional arguments string mArguments = (args.Length == 3) ? args[2] : ""; //Run the process try { System.Diagnostics.Process mProc = new System.Diagnostics.Process(); mProc.StartInfo.FileName = mFileName; mProc.StartInfo.Arguments = mArguments; mProc.Start(); mProc.ProcessorAffinity = (IntPtr)mMask; if(mArguments != "") { mProc.WaitForExit(); return mProc.ExitCode; } else return 0; } catch(Exception e) { Console.WriteLine(e); return 1000; } } } }
P.D. Agregue el codigo fuente a la parte de recursos incluyendo ejecutable que necesita el .NET framework 2.0 P.D.2 Los argumentos tienes que ponerlos entre comillas y si en los argumentos tienes comillas tienes que escribirlas como en las cadenas de C: \"
163
« en: Sábado 6 de Mayo de 2006, 03:18 »
Usando la @ escribes las cadenas como en pascal sólo que en lugar de comilla simple usas doble comilla. Asi que "Hola" se puede escribir "\"Hola\"" o bien @"""Hola""", de forma que 2 comillas dobles se entienden por una simple SOLO si las escribes como constantes de cadena con @. Con la @ el resto de los caracteres se interpretan como tales y sólo la comilla doble es especial.
164
« en: Sábado 6 de Mayo de 2006, 02:18 »
Esta herramienta permite definir cuales procesadores puede utilizar un proceso. La hice para poder utilizar firefox 1.0.5 sin que se ande "congelando" a todo momento debido a problemas con procesadores Intel prescott con hyperthreading.
Para utilizarlo por ejemplo con el firefox basta arrastrar y soltar el firefox encima, por linea de comandos:
>StartWithAffinity "Filename.exe" Mask "Params"
"Filename.exe": Es el nombre completo con path incluido del exe.
"Mask": Es un numero entero que define en sus bits los procesadores que podrá usar el ejecutable. Por ejemplo "1" define que sólo puede usar el primer procesador, "3" define que puede usar el primero y el segundo. Si no se define este parámetro el predefinido es 1.
"Params": Los parámetros a pasar al ejecutable. (no verificado pero debería funcionar)
Autor: Sergio A. Chávez R.
165
« en: Jueves 4 de Mayo de 2006, 05:21 »
Nunca está demás saber como manejar archivos. Todo depende de que aplicación estás desarrollando, asi que no vaya a ser que quieras matar a una hormiga con un rifle para elefantes, cada cosa tiene su utilidad. Por ejemplo si haces una aplicacion que maneje imágenes algo pesadas es mejor tenerlas en archivos separados y los datos sistematizables pues en una base de datos. O por ejemplo te imaginas empotrar todos tus archivos mp3 en una base de datos? Pues eso no me parece algo inteligente, es mejor separar la información que se puede normalizar, indexar, etc. de la que simplemente no puedes incluirla en un select.
166
« en: Miércoles 3 de Mayo de 2006, 23:51 »
OpenGL es multiplataforma pero DirectX es mucho más completa (es obvio, es de MS). Tienes un concepto errado. Lo "completo" lo da la tarjeta de video y no el directX, sólo sirve de puente entre tu codigo y el driver del hardware. Y el papel de esa capa de software debería ser encapsular la complejidad del driver y de las distintas diferencias entre fabricantes, pero la verdad no lo hace como uno esperaría. Seguramente cuando hagas alguna aplicación usando DirectX y queriendo aprovechar al máximo las bondades de tu tarjeta de video te darás cuenta que lo "completo" depende de tu tarjeta de video. Puedes hacer que tu aplicación soporte todo lo que soporta tu tarjeta de video pero la llevas a otra máquina con una tarjeta de otro fabricante y te llevarás una gran decepción al ver que muchas cosas ya no funcionan y lo que debes hacer es detectar las capacidades de la tarjeta de video y recién utilizarlas. Si no las tiene la otra tarjeta de video, ni modo, a tratar de simularlo usando lo que tienes a mano. ¿Por que creen que los juegos que usan directX siempre llevan como advertencia cuales tarjetas de video soportan y cuales no?
167
« en: Viernes 28 de Abril de 2006, 20:22 »
Simple, agregas una nueva clase, en este caso estática para ese tipo de cosas, por ejemplo "Herramientas", luego la llamas desde cualquiera de tus otras clases asi: Herramientas.Calcula_Numero y como están dentro del mismo espacio de nombres no necesitas poner "using". Si no lo están colocas el using y listo.
168
« en: Martes 25 de Abril de 2006, 20:20 »
Sólo se me ocurre que tienes que tener gráficos de distintos colores para cada zona. O bien agregas banderitas de colores que flameen en las respectivas zonas.
169
« en: Sábado 22 de Abril de 2006, 03:28 »
De hecho se pueden declarar referencias a objetos de clases abstractas y es muy util hacerlo. Lo que no se permite es instanciar clases abstractas que es otra cosa. Asi que al momento de instanciar tu referencia a objeto de clase abstracta tienes que instanciar un descendiente no abstracto.
170
« en: Domingo 9 de Abril de 2006, 23:41 »
Sólo agregar un detalle: El objeto Graphics encapsula funcionalidades del HDC de la api de windows. Es decir determina donde se dibujará, maneja los objetos para dibujar, las funciones para dibujar, etc. Pero lo que no tiene es una MEMORIA PROPIA para dibujar. Necesitas un objeto bitmap para tener un pedazo de memoria reservado donde dibujar y que nadie más le meta mano. Cuando dibujas directamente en un control de windows lo que haces es trabajar directamente en memoria de video (lo que es lento por cuestiones de transferencias de memoria RAM-Video) y la desventaja principal es que todo el mundo le mete mano, asi que si mueves tu ventana o mueves otra encima de la parte donde dibujaste pues simplemente se borra. Asi que la solucion es dibujar primero en un bitmap y luego en el evento OnPaint pasar directamente el bitmap a memoria de video (es decir dibujar el bitmap usango el objeto graphics de tu control de windows para que lo dibuje en el control). De esta forma cada vez que sea necesario redibujar la imagen se generará el evento onPaint y como el dibujo ya esta guardado en el bitmap lo que harás es mostrarlo nuevamente en pantalla, sin tener que renderizar nuevamente todo, es decir se reducira a un paso rápido de memoria RAM a memoria de video. P.D. Esto de pasar de memoria RAM a video se hace con la funcion bitblt del GDI de windows, pero por alguna razón no la pude hacer funcionar y no tuve otro remedio que usar una funcion de .NET para dibujar el bitmap. Esto ultimo no es recomendable por que esas funciones son mucho menos eficientes debido a que están pensadas para efectos más completos como alpha blending, escalamiento, etc. Asi que si pueden hacer funcionar este codigo avisen. : La idea es esta: Usar la funcion del GDI BitBlt: public static class GDI { [System.Runtime.InteropServices.DllImport("gdi32.dll")] internal static extern int BitBlt ( IntPtr hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, int dwRop); }
Estas son las constantes para el parametro dwRop (Raster Operation) Notaran que estan definidas para otro lenguaje pero seguro entienden cual es el valor hexadecimal correspondiente. SRCCOPY = &HCC0020 ' Copies the source rectangle directly to the destination rectangle. SRCPAINT = &HEE0086 ' Combines the colors of the source and destination rectangles by using the Boolean OR operator. SRCAND = &H8800C6 ' Combines the colors of the source and destination rectangles by using the Boolean AND operator. SRCINVERT = &H660046 ' Combines the colors of the source and destination rectangles by using the Boolean XOR operator. SRCERASE = &H440328 ' Combines the inverted colors of the destination rectangle with the colors of the source rectangle by using the Boolean AND operator. NOTSRCCOPY = &H330008 ' Copies the inverted source rectangle to the destination. NOTSRCERASE = &H1100A6 ' Combines the colors of the source and destination rectangles by using the Boolean OR operator and then inverts the resultant color. MERGECOPY = &HC000CA ' Merges the colors of the source rectangle with the brush currently selected in hdcDest, by using the Boolean AND operator. MERGEPAINT = &HBB0226 ' Merges the colors of the inverted source rectangle with the colors of the destination rectangle by using the Boolean OR operator. PATCOPY = &HF00021 ' Copies the brush currently selected in hdcDest, into the destination bitmap. PATPAINT = &HFB0A09 ' Combines the colors of the brush currently selected in hdcDest, with the colors of the inverted source rectangle by using the Boolean OR operator. The result of this operation is combined with the colors of the destination rectangle by using the Boolean OR operator. PATINVERT = &H5A0049 ' Combines the colors of the brush currently selected in hdcDest, with the colors of the destination rectangle by using the Boolean XOR operator. DSTINVERT = &H550009 ' Inverts the destination rectangle. BLACKNESS = &H42 ' Fills the destination rectangle using the color associated with index 0 in the physical palette. (This color is black for the default physical palette.) WHITENESS = &HFF0062 ' Fills the destination rectangle using the color associated with index 1 in the physical palette. (This color is white for the default physical palette.) NOMIRRORBITMAP = &H80000000 ' Windows 98, Windows 2000: Prevents the bitmap from being mirrored. CAPTUREBLT = &H40000000 ' Windows 98, Windows 2000: Includes any windows that are layered on top of your window in the resulting image. By default, the image only contains your window.
Luego obtener los handles de los objetos que encapsulan el GDI y llamar a la funcion anterior: IntPtr HdcDst = e.Graphics.GetHdc(); if (HdcDst != null) { IntPtr HdcSrc = RenderSurfaceCanvas.GetHdc(); if (HdcSrc != null) { //GDI.BitBlt(HdcDst, e.ClipRectangle.Left, e.ClipRectangle.Top, e.ClipRectangle.Width, e.ClipRectangle.Height, HdcSrc, 0, 0, 0xCC0020); GDI.BitBlt(HdcDst, 0, 0, 50, 50, HdcSrc, 0, 0, 0x00CC0020); //GDI.BitBlt(HdcDst, 10, 10, 260, 60, HdcSrc, 30, 100, 0xFF0062); RenderSurfaceCanvas.ReleaseHdc(HdcSrc); } e.Graphics.ReleaseHdc(HdcDst); }
Pero no funciona , por alguna razón no copia los bytes del origen, incluso funcionan las operaciones para limpiar los bytes destino colocandolos en blanco o negro, pero lo otro no.
171
« en: Domingo 9 de Abril de 2006, 23:32 »
C# tiene una orientacion a responder eventos. Es decir que genera ya un ciclo de proceso de mensajes de windows. Asi que ya no tienes que hacer tu mismo el proceso de capturar esos mensajes como por ejemplo cuando se presiono una tecla. Lo que tienes que hacer es responder a esos eventos.
Claro que todo esto no se aplica a modo consola por que el modo consola de c# está pensado más para crear herramientas de automatización que permitan funcionar recibiendo un conjunto de parametros y devuelvan un resultado que se pueda parsear. Por esto que el Read y Readln están pensados más para procesar un input stream.
Funciones como getchar estaban orientadas a usarse en D.O.S, donde tenias un ciclo que iba capturando las teclas presionadas por el usuario. En cambio en windows existe un mecanismo más completo y complejo que informa de eventos, en este caso generados por el teclado y además permite saber para quien va ese mensaje, por ejemplo para saber que estas escribiendo en un textbox1 y no en el textbox2.
172
« en: Lunes 3 de Abril de 2006, 17:36 »
Bueno, algo interesante y que no debería ser muy complicado y es bastante útil es un editor hexadecimal.
Básicamente muestras un archivo en notacion hexadecimal (Puede ser en un grid de 16 x 16 bytes) y sólo se puede editar un byte a la vez. Podrias recuperar una parte del archivo a la vez y colocarlo en el grid, luego de editar esa parte se podría guardar y pasar a otro segmento del archivo. Podrias avanzar a los siguientes 256 bytes o a los siguentes 16. Tambien seria buena idea guardar todo el archivo en ram para no tener que leerlo cada vez y sólo al presionar un boton de guardar pasar todas las modificaciones a disco.
El problema lo puedes dividir en varias partes:
+ Cargar el archivo en RAM, preferentemente dividiendolo en bloques de N Kb. + Como guardar todo el archivo que está dividido en bloques de N Kb en RAM. + Como llenar un grid de 16x16 leyendo un bloque de bytes de RAM, sabiendo a que bloque de N Kb tenemos que acceder. + Como editar un solo valor de ese grid y validarlo para que sea un valor entre 0 y 255.
173
« en: Sábado 1 de Abril de 2006, 20:26 »
Lo mejor es que te hagas una pequeña herramienta que te muestre los codigos de teclado y codigo ascii de la tecla que presiones, asi en cualquier momento si quieres saber el codigo de alguna tecla usas tu herramienta. Ojo que se pueden obtener ambos valores y son distintos: el ascii y el codigo de tecla.
174
« en: Sábado 1 de Abril de 2006, 05:26 »
En otras palabras existe una propiedad, creo que es un numero donde indicas a que grupo pertenece asi tienes los radiobutton con "uno" y los otros con "dos" y asi tienes dos grupos independientes.
175
« en: Martes 28 de Marzo de 2006, 03:08 »
Creo recordar que hice un filtro de esos con keypress o alguno de esos eventos. LA idea era poner en 0 el char si no estaba dentro del conjunto admitido de chars.
Páginas: 1 ... 5 6 [7] 8 9 ... 27
|
|
|