Sesión 07: Programas y Make
LCG generando números aleatorios
- LCG = Linear Congruential Generator
- Algoritmo que genera números pseudoaleatorios utilizando una ecuación lineal: Xn = (a * Xn-1 + c) mod m
- Observa y piensa en los resultados que va a dar el generador para valores a = 7, c = 1, m = 11 empezando con una semilla X0 = 0.
- Y veamos un programa C
lcg1.c
con el que aprenderemos algunos recursos nuevos del lenguaje, es un programa que imprime un ciclo completo del generador (puedes copiar y pegar en tu editor, salvar el fichero, ¡no compiles aún!):
|
|
Make
- ¿Ya cansada de
gcc -Wall -Werror ...
? - Todos los lenguajes de programación tienen herramientas de construcción de programas para evitar esta cosa tan fatigosa. Por ejemplo:
pip
en Python,npm
en Javascript,gradle
en Java, etc. - En C la herramienta de construcción de programas se llama Make (
make
en linea de comandos). - Para poder usar la herramienta
make
primero hace falta crear un fichero *Makefile de nombreMakefile
(omakefile
). - Vamos a crear un fichero
Makefile
con el siguiente contenido:
|
|
- Y ahora prueba a ejecutar
make
en la línea de comandos (quizás tengas que instalarlo). - Deberías ver algo como esto, obsérva:
|
|
- Ya tienes el ejecutable disponible, compruébalo con
ls -al
- Y ahora sí, ejecuta, deberías ver algo como esto:
|
|
Makefile explicado
- Primera línea: variable con nuestros flags de compilación
|
|
- Las otras dos líneas (!cuidado que la segunda tiene un tabulador que es obligatorio!):
|
|
- Esas dos líneas componen una regla de make que dice: “para construir el fichero
lcg1
necesitas el ficherolcg1.o
y entonces tienes que ejecutar la orden$(CC) $(CFLAGS) -o lcg1 lcg1.o}
- Hay una duda razonable que es ¿por qué no hay una regla para construir el fichero
lcg1.o
? ¿algo como esto? (observa detenidamente)
|
|
- La respuesta es que
make
tiene algunas reglas por defecto. - Para conocer las reglas por defecto del Make de tu sistema ejecuta
make -p
en línea de comandos.
La inteligencia del Make
make
utiliza los tiempos de modificación de los ficheros para saber si tiene que volver a realizar las tareas o no.- En un mismo fichero
Makefile
se pueden escribir varias reglas - ¿Qué pasa si ejecutas
make lcg1
por segunda vez? - ¿Por qué crees que pasa eso? ¿Qué pasa si modificas
lcg1.c
y ejecutasmake lcg1
? ¿Por qué crees que pasa eso?
Include, macros, variables globales y locales
- Atiende a las explicaciones del profe en la disección de
lcg1.c
Recursión
- Este es un ejercicio muy cortito en el que vamos a explorar la recursión
- El siguiente programa
sum1.c
imprime en pantalla la suma de los números de 1 a 10 ejecutando una función que va realizando la suma uno a uno de forma recursiva:
|
|
- Guarda el fichero y añade una regla al
Makefile
(las reglas hay que separarlas por al menos una línea en blanco) para crear el ejecutable de forma automática. - Compila con
make
y ejecuta el programa./sum1
- Prueba a cambiar el valor de
n
: 1 000, 100 000, 500 000 (recuerda que tras cada modificación tienes que ejecutarmake sum1
y luego./sum1
o en una misma línea puedes hacermake sum1 && ./sum1
) - Eventualmente tendrás un problema, algo como
|
|
- El programa se rompe con un stackoverflow (desbordamiento de pila) y genera un volcado de toda su huella en la memoria en un fichero que se llama
core
(si no ves el ficherocore
prueba de nuevo ejecutando antesulimit -c unlimited
)