|
71
|
Programación / Programación General / Re: Borrar dll y que no se pueda recuperar
|
en: 15 Abril 2022, 16:50 pm
|
Aunque es cierto que, hasta donde sé, un exe no puede eliminarse a sí mismo, hay maneras de hacerlo indirectamente. Por ejemplo, en C++ podrías poner algo similar a esto como última instrucción del programa antes de salir: ShellExecuteA(NULL, "open", "cmd", "/c timeout /t 2 & del ejecutable.exe", NULL, SW_HIDE);
para que se ejecuten los comandos timeout y del. Lo que hace es esperar un par de segundos para estar seguros de que el ejecutable ya se cerró, y entonces borrarlo. Si quisieras hacer algo más complejo que sólo borrarlo, en lugar de "del" ejecutas lo que quieras, incluso un archivo .bat. De todas formas, coincido en que esto no parece tener mucho sentido, salvo que se trate de actividad maliciosa.
|
|
|
72
|
Programación / Programación General / Re: Operadores Lógicos
|
en: 13 Abril 2022, 17:32 pm
|
Cuidado con e. Fíjate que el enunciado: F es negativo o E es no negativo pero no ambos a la vez no dice nada acerca de qué pasa cuando F es no negativo (o cuando E es negativo). Suponer que negar una cosa implica negar la otra es un error. Si puedes usar la negación o complemento lógico (y no veo por qué no) podrías resolverlo así:
NO ((F < 0) Y (E >= 0))Edit: no lo leí bien, pues lo anterior admitiría que ninguna de las condiciones se cumpliera. Por cierto, aquí hay que invertir las condiciones ya sea de E o de F: ((F < 0) Y (E => 0)) O ((F => 0) Y (E < 0))
|
|
|
73
|
Programación / .NET (C#, VB.NET, ASP) / Re: [Herramienta] Unmanaged.Net
|
en: 3 Abril 2022, 20:58 pm
|
Buen aporte. Aunque no lo probé (tan sólo porque actualmente ya no me llaman mucho la atención estos temas, no por desconfianza o algo por el estilo) sí le di un vistazo al código y es refrescante ver algo directo, claro y sin florituras innecesarias (que parece ser lo común en estos tiempos). Te comento un error: char *Pathvar = getenv("TEMP"); ... DLLName = strcat(Pathvar , DLLName );
strcat modifica su primer parámetro, pero, dado que tú no reservaste la memoria a la que apunta, no es seguro hacerlo y de acuerdo a las reglas de C, es incorrecto (básicamente es como escribir más allá de los límites de un array). Como suele ser el caso con los bugs de punteros en C, es posible tener la suerte de que el programa funcione bien, pero no deja de ser un error esperando a manifestarse. Al margen de eso, las reglas del lenguaje expresamente prohíben modificar los datos del puntero devuelto por getenv. También aquí el resultado podría ser impredecible, por lo que es mejor corregirlo reservando (malloc) para Pathvar un bloque con el número de bytes suficientes para la ruta del directorio temporal más el nombre de la DLL más un byte adicional para el caracter nulo, y entonces sí, copiar getenv("TEMP") a Pathvar y luego concatenarle el nombre de la DLL. También hay algunas maneras en que podrías ahorrarte la compilación. Esto a lo mejor ya lo sabes y decidiste compilar por alguna otra razón, pero si no es el caso, y lo haces sólo para que el stub pueda conocer los datos de la DLL de .NET (preprocesas el .c para sustituir los datos entre "$$" antes de la compilación, imagino), puedes distribuir (o incluir en tu EXE) solamente la DLL del stub ya compilada. Tu programa podría simplemente añadirle como recursos tanto la DLL de .NET como el nombre del entry point o cualquier otra cosa que necesites, mediante la familia de funciones *UpdateResource de la API de Windows o lo que proporcione .NET. El stub cargaría esos recursos y reservaría dinámicamente la memoria de rawData. O, sin recursos, tu ejecutable podría limitarse a escribir toda esa información (junto con offsets para encontrar los datos fácilmente) al final de la DLL del stub. En cualquier caso, ya con esa información el stub procedería a escribir los bytes en la DLL temporal, la cargaría, etc. tal como lo hace actualmente.
|
|
|
74
|
Programación / Programación C/C++ / Re: alguna forma de pasar una funcion miembro como argumento a otro miembro de clase?
|
en: 3 Abril 2022, 17:35 pm
|
Lo que busco hacer es llamar desde ClaseA::Alpha() a ClaseB::Beta(), luego ClaseB::Beta() debe invocar a ClaseA::Alpha() de vuelta. Esto parece un error en el diseño de tu programa. No sólo por el bucle infinito que provocará, lo cual tiene solución simple (aunque no muy limpia) sino porque ese tipo de interdependencia casi nunca es bueno. Si es curiosidad lo que tienes, sí puedes pasar punteros a funciones miembro, pero teniendo en cuenta algunos detalles. Las funciones miembro no static, como Alpha(), siempre se ejecutan en el contexto de un objeto concreto (el puntero this, que reciben como parámetro implícito). No puedes simplemente pasar el puntero a la función, sino que necesitas saber sobre qué objeto operar. Hay varias formas de hacerlo. Una simple que podrías probar es algo así: Declaras Beta de esta manera void Beta(void (ClaseA::*funcion)(void), ClaseA& o);
La invocas desde Alpha así: b->Beta(&ClaseA::Alpha, *this);
Y dentro de Beta: (o.*funcion)();
No es lo más limpio, pero simplifica el código (lo de evitar el bucle infinito te lo dejo. Hay muchas maneras de hacerlo). Aún así, reitero que te recomiendo que rediseñes el programa para no necesitar esto.
|
|
|
75
|
Programación / Programación C/C++ / Re: Por que read no funciona con system?
|
en: 24 Marzo 2022, 23:45 pm
|
Pues la manera en que lo hacen en el link que pusiste (poniendo la terminal en modo no canónico mediante tcsetattr) es la común para Linux. Podrías añadir algo como: term_nueva.c_lflag &= ~(ECHO);
si no quieres que se muestre el caracter tecleado. Por lo demás, es una opción muy válida.
|
|
|
76
|
Programación / Programación C/C++ / Re: Tengo una duda sobre los punteros, trabajar con archivos, arrays y vectores. En c+++
|
en: 23 Marzo 2022, 20:31 pm
|
Gracias por tu respuesta, tendre en cuenrta todo lo que me comentas si llega la hora de optimizar.
Por ahora voy a dejar de lado la optimizacion y me enfocare en que el programa funcione y haga lo que le pido, ya me dieron un regaño por no entregar resultados asi que me preocupare de hacerlo de la manera mas eficiente cuando se me solicite explicitamente. Por el momento me pidieron graficar los datos en un grafico de dispersion de puntos, algo similar al scatter de matplotlib de python. Tienes alguna idea de que librerias puedo usar para hacerlo? Porque de verdad estoy retrasado en el trabajo y llevo todo el dia investigando sobre el tema sin conseguir resultados. Gracias nuevamente por las recomendaciones que me diste, sobre el tema de las librerias graficas, en el foro coloque otro tema por si quieres responder por ahi.
No había visto tu respuesta. Supongo que ya lo solucionaste (¿?) pero veo que en otro tema decías que estabas teniendo problemas de rendimiento. Si aún no los has solucionado, me parece (al menos con los detalles que proporcionaste allá), que tu problema pide a gritos paralelización, por ejemplo, mediante hilos. No especificaste qué haces con los flotantes que lees, pero si no solamente te limitas a leerlos y pasarlos a la función que grafica, sino que además realizas operaciones sobre ellos, esto podría mejorar el rendimiento de forma importante.
|
|
|
77
|
Programación / Programación C/C++ / Re: Por que read no funciona con system?
|
en: 23 Marzo 2022, 19:42 pm
|
No es recomendable usar la función system. Además de ineficiente, trae muchas complicaciones. En tu caso, como ya te dijeron, es por la variable de entorno. Podrías pasarla explícitamente: system("read REPLY");
Pero de cualquier forma esto no arregla el problema de fondo. Lo que pasa es que system crea al menos un nuevo proceso (de hecho, 2: uno para el shell y otro para el comando), con sus propias variables de entorno, y demás. Aunque se ejecuten dentro de la misma ventana del programa principal, son procesos independientes, y no es nada fácil la intercomunicación, pues se ejecutan de forma secuencial, y cuando system regresa, los procesos hijos ya se han destruido. Quizás en tu programa esto es aceptable, pero en la enorme mayoría de los casos, system es la solución incorrecta.
|
|
|
78
|
Programación / Programación C/C++ / Re: Tengo una duda sobre los punteros, trabajar con archivos, arrays y vectores. En c+++
|
en: 17 Marzo 2022, 23:10 pm
|
¿Realmente has probado el programa a ver si funciona lento? Porque si eres nuevo en el lenguaje, optimizar va a complicar las cosas.
Porque hay unas cuantas maneras de acelerarlo. Primero, no leer el archivo línea a línea ni número por número sino en bloques grandes, y luego procesar los bytes desde RAM. Los procesadores modernos tienen instrucciones muy eficientes para ello, a las que se puede acceder mediante funciones especiales (intrinsics), y aunque no son estándar de C++, todos los compiladores modernos las proporcionan. Esto podría hacer el proceso unas 5-10 veces más rápido que usando fscanf o streams. El problema es que es demasiado complicado para alguien que empieza.
Hay algunas cosas más sencillas que podrías probar, siempre que de verdad lo necesites. En Google o en cualquier manual de C puedes encontrar explicaciones de las funciones que voy a mencionar.
Preguntabas sobre la eficiencia de fscanf, y la verdad es que depende. Varia según el tipo de datos a leer y el compilador. Para números de punto flotante, fscanf suele ser bastante más rápido que usar streams (inputFile >> flotante), así que si quieres leer directamente del archivo esa podría ser una opción a probar.
Otra cosa que se suele hacer es, como te dije al principio, leer bloques de bytes grandes de una vez (incluso el archivo completo, dependiendo de su tamaño). En este caso ya no usarías ni fscanf ni el operador >> . Podrías usar sscanf, que funciona como fscanf, pero lee desde un buffer de memoria en lugar de un archivo. El detalle es que, como estamos hablando de bloques grandes de bytes, para que sscanf funcione eficientemente, antes habría que modificar el buffer (en tu caso, básicamente sustituir los '\n' por '\0'). Aún así, seguro que sería más eficiente que las opciones anteriores. Otra forma sería usar strtok, para irte saltando los espacios y comas, y la función stof (o atof, que es más rápida, pero no detecta errores) para convertir el texto en floats. Creo que esto podría ser unas 2 o 3 veces más rápido que las soluciones obvias (fscanf/operador >>). Eso sí, si no lees el archivo completo de golpe, es posible que a veces los bloques leídos terminen a la mitad de una cantidad. No es difícil detectar esto, pero hay que tenerlo en cuenta.
Todo esto es de C, porque C++ ofrece alternativas (std::regex, std:: string y sus funciones como find_first_of, find_first_not_of, etc.) que muchas veces son más completas o seguras, pero precisamente por eso, suelen ser más lentas si lo que quieres hacer es algo simple, como en este caso.
Lo dicho, cualquiera de estas opciones hace el problema más complejo, aunque me parece que estas últimas que te puse son asequibles con leer un poco. Pero como escribí al inicio, primero deberías comprobar que de verdad necesites optimizar.
|
|
|
79
|
Programación / Programación General / Re: El ingenio en la simulación (proceduralismo y frames/segundo)
|
en: 15 Marzo 2022, 18:09 pm
|
Si te interesa realmente el tema, también yo te recomendaría que leas por lo menos algún libro básico, porque, como dijo Serapis, sigues asegurando cosas (incorrectas), a pesar de que, como tú mismo has dicho, ni siquiera sabe sabes programar. Ahora, respondo algunos puntos. (incluso nosotros, cuando giramos la cabeza a un lado, seguimos viendo lo que tenemos delante de los ojos igual a como lo veíamos, puesto que los ojos no se quedan fijos). No, no es así. Al girar, la perspectiva cambia, aunque sea de forma sutil. Si no lo has notado (y hay varias razones para eso) es otra cosa, pero claro que cambia, y eso en una pantalla es aún más notorio que en el mundo real, así que los juegos tienen que calcular esa perspectiva sí o sí. lo que facilita mucho las cosas, porque simplemente tenríamos que establecer la distncia que se recorrer con dos tipos de paso, uno caminando y otro corriendo. Yo como dije, lo quiero hacer con frames, entonces serían posiciones que darían acceso a una parte de la memoria rom donde se hubicase el frames que el pc calcularía no gráficamente pero muy velozmente, tras todo el rollo de la generación y memorización de todas las imágenes del entorno en la carga de la pantalla, para después mostrarlo).
Aquí está lo que te decía. Afirmas que es fácil o al menos relativamente fácil, y que "simplemente" tienes que establecer las distancias, cuando en realidad, de simple no tiene nada. Como ya te dijo Serapis, no es práctico hacerlo. Calcular todas las imágenes posibles, tendiendo en cuenta que en 3D tenemos 3 ejes , y que hay que calcular todas las combinaciones posibles, la cantidad de memoria requerida sería enorme, y el resultado sería bastante inútil para un juego, ya que con esto sólo habrías obtenido las imágenes desde un punto concreto. Si el jugador da un paso a la izquierda, o adelante, o a donde sea, eso cambia completamente la perspectiva de todos los objetos en pantalla, por lo que necesitarías un conjunto de imágenes distinto para cada punto posible. La cantidad de memoria requerida lo hace prácticamente inabordable. Y de todas formas, como también te dijo ya Serapis, la diferencia de velocidad entre la memoria y la potencia de CPUs y GPUs haría que, con toda probabilidad esta "solución" fuera mucho más lenta que realizar los cálculos en tiempo real, como se hace en la actualidad. Y ni hablemos de sombras, brillos o reflejos... Lo de los desenfoques y demás tampoco es muy útil. No sólo son efectos relativamente costosos, en términos de procesamiento, sino que los ángulos de visión, puntos muertos, etc. dependen de la persona, del tamaño de la pantalla, y la distancia a la que esté sentada, además de que nada impide que en cualquier momento dirija la vista a cualquier punto de la pantalla, cosa que el juego no puede predecir. Y si cuando hablabas de seguimiento ocular te referías realmente a usar algún dispositivo físico, estaríamos creando más problemas de los que supuestamente resolvemos: hacer que el jugador tenga que invertir en un aparato potencialmente invasivo, inseguro, y a ver si tiene la velocidad necesaria para no introducir una latencia notable... en un videojuego se carga a tope de reslución todo el contenido de la pantalla, pero es cosa que los ojos humaos no pueden aprovechar..., por ejemplo, si miraiis lo que estais leyendo ahora y os dais cuenta ¿como os aparece el resto de la pantalla?, se ve difusa mientras mantengais la vista en un punto. De nuevo, no. Depende de cada caso, pero por lo general, especialmente en mundo abierto, y precisamente aprovechando el hecho de que en el mundo real nuestra visión es limitada, los juegos muestran modelos de distintas "resoluciones" (número de polígonos) según las posiciones de los objetos en pantalla, e incluso, como te dijo Serapis, a veces simplemente texturas planas. A medida que el jugador camina hacia ellos (y por ende, los "enfoca" mejor) se van mostrando modelos de mejor calidad. Te reitero, si quieres entender el tema, lee algún libro. Sin saber siquiera programación, no es muy racional creer que se te va a ocurrir alguna solución que nadie más haya pensado antes (lo digo por aquello que pusiste de "Una nueva rama de la ciencia del 3d simulado"), cuando cientos, sino es que miles, de expertos, entre matemáticos e ingenieros, llevan estudiando estos asuntos desde hace décadas, cuando no siglos. Todo lo que has comentado, incluyendo lo del campo de visión de los ojos y los puntos muertos, es bien conocido desde hace décadas al menos. Si algunas de tus ideas no se han implementado, es porque se encontró que no eran realmente útiles, o que había alternativas mejores, no porque a nadie se le hayan ocurrido.
|
|
|
80
|
Foros Generales / Dudas Generales / Re: Como unir 2 aplicaciones .exe en 1
|
en: 3 Marzo 2022, 02:36 am
|
Es que no estás siendo del todo claro, y así es difícil conseguir respuestas concretas. Esto: inyectar un .exe a un proceso que se este ejecutando, y que ese .exe se ejecute como debería ser, y que así, sean 2 .exe en un solo proceso es confuso. Das a entender que quieres que las instrucciones de los dos .exe se unan en uno sólo y se ejecuten como un único proceso. Por muchas razones, difícilmente vas a encontrar un programa general que lo haga (con un .dll sería otra cosa, pero tú hablas de dos .exe), y tampoco creo que sea realmente lo que quieres. Imagino que más bien lo que necesitas es simplemente que al abrir la aplicación ejecute los dos .exe simultáneamente (aunque obviamente sería como dos procesos distintos y lo de la inyección aquí no pintaría nada), que es más o menos lo que hace el programa del último link que pusiste. Si es así, como ya te dijeron, busca binders o joiners, que seguro alguno habrá que haga lo que quieres. Ahora, si sabes programar y te mueves con soltura dentro de la API de Windows, es relativamente sencillo hacer un programa que haga precisamente eso: a partir de dos .exe, generar un programa que los ejecute de manera simultánea. Si no encuentras nada hecho y te interesa probar a programarlo, te podría dar alguna orientación. No el código completo de un programa, pero sí alguna ayuda, que al final se supone que es el objetivo del foro.
|
|
|
|
|
|
|