elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


  Mostrar Mensajes
Páginas: [1] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... 24
1  Programación / Programación General / Re: ¿Cómo la PC usa los códigos? en: 2 Marzo 2024, 00:09 am
Lo que te aconsejaría es que simplemente programes como te sea a ti más conveniente. Incluso al crear programas en lenguajes que generan código nativo, como C y C++, determinar a priori si llamar a una función es más/menos rápido, genera código más/menos grande, etc. que escribir directamente el código, es prácticamente imposible, y si en algún lugar lees lo contrario, quien lo escribió no tiene idea de lo que habla. Únicamente analizando el código exacto en cada caso se pueden hacer estimaciones, y aún así es muy complejo y depende de muchas cosas.

Además, tú programas en Flash, el cual hasta donde sé, no compila el ActionScript a código nativo sino a byte code que el reproductor (ya sea el independiente o el que se incluye en los .exe) ejecuta, por lo que casi cualquier explicación general que te den, sea ChatGPT o una persona, te servirá de poco o nada. Sólo alguien que conozca a fondo cómo funciona internamente Flash 5 podría contestar bien tus preguntas. Yo te podría contestar cómo es en los programas nativos, pero es casi 100% seguro que nada de eso aplica para Flash, por lo que no le veo mucho caso.

Lo que podrías hacer es probar escribiendo código de una y otra forma y comparar su ejecución. A menos que notes una diferencia importante (y realmente lo dudo), lo mejor es, como te dije al inicio, que programes como te guste a ti.
2  Programación / Programación C/C++ / Re: ayudaaa tengo un problema con ERROR: Id returned 1 exit status en: 7 Diciembre 2023, 05:08 am
Como te dijo MAFUS, es error del enlazador o linker. En este caso me imagino que será porque en la línea 15 pusiste prinf en lugar de printf (falta la 't').

Como referencia futura, siempre hay que poner los mensajes de error completos, pues eso de "ld returned..." por sí solo no sirve de mucho. Por fuerza el compilador/linker debe haberte dado más información (algo tipo "undefined reference to prinf"). Si usas un IDE, probablemente eso lo encuentras en una pestaña llamada output, build log, build messages o similar.
3  Programación / Programación C/C++ / Re: campos de bits en: 5 Octubre 2023, 19:42 pm
Sí, además de su función principal, volatile puede ser útil al depurar, y en casos como éste, también puede ser válido. Ojo, en ningún momento pretendo decir que todos los ejemplos de los primeros mensajes estén "mal". Se entiende que son cosas que uno normalmente no usaría para cosas más reales (aunque no está de más decir que, aún en códigos simples de ejemplo, violar las reglas nos puede traer más de una sorpresa desagradable).

Pero hay gente, incluso aquí en el foro, que a veces intenta ya no sólo experimentar sino implementar cosas de bajo nivel en sus programas. Por ejemplo, hace poco un usuario estaba haciendo algo similar a un editor hexadecimal. Mis recomendaciones, y lo que sigue, son sobre todo para quien quiera hacer cosas así, "reales".

Primero, para saber más sobre el tema, se puede googlear "strict aliasing" que es como se conoce a la regla de la que hablo en mi mensaje anterior. Y hay unas cosas que es fundamental entender: 1) Esto lo recalco de nuevo, cuando un programa hace cosas que el estándar cataloga como "undefined behaviour", el resultado, y las acciones del compilador, se vuelven impredecibles y éste puede hacer lo que quiera y a menudo hace cosas distintas en versiones distintas. Otra referencia más en FAQ de C: https://c-faq.com/ansi/undef.html . 2) Las optimizaciones que el compilador hace son totalmente dependientes del contexto. Dado un conjunto de líneas, su optimización puede ser totalmente distinta si las metemos en un for, o en dos for anidados, o si hay un if, o si las variables a las que acceden son globales o locales, o parámetros recibidos, o si la función es inline, etc., casi cualquier cosa lo altera. 3) Si el programa está escrito correctamente, un compilador jamás va a cambiar su comportamiento observable y su funcionamiento. Los ejemplos anteriores fallan únicamente porque violan el strict aliasing. Si se cambian de manera que respeten esta regla (usando unsigned char*, por ejemplo) se arreglan de forma permanente.

El calificador volatile no es realmente solución; en todo caso, es un parche temporal. De nuevo, si se googlea sobre el tema, van a salir muchos resultados de fuentes confiables, ninguno de los cuales sugiere siquiera a volatile como solución (los pocos que lo mencionan básicamente dicen: "no arregla el problema. Si te sirve es suerte"). El propio Linus Torvalds dijo lo siguiente cuando alguien supuso que volatile servía para arreglar estos problemas: "sí, volatile podría funcionar, pero es como matar una mosca con una bomba atómica (...) y no hay garantía de que el compilador no haga las optimizaciones, aún con acceso volatile, así que de todas formas es un punto irrelevante".

En términos prácticos, con volatile el compilador desactiva optimizaciones relacionadas con el acceso a las variables calificadas de esta manera (ya no las elimina, y para cada lectura, se traen sus valores de la memoria, etc.), pero eso no tiene nada que ver con el aliasing, lo que pasa es que en algunos contextos, como mis ejemplos, la única optimización que hace el compilador al encontrar UB coincide, de forma fortuita, con las que deshabilita volatile. Pero hay toda una gama de cosas que el compilador puede hacer (eliminar instrucciones que producen UB, reordenarlas, etc.) que vuelven a romper los programas a pesar de usar este calificador. No quiero que salga un mensaje aún más largo de lo que es, y no le veo sentido a poner más ejemplos (siempre se puede encontrar un "parche" que arregle de momento el programa, y luego poner un nuevo ejemplo con las instrucciones  reacomodadas/cambiadas de manera que el parche no funcione, y luego otro parche, y así nos pasamos la vida, porque no estamos arreglando el problema) pero nada de esto es hipotético, pasa en la realidad. Por no hablar de otros problemas, como la alineación incorrecta. De esto también hay ejemplos reales, incluso en x86-64 (donde algunas instrucciones producen errores de violación de acceso si los datos no tienen una alineación específica), y derivados de violar el strict aliasing.

La única solución general es seguir las reglas del lenguaje, en este caso, respetar el strict aliasing. Usar punteros char o memcpy (con ciertas precauciones) son maneras válidas. De esta manera nos quitamos de cualquier preocupación. Los programas van a funcionar siempre, en cualquier compilador que acepte la versión del lenguaje elegido, y con cualquier nivel de optimización. Si forzosamente necesitamos acceder a datos mediante punteros a tipos incompatibles (en unas pocas ocasiones puede ser conveniente), lo que se debe hacer es compilar con -fno-strict-aliasing o equivalente. Esto le dice al compilador que vamos a violar el strict aliasing, y así sabe exactamente que debe desactivar las optimizaciones específicas a esta regla (y no otras que podrían o no arreglar estos problemas en un contexto dado). Y todo esto sin los problemas de rendimiento que trae volatile.
4  Programación / Programación C/C++ / Re: campos de bits en: 3 Octubre 2023, 02:48 am
Como aquí estamos poniendo sólo ejemplos ilustrativos, creo que es válido ver la representación interna de las variables de esa manera, pero reitero que lo mejor es usar un unsigned char* y recorrer con él los bytes de la estructura, ya que, en general, en C y C++ no es válido acceder a una variable mediante un puntero a un tipo distinto. Una excepción son los punteros a char (con o sin signo), los cuales sí se pueden usar con variables de otros tipos. Hay otras excepciones (por ejemplo, un puntero unsigned/signed puede acceder a datos signed/unsigned, siempre que sean del mismo tipo) pero son muy pocas.

Romper esa regla resulta en comportamiento indefinido o UB, y en ese caso los compiladores pueden hacer prácticamente lo que quieran. Pudiera parecer estos son sólo problemas teóricos, pero no es así, pues constantemente se encuentran problemas derivados de estos malos usos. Aquí pongo unos ejemplos:

Código
  1. #include <stdio.h>
  2.  
  3. typedef struct {
  4.    unsigned char codigo : 4;
  5.    unsigned short cantidad : 9;
  6.    unsigned char procedencia : 1;
  7.    unsigned char basura : 2;
  8. } producto_t;
  9.  
  10. producto_t* prod;
  11.  
  12. int main()
  13. {
  14.    unsigned base[2] = { 0 };
  15.    prod = (producto_t*)&base;
  16.  
  17.    prod->codigo = 5;
  18.    prod->procedencia = 1;
  19.    prod->cantidad = 4;
  20.    prod->basura = 3;
  21.  
  22.    printf("base     : %08x %08x\n", base[1], base[0]);
  23.  
  24. }

En GCC o MinGW, si se compila con -O2 o superior, la salida es:

Código:
base     : 00000000 00000000

Lo que pasó es que el compilador decidió optimizar el programa y dejar sólo esto:

Código
  1.    printf("base     : %08x %08x\n", 0, 0);

es decir, directamente imprime los valores con los que base fue inicializado. Puesto que *prod y base tienen tipos distintos e incompatibles, no es válido modificar base mediante ese puntero,  así que el compilador decide que base jamás fue modificado luego de su inicialización.

Otro ejemplo casi igual pero con un resultado todavía peor:

Código
  1. #include <stdio.h>
  2.  
  3. typedef struct {
  4.    unsigned char codigo : 4;
  5.    unsigned short cantidad : 9;
  6.    unsigned char procedencia : 1;
  7.    unsigned char basura : 2;
  8. } producto_t;
  9.  
  10.  
  11. producto_t* prod;
  12.  
  13. int main()
  14. {
  15.    unsigned base[2] = { 0 };
  16.    prod = (producto_t*)&base;
  17.  
  18.    prod->codigo = 5;
  19.    prod->procedencia = 1;
  20.    prod->cantidad = 4;
  21.    prod->basura = 3;
  22.  
  23.    base[0] = base[0];
  24.    base[1] = base[1];
  25.  
  26.    printf("base     : %08x %08x\n", base[1], base[0]);
  27.    printf("codigo: %u\n", prod->codigo);
  28.    printf("procedencia: %u\n", prod->procedencia);
  29.    printf("cantidad: %u\n", prod->cantidad);
  30.    printf("basura: %u\n", prod->basura);
  31. }

de nuevo, GCC y MinGW arrojan esta salida:

Código:
base     : 00000000 00000000
codigo: 0
procedencia: 0
cantidad: 0
basura: 0

por las mismas razones de antes.

Y esto no se limita a GCC, sino que cada compilador tiene sus "detalles". Por ejemplo, hace años alguien reportó un posible bug en clang. El ejemplo que puso era más o menos así:

Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.  int par[2] = { 1 };
  6.  int k = 0;
  7.  
  8.  for (int i = 0; i < 1; i++) {
  9.    if (par[1] > 0) {
  10.      *(short*)&par[0] = 5;
  11.    }
  12.    par[k++] = 0;
  13.  }
  14.  
  15.  printf("Esto deberia ser 0: %d\n", par[0]);
  16.  
  17. }

con -O1 o superior, en clang da esta salida:

Código:
Esto deberia ser 0: 1

Edit: corrijo números de línea
se supone que siempre debería ser 0 porque la última instrucción que se ejecuta antes del printf es la de la línea 12, pero el compilador hace lo que quiere, porque la línea 10 contiene UB (¡a pesar de que nunca se va a ejecutar, ya que la condición del if forzosamente será falsa!). Si se cambia el short* por char*, ahí la modificación ya es válida y el programa imprime 0, como se esperaba.

Estos ejemplos pueden parecer muy rebuscados o "artificiales", pero la realidad es que normalmente ese tipo de problemas se encuentran al estar trabajando en programas reales. Obviamente uno no va poner programas enteros en los foros o en reportes de bugs, así que se busca crear un ejemplo lo más básico y simplificado posible que muestre el problema, pero estas cosas ocurren todo el tiempo en programas de todo tipo y tamaño, y de hecho hay tanto debate al respecto, que hay muchas conferencias hablando sobre el tema y justificando (o no) lo que hacen los compiladores.

Como muchos otros programadores, no soy fan de optimizaciones tan agresivas como éstas, y para mí, el caso de clang debería considerarse un bug (si experimentamos un poco con el código, obtenemos resultados aún más raros), pero sus desarrolladores no piensan así, y nunca lo arreglaron. Técnicamente, el estándar de C (y C++) les da la razón. El caso es que esté o no uno de acuerdo, los compiladores hacen este tipo de cosas cuando encuentran código que viola el estándar, así que es mejor intentar apegarse a las reglas.
5  Programación / Programación C/C++ / Re: campos de bits en: 29 Septiembre 2023, 05:00 am
Como ya te recomendaron, es mejor que evites los campos de bits si puedes, ya que no tienes casi ningún control sobre la manera en que el compilador los almacena.

También hay unas cosas que creo que vale la pena comentar. Los compiladores tienen ciertas libertades con las estructuras, pero lo que hacen no es aleatorio, y además hay reglas que tienen que seguir. Si dejamos de lado de momento los campos de bits, tenemos algunas garantías con las estructuras: el compilador siempre colocará en memoria los campos en el orden en que los declaramos. Puede haber relleno (padding) entre algunos, pero el orden siempre se respeta. Y la dirección del primer campo es la misma que la de la estructura, es decir, está exactamente al inicio.

Luego, hay otras reglas no oficiales, pero que los compiladores en general siguen. Por ejemplo, los compiladores normalmente acomodan los campos de acuerdo a su alineación natural, es decir, en qué direcciones de memoria conviene que estén. Si para lograrlo deben meter bytes de relleno (padding), lo hacen. Esto en general se puede evitar declarándolos de manera que ya estén alineados (no basta con sólo agruparlos por tipo). No sé si quisieras información más detallada, pero como estás empezando en estos temas, a lo mejor te podría confundir.

Con los campos de bits es más complicado y depende del compilador y la arquitectura, pero tampoco es totalmente arbitrario. De nuevo, sin entrar en detalles, baste decir que tiene sentido la manera en que los está organizando y ordenando el compilador en este caso y que, aunque acostumbramos leer de izquierda a derecha, en realidad los dígitos se enumeran de derecha a izquierda.

En los últimos ejemplos, el problema principal  es, como ya te dijeron, el hecho de usar union. Y esto no sólo aplica a las estructuras, sino que, en general, se supone que sólo uno de sus miembros es válido en un momento dado: el último que hayas modificado. Es decir, si haces esto:

Código
  1. vec.producto.codigo = 5;

lo más correcto sería que, a partir de ahí, consideres a vec.empaquetado como inactivo o "inválido" y no accedas a él. Si después modificaras el otro miembro:

Código
  1. vec.empaquetado = loquesea;

ahora este miembro es el activo y vec.producto se inactiva, y así sucesivamente.

De hecho, en C++ es incorrecto acceder al miembro "inactivo" (aunque compila y en general funciona, técnicamente no es válido). En C se permite y a veces se hace, pero no se recomienda, pues puede dar pie a errores.

Finalmente, para ver la representación interna de una estructura, es mejor usar punteros a unsigned char, no unions, y menos mediante un miembro entero, pues ¿qué tipo de dato debería tener empaquetado, si no sabemos a priori cuál es el tamaño de la estructura producto_t? Eso es parte del problema que se está dando, ya que en el ejemplo la estructura ocupa 6 bytes, pero empaquetado es unsigned short int (2 bytes) o unsigned int (4 bytes). No es que procedencia y basura estén escondidos o perdidos; están ahí, pero empaquetado no tiene el tamaño suficiente para mostrarlos. Se podría cambiar a un tipo de dato de 64 bits (aunque ya no se podría usar el especificador %X para imprimirlos sino que habría que recurrir a la macro PRIX64), pero  de nuevo, esta no es una manera aconsejable de usar union y estamos adivinando qué tamaño tendrá la estructura.  Lo mejor, reitero, sería usar un unsigned char* que apunte a la dirección de vec.producto, y vaya recorriendo por sus bytes y mostrándolos. O en todo caso, si no quieres usar punteros, puedes hacer que empaquetado sea arreglo de caracteres como lo hacías originalmente:

Código
  1. unsigned char empaquetado[sizeof(s_producto)];

y vas iterando, desde 0 hasta sizeof(s_producto) - 1:

Código
  1. printf("%02X  ", vec.empaquetado[i]);

aunque, dado que la arquitectura x86 (y x86-64) es little-endian (es decir, se almacena primero el byte menos significativo, o más a la derecha), los datos te aparecerían de manera inversa a la que probablemente esperarías, por lo que tal vez sea mejor mostrarlos al revés, iterando desde sizeof(s_producto) -1 hasta 0.
6  Programación / Programación General / Re: Ayuda con cálculos para que la trayectoria de una pelota cumpla ciertas condiciones. en: 17 Mayo 2023, 03:01 am
Pienso lo mismo pero en mis ejemplos no parece ocurrir. ¿No?

Pues es que si el método y la gravedad no son correctos, los resultados tampoco lo serán.

Citar
Debes que imaginar que el jugador es perfecto en cuanto a inteligencia y puntería y quiere que la bola caiga en cierto punto, para lo cual usará toda la fuerza que pueda (según la que tenga, en ese sentido no es perfecto), no la mínima necesaria; no hará globitos si puede hacer que el tiro sea rápido y pase cerca de la red. No sé si has entendido eso.

Claro. Pero el párrafo de donde sacaste esa frase es hipotético. Ya sé que no buscas la fuerza mínima necesaria, pero lo usé como ejemplo para explicar la relación entre el ángulo la y distancia recorrida.

En cuanto a tu código, tienes varios errores. Fíjate bien lo que te puse, y de ser necesario, ve las  explicaciones de mensajes anteriores, porque además te estás saltando algún paso. Por ejemplo, aquí:

Código:
DistanciahastaRed = DistanciahastaDestinoXY*Math.abs(RedZ-BallZ)/Math.abs(DistanciahastaDestinoY);

En vez de RedZ-BallZ va RedY - BallY.

Luego, como te comenté (y expliqué con más detalle en mi segundo mensaje), si Disc es negativo, no puedes hacer el tiro, no tienes la fuerza necesaria, así que ya ni siquiera tiene sentido calcular los ángulos y todo lo demás. En todo caso, podrías escoger un nuevo destino más cercano, como lo mencionaste en relación al punto 5, y repetir el procedimiento a ver si este sí lo puedes hacer.

Además, fíjate que después de calcular AlturaEnRedTheta y AlturaEnRedPhi puse:

Citar
Si ambos pasan por encima, elige el más alto o bajo, según prefieras

Pero tú ya directamente supones que ambos lo hacen y pasas a elegir el ángulo más bajo. Primero debes comprobar si alguno de los ángulos pasa por arriba de la red. Si sólo uno de los ángulos lo hace, obviamente lo tienes que usar, no hay otra opción. Únicamente si ambos pasan sobre la red, toca elegir el más bajo o alto. Y naturalmente, si ninguno lo consigue, toca aquí también elegir nuevo destino o lo que quieras.

Citar
Ah, el tema del pique se me complica, mejor luego del pique vuelvo al método simple de sumar ¿no?

Pues sí, podrías probar en ese caso tu método simple. Al final lo que estás haciendo es un juego y no una simulación perfecta, así que puede que con eso tengas un resultado aceptable.

En relación a lo anterior, este cálculo no es correcto:

Código:
    BallZSpeed = BallZ-BallZAnterior;

porque simplemente te daría la velocidad promedio a lo largo del último intervalo de tiempo, en este caso, el último segundo (porque creo que incrementas el tiempo un segundo a la vez, ¿no?), pero tú lo que buscas es el valor de la velocidad en el instante actual, que es distinto. La forma de hacerlo sería esta:

Código:
    BallZSpeed =  VelocidadZ - Gravedad * Tiempotranscurridodeltiro;

Una última cosa: supongo que estás usando escalas adecuadas, ¿no? Por ejemplo, suponiendo que quisieras modelar una cancha con longitud de 20 m, y que en el juego mida 400 pixels, esto significaría que cada metro equivale a 20 pixels (400 / 20 = 20). Si eliges arbitrariamente la gravedad y le pones 1 pixel/s2, por ejemplo, vas a tener resultados absurdos, porque eso significaría que la gravedad equivale a 1/20 m/s2 = .05 m/s2. ¡Más débil incluso que en la luna! Para tener resultados coherentes, debes elegir valores realistas para la gravedad, fuerza, altura inicial y altura de la red, y multiplicarlos por este factor de escala. Siguiendo con este ejemplo, sería: Gravedad = 9.8 m/s2 * 20; AlexFuerzadetiros = 25 m/s * 20; etc.
7  Programación / Programación General / Re: Ayuda con cálculos para que la trayectoria de una pelota cumpla ciertas condiciones. en: 14 Mayo 2023, 21:21 pm
Aquí va el procedimiento resumido. Las explicaciones ya están en mis otros mensajes, y de hecho, aquí prácticamente me limité a copiar y pegar, además de cambiar algunos nombres de variables.

En todos los siguientes cálculos, h se refiere a la altura inicial de la pelota y v0 es la velocidad inicial o la fuerza del personaje.

Primero, conviene sacar aquí este resultado intermedio, pues sirve para determinar ciertas condiciones y  ahorrar cálculos:

Código:
Disc = v0 * v0 * v0 * v0 - (g * (g * DistanciahastaDestinoXY * DistanciahastaDestinoXY - 2 * v0 * v0 * h))

Si Disc < 0, no puedes hacer el tiro
Si Disc == 0, hay un solo angulo posible
Si Disc > 0, hay dos angulos

Se calcula el ángulo o ángulos (raiz es la raíz cuadrada):

Código:
theta = arctan((v0 * v0 + raiz(Disc)) / (g * DistanciahastaDestinoXY))
phi = arctan((v0 * v0 - raiz(Disc)) / (g * DistanciahastaDestinoXY))

Se calcula el tiempo que se tarda en llegar a la red:

Código:
DistanciahastaRed = DistanciahastaDestinoXY * abs(RedY - BallY) / abs(DistanciahastaDestinoY)
TiempoHastaRedTheta = (DistanciahastaRed) / (v0 * cos(theta))

Y si hay dos ángulos, lo mismo para el segundo:

Código:
TiempoHastaRedPhi = (DistanciahastaRed) / (v0 * cos(phi))

Luego se calcula la altura a la que pasan al llegar a la red. Esto es igual que como lo puse en mi primer mensaje, pero como ahí todavía suponía que la altura inicial era cero, no incluía la variable h. Así es como debería quedar:

Código:
AlturaEnRedTheta = h + v0 * sen(theta) * TiempoHastaRedTheta - (g * TiempoHastaRedTheta * TiempoHastaRedTheta) / 2
AlturaEnRedPhi = h + v0 * sen(phi) * TiempoHastaRedPhi - (g * TiempoHastaRedPhi * TiempoHastaRedPhi) / 2

Si ambos pasan por encima, elige el más alto o bajo, según prefieras. A ese ángulo elegido, lo llamaré a partir de aquí angulo, a secas.

Calculas las velocidades:

Código:
VelocidadAdelante = v0 * cos(angulo)
VelocidadArriba = v0 * sen(angulo)

// Esta variable es redundante, pero clarifica lo que se esta haciendo
VelocidadZ = VelocidadArriba

si (DistanciahastaDestinoX == 0)
   BallYSpeed = VelocidadAdelante
   BallXSpeed = 0
sino
   AnguloPendiente = arctan(DistanciahastaDestinoY / DistanciahastaDestinoX)
   BallXSpeed = VelocidadAdelante * cos(AnguloPendiente)
   BallYSpeed = VelocidadAdelante * sen(AnguloPendiente)

Todo lo anterior sólo lo necesitas hacer al inicio del tiro. Luego, en cada instante de tiempo que transcurra, se debe actualizar la posición de la pelota y dibujarla. Como desde el principio querías conocer las velocidades para cada dimensión, imagino que en cada iteración haces algo como esto:

Código:
BallX = BallX + VelocidadX
BallY = BallY + VelocidadY

Estos valores (coordenadas de la pelota) también se podrían obtener a partir de la ecuación para x que te puse al inicio de mi primer mensaje, y que calcula las posiciones en función del tiempo, pero si te es más simple hacerlo con las velocidades, lo puedes dejar así. Obviamente, si en la representación en pantalla la pelota va hacia arriba y a la izquierda, las velocidades en x e y deben ser restadas. En el caso de la altura (z), puesto que está sometida a una aceleración (la gravedad), la velocidad vertical está cambiando constantemente, así que no la puedes sacar de esa manera, sino que hay que hacerlo en función del tiempo. Aquí t se refiere al tiempo transcurrido:

Código:
BallZ = h + VelocidadZ * t - (g * t * t)/2

Por cierto, esto también se podría calcular con la fórmula para el movimiento con aceleración constante que te puse dos o tres mensajes atrás cuando preguntaste sobre la gravedad.

No estoy tomando en cuenta lo que pones en la condición 5, pero como dijiste más arriba, sólo sería cuestión de cambiar el destino.
8  Programación / Programación C/C++ / Re: Programa para cifrar archivo de texto en: 14 Mayo 2023, 17:29 pm
Se me pasó este detalle: las bibliotecas están en la sección CXXFLAGS de tu makefile. Es en LIBS donde deberían ir. Si pusiste -lssl y -lcrypto en la sección de parámetros para el compilador en Dev-C++, ese fue el error. Deberías haberlo hecho en los parámetros para el enlazador/linker. Eso debería arreglar el problema, si aún te interesa hacerlo en C++.
9  Programación / Programación C/C++ / Re: Programa para cifrar archivo de texto en: 12 Mayo 2023, 21:10 pm
¿Pero hiciste siquiera lo que te dije de asegurarte de que esos archivos .a estén en la ruta indicada: "C:/Program Files/OpenSSL-Win64/lib"? No en un subdirectorio de esa ruta sino en esa ruta exacta. Primero verifica eso, pues si no están ahí, el problema no se va a arreglar mágicamente instalando y desinstalando cosas sino configurando la ruta correcta. Y eso es con todos los compiladores.
10  Programación / Programación General / Re: Programacion Paralela calculo aceleracion maxima de un algoritmo paralelo para n procesadores en: 12 Mayo 2023, 04:23 am
¿Hamdal? Si te refieres a la ley de Amdahl, la fórmula que buscas es:

1 / (1 - p + p/n)

donde p es la fracción que se puede ejecutar en paralelo, y n el número de procesadores.
Páginas: [1] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... 24
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines