|
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 - killrazor
1
« en: Martes 16 de Marzo de 2010, 17:24 »
A que te refieres con desplegar. Es que no comprendo que quieres decir.
2
« en: Martes 16 de Marzo de 2010, 17:15 »
Solucionado Es mas o menos asi void serialice(unsigned char* data) { long a = 33; //variables de ejemplo int b = 44; *reinterpret_cast<long*>(data) = a; *reinterpret_cast<int*>(data + sizeof(long)) = b; }
Saludos
3
« en: Martes 16 de Marzo de 2010, 17:12 »
Como sabes que no es portable? lo has intentado portar? A que plataforma(s)? Te da un error algun compilador?
4
« en: Viernes 12 de Marzo de 2010, 20:51 »
Hola, te agradeceria que crees tus propios temas para tus dudas y mas si no tienen nada que ver.
5
« en: Viernes 12 de Marzo de 2010, 11:39 »
Hola, estoy intentando serializar las variables dentro de una clase. La clase tiene una funcion asi: void serialice(unsigned char* data) { long a = 33; //variables de ejemplo int b = 44; long* pA = &a; int* pB = &b; static_cast<long*>(data)++ = *pA; static_cast<int*>(data)++ = *pB; }
Pero me da errores. Creo que no estoy muy lejos, pero me estoy dejando algo. Me podeis dar una manita please?
6
« en: Viernes 29 de Enero de 2010, 10:19 »
Hola, hay algo que no entiendo sobre las funciones virtuales. Si yo tengo estas clases: class Base{ public: void func(int a){ cout << "Estoy en la clase Base" << endl;} }; class Derivada:public Base{ public: void func(int a){ cout << "Estoy en la clase Derivada" << endl;} }; int main(){ Base a; a.func(0); Derivada b; b.func(0); return EXIT_SUCCESS; }
Sin necesidad de poner la palabra clave virtual, la salida de b.func() seria "Estoy en la clase derivada". Entonces para que sirve la palabra clave virtual? Yo pensaba que si no poniamos virtual, la funcion de la clase derivada quedaba oculta.
7
« en: Martes 1 de Diciembre de 2009, 12:39 »
Creo que tienes una funcion para cargar archivos.
8
« en: Miércoles 25 de Noviembre de 2009, 17:03 »
Tambien puedes probar con QT. no se si me habran entendido Pues si, despues de haber añadido las pausas y las comas mentalmente, te he entendido.
10
« en: Miércoles 4 de Noviembre de 2009, 09:36 »
C++ sin dudarlo. Es rápido, fácil y si te aburres de hacer juegos puedes pasarte ha desarrollar aplicaciones Claro! C++ es facilisimo! De hecho debe ser el lenguaje mas facil de aprender y sobretodo de dominar que existe en la actualidad. Y evidentemente, te puedes pasar a desarrollar aplicaciones, de hecho el mercado esta rebosante de ofertas de trabajo para desarrolladores C++. No como esos muertos de hambre de J2EE que apenas encuentran trabajillos sueltos. Vamos a ver, antes de meter a la gente en lios habria que pensar un poco en lo que decimos. C++ es dificil de dominar, propenso a errores bastante sutiles que desembocan en mala performance del videojuego. Es mucho mas facil programar aplicaciones estables en java, python, c#, etc. Cuando se elige C++, se elige el camino dificil, aunque tambien es el que mas posibilidades nos brinda, pero para que esas posibilidades existan, debemos domar a la bestia y no es facil. El camino del C++ es para cuando se quiere programar graficos y no juegos. Si lo que queremos es un juego, a nivel de plasmar una idea y no nos gusta demasiado la programacion, odiamos las matematicas, etc etc, c++ es el camino equivocado, puesto que antes de tener algo jugable tendremos que programar muchas lineas, y hacer un monton de trabajo. La mejor manera es buscar una suite de programacion de videojuegos (un game engine, mas o menos), donde podamos cargar geometria escribiendo una sola linea.
11
« en: Miércoles 4 de Noviembre de 2009, 09:22 »
A ver amigo, hay varias cuestiones. La primera, tu profesor no te ha dicho el numero maximo de notas que va a introducir, asi que el bucle esta mal elegido. El bucle, segun lo programas, acabara al cabo de 100 notas introducidas, pase lo que pase. for ( count=1; count <= 100; ++count)
Sustituyelo por un , por ejemplo Ademas te dice que si la condicion es mayor que 100 o menos que 0. Tu solo compruebas que sea mayor que 100. Si yo le introduzco un -400 el programa me lo sumaria al total. Por otro lado no compruebas la media
12
« en: Miércoles 4 de Noviembre de 2009, 09:12 »
Pues yo se que SEEK podemos poner el cursor (no puntero) en un sitio determinado del archivo, pero esto es para ficheros binarios. Ahora mismo no se si se puede hacer por lineas, pero creo que no.
13
« en: Martes 3 de Noviembre de 2009, 23:36 »
Con un contador interno, que acumule las veces que has leido el archivo.
14
« en: Martes 3 de Noviembre de 2009, 11:39 »
Yo lo que haria, ademas de copiar en la pizarra 1000 veces que no usaras nunca mas el goto en un programa  , seria separar las dos funcionalidades. Por un lado, olvidate del retardo de 10 segundos y haz una funcion que copie las tres ultimas lineas, y despues usa un pequeño menu de toda la vida que en caso de que le des al numero uno, te copie las 3 ultimas filas. Una vez te funcione, juega con el tiempo. Lo que yo veo es que con el goto, vuelves a reinicio, sin pasar por el sleep. Al copiar las tres lineas no cierras el archivo, entonces el programa llega al goto, sube hasta reinicio y vuelve a abrir los archivos sin haberlos cerrado previamente, entonces seguramente da un error, los archivos se cierran (por eso tu percepcion es que se ejecuta la primera vez), y acto seguido el programa devuelve un 1. Creo que el goto hace que tu programa pierda todo tipo de orden, asi que si puedes intenta pensarlo de otra manera, como por ejemplo: while(!SALIR){ abrirFicheros(in, out); copiarFilas(3); cerrarFicheros(in, out); sleep(10000); }
Donde la condicion salir puede ser la pulsacion de una tecla, o un numero de filas copiadas o lo que tu quieras.
15
« en: Martes 3 de Noviembre de 2009, 09:36 »
Creo que ese tipo de programas se llaman trackers, por si quieres buscarlos por google. Por lo que puedo entender, lo que buscas es una herramienta donde apuntar las horas que has invertido en un proyecto (y tambien deduzco que seria bueno poder comparar con el tiempo estimado del proyecto, para saber la desviacion)
16
« en: Lunes 2 de Noviembre de 2009, 09:20 »
Hola a todos,
Estoy buscando la forma de capturar la ventana de visualización de opengl. Quiero capturar el contenido de la ventana en formato jpeg para luego utilizar la captura en la implementación de un sistema de calibración de cámaras. Existe tal función? o podría usar alguna librería que me permitiese hacerlo?
Un saludo y gracias. En opengl existe la funcion glReadPixels, que puedes consultar en: http://www.opengl.org/sdk/docs/man/xhtm ... Pixels.xmlUna vez tienes los datos, apoyate en una libreria como DevIL, SDL_image o cualquier otra para convertir el buffer en un formato concreto de archivo (jpeg, png, o cualquier otro). Aqui tienes un pequeño ejemplo de como se hace: http://www.gamedev.net/community/forums ... _id=436385
17
« en: Martes 13 de Octubre de 2009, 10:27 »
Y que es rd5?
Cuando te sale el error? Al iniciar un videojuego?
18
« en: Lunes 12 de Octubre de 2009, 20:48 »
Hola, muchas gracias!! Pues por fin ha funcionado bien, y era por lo que decias!! Respecto al tema del singleton: Pero no entiendo: ¿usas CGeneralLogger en forma de Singleton? es lo que me parece porque usas la funcion GetInstance() Me parece raro porque: 1. Si CGeneralLogger es un singleton, no hay que instanciarlo fuera de su-mismo (es por eso que los constructores son declarados en privado en el pattern Singleton) 2. CGeneralLogger parece dedicada a tener herencia (hablas de la funcion virtual processMessage, supongo que es un patrono Template Method y que tendras hijos de CGeneralLogger que implementan processMessage de maneras distintas ¿no?) No es exactamente asi: Construi otra clase, llamada CentralLog, que era un singleton. En ella concentro todos los mensajes de la aplicacion, y le añado "listeners" para recoger los mensajes. Es una implementacion un poco grossa del patron observable  CGeneralLogger es un listerner, y no es un singleton. si te fijas, en el main estan las lineas: //Aqui creo un logger CGeneralLogger glogger = CGeneralLogger("Log333.txt",tools::GLog::LOGLEVEL_DEGUG); //esto es una implementacion de la interface listener // Aqui recojo una instancia del singleton GlobalLogger tools::GLog::CGlobalLog *gLog; gLog = tools::GLog::CGlobalLog::getInstance(); // gLog es el singleton // Aqui agrego la clase al log para que la llame en processMessage. gLog->addListener(&glogger); //añado el listener la lista interna de clases de CentralLog
Es un poco mas complejo que el tipico logger pero me da mucha libertad para crear logear mensajes desde donde quiero, y por otro lado, recorgerlos donde quiero, filtrandolos por grupos y por nivel. Vaya, como Log4j pero en algo mas cutre  Muchas gracias por todo!
19
« en: Domingo 11 de Octubre de 2009, 17:26 »
Hola a todos. Estoy haciendo una clase que usa un Log para guardar mensajes. Lo extraño es que tal como se crea la clase, automaticamente se llama al destructor. El codigo del main es este: int main(int argc, const char* argv[]){ //Aqui creo un logger CGeneralLogger glogger = CGeneralLogger("Log333.txt",tools::GLog::LOGLEVEL_DEGUG); // Aqui recojo una instancia del singleton GlobalLogger tools::GLog::CGlobalLog *gLog; gLog = tools::GLog::CGlobalLog::getInstance(); gLog->setMinimumLogLevel(tools::GLog::LOGLEVEL_DEGUG); // Aqui agrego la clase al log para que la llame en processMessage. gLog->addListener(&glogger); gLog->addMessage("Inicio del Log", "[GLOBAL]",tools::GLog::LOGLEVEL_DEGUG); //Aqui se llama a la funcion virtual para escribir los mensajes a los listeners. gLog->processMessages(); cout << "Hola mundo" << endl; system("PAUSE"); return EXIT_SUCCESS; }
El del constructor es este: CGeneralLogger::CGeneralLogger(std::string fileName, tools::GLog::LogLevel lvl):m_fileName(fileName), m_level(lvl) { m_file = new std::ofstream; m_file->open(m_fileName.c_str(), std::ios_base::out |std::ios_base::app); tools::GLog::CGlobalLog *log; log = tools::GLog::CGlobalLog::getInstance(); }
Y el del destructor es este: CGeneralLogger::~CGeneralLogger(void) { *m_file << "closing file" << std::endl; m_file->close(); }
Y el codigo en addListener, es este: void CGlobalLog::addListener( IListener* listener, std::string loggerGroup /*= "[GLOBAL]"*/ ) { std::pair<t_ListenerVectorMap::iterator,bool> p = listenerVectorMap.insert(std::pair<std::string,t_ListenerVector*>(loggerGroup,new t_ListenerVector())); p.first->second->push_back(listener); }
Mis sospechas son que en algun sitio de las STL que uso en addListener provocan algun tipo de constructor por defecto que lleva a una llamada al destructor del objeto. Ademas, una vez se acaba el main, tambien se llama al destructor. Por otro lado, si declaro el destructor como virtual se produce una tercera llamada al destructor. La verdad es que ando bastante perdido. Si me podeis echar una mano os lo agradeceria muchisimo.
20
« en: Viernes 9 de Octubre de 2009, 09:45 »
Si el server se conecta con una aplicacion en Python, esta aplicacion se puede considerar server tambien. Seguramente tienes otras opciones pero se me ocurre poner un socket en modo escucha sobre un puerto, y asi recibir la informacion. No soy nada experto en python pero en java yo lo he hecho y realmente es muy sencillo.
21
« en: Jueves 8 de Octubre de 2009, 12:36 »
Bufff, el perfil de un diseñador de emulador es bastante dificil de describir. Un emulador se hace, mas o menos, conociendo el hardware a emular o bien teniendo los SDKs para los dispositivos que se quieren emular.
Por ejemplo, si quisiermos emular una xbox, deberiamos tener informacion sobre el S.O de la consola, y relacionarlo con el codigo de los juegos que se ejecutan en la maquina. A partir de ahi, el grupo que programa el emulador va recogiendo instrucciones en codigo maquina y buscando las instrucciones necesarias para transformar una de xbox a una para PC.
Si no sabes programar, entonces estas a años luz de hacer emuladores, por que suele ser gente bastante experta en programacion a bajo nivel y hardware.
22
« en: Jueves 8 de Octubre de 2009, 12:27 »
Por si te puede servir te pongo informacion de como generar coordenadas con hexagonos. http://www.ziggyware.com/readarticle.php?article_id=278El sistema grafico es un poco lo de menos, puesto que no necesitas mas que unas pocas funciones, mas siendo en 2D, que encontraras en casi cualquier parte, sobretodo en opengl. SFML, o SDL, o cualquier otro te servira para eventos y gestion de la ventana. Yo lo que haria es ir programando la logica de la aplicacion que puede que sea lo mas costoso. Por cierto, r0d, muy chulo el yatus. Tiene una pinta excelente. Esta tarde le quiero echar un buen vistazo.
23
« en: Martes 6 de Octubre de 2009, 16:17 »
No soy muy experto en C, aunque en C++ yo usaria STL. En C, lo malo (y lo bueno) es que cada dimension puede ser diferente segun la fila (en C++ tambien). Es decir, una matriz de dos dimensiones de enteros puedes pensarla como un array de arrays. Asi el primer array de la segunda dimension puede tener 5 posiciones y la otra puede tener 1000 posiciones. Tienes un numero maximo de dimensiones para el algoritmo? Cada fila de una matriz ha de tener las mismas posiciones? Es decir, esto, para tu funcion, es legal o ilegal? int* a = new int*[2]; //array de dos punteros a[0] = new int[100]; a[1] = new int[3];
O solo es legal que todos los elementos de la misma dimension sean iguales? #define MAX 2 int* a = new int*[MAX]; //array de dos punteros for(int i=0; i < MAX; i++){ a[i] = new int[b]; }
24
« en: Viernes 2 de Octubre de 2009, 14:36 »
Lo veo un poco raro. Me explico: por un lado lo veo complicado, puesto que un archivo ejecutable no puede variar mientras se ejecuta, por que el SO no lo permite (al menos eso creo). Ademas, seguro que el antivirus de lo detectaria como virus, eso seguro.
Si todavia consiguieras hacerlo, te encontrarias con que un ejecutable comprado, con la clave puesta, seria libremente distribuida, puesto que ya tendria su clave.
Hay alternativas, como activarlo a traves de un mail, donde le mandes la clave. Me explico: - Lo primero que necesitas es algo unico en cada maquina. Lo ideal es la MAC de la targeta de Red. - Despues, lo mandas a un programa generador (mejor en un servidor) y generas una clave unica para cada usuario. - Le devuelves la clave al usuario via mail (por ejemplo) - El usuario lo mete en el programa. Dentro del programa, cada vez que lo inicies, compruebas la clave
Ahora bien, como generas la clave? Pues en el servidor, multiplicas la info que te manda el usuario, por una matriz M. El resultado es una clave. Ahora para comprobarla, necesitas multiplicar la clave que introduce el usuario por la matriz inversa de M. El resultado deberia ser la MAC, que puedes comprobar con cada inicio del programa.
Desventajas: Es necesario tener un server, aunque la operacion de generacion de claves puede ser creada facilmente en PHP, por ejemplo. Si el usuario cambia de ordenador, tienes que buscar una manera de enviarle otra clave, asi que deberas indentificar quien te pide las claves Directamente no existe una comprobacion por red de la clave, aunque no deberia de ser dificil de implementar. No es 100% seguro. Es posible crackearlo pero no es trivial.
Ventajas: Por mucho que un usario se lo pase a otro, con una clave oficial, esa clave va vinculada a un ordenador y solo a uno. Es facil de implementar. Se puede comprobar la oficialidad de la clave en cada ejecucion del programa. Incluso usando ingenieria inversa para aislar la matriz inversa, no es trivial conseguir la matriz para generar otras claves y para fabricar un keygen.
Espero que te sirva. Por cierto, hace tiempo que no estudio algebra, pero me parece que el tema de matrices era asi. Si no te sientes comodo con este tema o si he metido la pata, substituye la parte de matrices por cualquier otra operacion no reversible (multiplicacion de primos o cosas asi), pero basicamente es lo mismo.
25
« en: Miércoles 30 de Septiembre de 2009, 23:12 »
Hola, tampoco estaria mal si los setters y getters los haces inline. Es una de las grandes ventajas de C++ y ganas algo de velocidad. Si programas en C++, ademas, puedes usar los namespace, para que tus librerias tengan paralelismo con los packages de java. Lo tercero que veo es que usas las clases asi: # punto* p1 = new punto(); # punto* p2 = new punto(0,0);
Pero C++ te da la facilidad de hacerlo de manera estatica o dinamica (que es como tu lo haces, con el new). De manera estatica se puede hacer asi
|
|
|