03d2ece7d6
Las preferencias (pasos pequeños, pistas por niveles, chuleta) pasan a CLAUDE.md para que estén en las dos máquinas. PROGRESO.md tiene ahora una sección de pendientes por máquina. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
5.5 KiB
5.5 KiB
Progreso
Estado actual
- Fase 2: buffer dinámico. La Fase 1 está cerrada en Fedora, pero falta probarla en Windows.
- Paso actual: 2.3b.
hello.cya usa biengoto cleanup(punteros aNULLuno por línea,result, un soloreturn), sin avisos con gcc ni clang, y Valgrind limpio. Faltaescpos_buffer_append: el parámetro con la cantidad,const, reservarlen + cantidad,memcpyy el comentario de la cabecera. Ahora copia 1 byte (sizeof *byte). - Máquinas: sobremesa con Windows (MSYS2 UCRT64) y portátil con Fedora 42 (gcc 15.2, clang 20, make 4.4, gdb 17, valgrind 3.26). Ver "Pendiente por máquina".
Pendiente por máquina
Windows (sobremesa)
- Al llegar:
git pullen la terminal UCRT64 y comprobargcc,makeygdb. Si falta algo:pacman -S mingw-w64-ucrt-x86_64-gcc mingw-w64-ucrt-x86_64-gdb make. - Cerrar la Fase 1:
maketiene que generarbuild/hello.exe. Falta en el Makefile elifeq ($(OS),Windows_NT)dedocs/06-make.md.mkdir -pyrm -rfsolo funcionan en la shell de MSYS2. - Probar F5 en VS Code:
.vscode/ya tiene la configuración de Windows con rutasC:/msys64/ucrt64/.... - El 2.3b se puede avanzar aquí; la comprobación de memoria queda para Fedora.
Fedora (portátil)
- Validar con valgrind el 2.3b cuando esté hecho (y con ASan/UBSan antes de cerrar la Fase 2).
Hecho
include/escpos.h+src/escpos.cconescpos_version(), yhello.cque la usa. Compila y enlaza a mano en Windows y en Fedora.samples/hello_world.bin: ESC @, texto, LF, ESC d 5, GS V 0.- Emulador ESC/POS en Go (
emulator/) para probar sin gastar papel. - Makefile con regla patrón,
cleany.PHONY. Compila desde un clon limpio y sin avisos con gcc y con clang. - 2.1:
escpos_buffer_new/escpos_buffer_freecon tipo opaco. Valgrind limpio, y fuga provocada a propósito para leer el informe. - 2.2:
escpos_buffer_append_byteconrealloc: 64 bytes al principio, luego el doble. Comprobado con 100 bytes (crece de 64 a 128). Valgrind limpio. Sin elfree, Valgrind da 24definitely+ 128indirectly. - 2.3a: crecimiento extraído a
static int buffer_reserve(buffer, min_cap): arranca en 64 o encapy dobla hasta que cabe; un únicorealloc.
Conceptos de C aprendidos
- Etapas de compilación, unidades de traducción, cabeceras, include guards,
staticpara encapsular,nmy errores del enlazador. - Cadenas terminadas en
'\0',const char *,'A'frente a"A". - Memoria virtual de un proceso, modo usuario y modo núcleo.
VmSizefrente aVmRSS, overcommit y OOM killer. - Make: reglas, dependencias por fechas, variables, regla patrón con
$@ $< $^,.PHONY. - Pila y montón,
malloc/free/realloc,NULL, propiedad de punteros, tipo opaco,typedef,->,uint8_t/size_t, qué tipo usar. - Liberar en caminos de error sin
defer: patróngoto cleanup. - Depuración: segfault (139),
free(): invalid pointer(134), gdb básico, y leer errores e informes de fugas en Valgrind.
Forma de trabajar
- Desde el 2026-10-02: sin vibecoding. Enunciado y pruebas, predicción antes de compilar, y pistas por niveles solo si las pide. Ante un error, primero su diagnóstico.
Decisiones de diseño
- Prefijo
escpos_para toda la API pública. escpos_bufferes un tipo opaco: declarado enescpos.hy definido ensrc/buffer.c. Camposuint8_t *data,size_t lenysize_t cap.- Crecimiento del buffer: 64 bytes al principio y luego el doble.
- Por ahora, las funciones que pueden fallar devuelven
int:0si va bien y-1si no hay memoria. Pendiente de cambiar a códigos de error propios. - Estilo: nombres en
snake_casey llave de apertura en línea aparte (estilo Allman) en funciones, structs y bloques. - Lo generado va en
build/, que se crea en las recetas conmkdir -py no se versiona.
Pendiente / puntos débiles
- Fase 1: probar el Makefile en Windows (MSYS2), con el sufijo
.exe. .gitignorecreado. Siguen versionadosemulator/escpos-emu.exeygoruntime/goruntime.exe.- Make: le costó entender que va hacia atrás desde el objetivo y que una regla
patrón es una plantilla. Repasar con
docs/06-make.md. - Punteros: le cuesta saber cuándo hace falta
*y cuándo no, y distinguir la dirección del bloque (data) de una casilla (data[i]). Le funciona la analogía de papel y casa. Reforzar con ejemplos de su propio código. - Tipos: usó
uint8_tpara un código de retorno. Repasar la tabla "Qué tipo usar" dedocs/08-structs.md. - Valorar añadir
-WconversionaCFLAGS: detecta conversiones con pérdida que gcc no avisa por defecto. - Bucles: en
buffer_reservecalculaba cada vuelta a partir de un valor que no cambiaba (buffer->cap) o que empezaba en 0, y eso daba bucles infinitos. Lo resolvió siguiendo los valores vuelta a vuelta. Seguir pidiéndole trazas a mano. - Declaraciones múltiples: escribió
escpos_buffer *a, *b, *c = NULL;creyendo que las tres valíanNULL(solo la última). Lo detectó clang con-Wsometimes-uninitialized. Ahora declara una variable por línea. - Variables locales sin inicializar: creía que valían
NULLcomo en Go. - Impresoras físicas: sin registrar marca y modelo.
- Confunde puntero colgante ("se pierde") con fuga. Tampoco tenía claro por qué
el slice viejo es seguro en Go tras
append(el GC no libera el array viejo, no es por la copia). Repasar con la tabla de docs/07-dynamic-memory.md.
Otros
goescpos/: equivalente en Go idiomático (bytes.Buffer) de lo hecho hasta ahora, para comparar.