Les vencimos

1º Bachillerato · TIC I

Lección 29 · C · Programación

Depuración y buenas prácticas

1º Bachillerato · TIC I · Decreto 40/2022 CyL

Objetivos

  1. Clasificar errores de sintaxis, de ejecución y de lógica.
  2. Leer un mensaje de error por la línea y la causa, no por el susto.
  3. Corregir el índice fuera de rango y un = colado en una condición.
  4. Decir qué hace un compilador y qué hace un intérprete cuando el texto está mal.
  5. Elegir una licencia de código y no confundirla con una licencia de un texto o una foto.

Explicación

Depurar es buscar la distancia entre lo que el programa hace y lo que querías que hiciera, y cerrarla cambiando el texto, no cambiando el deseo en la memoria. El bloque C pide depuración junto a la sintaxis. No es un trámite final: es la mitad del trabajo en cuanto el avisador se sale del ejemplo de cuatro líneas.

Tres familias

El error de sintaxis es una frase que el lenguaje no reconoce: falta un fin, sobra un carácter, una cadena sin cerrar. No hay ejecución útil. El compilador de Arduino se para antes de grabar; el intérprete de esta página se para en esa línea. El error de ejecución ocurre con un texto legal que pide un imposible: dividir por cero, leer lecturas[3] cuando solo hay índices 0, 1 y 2. El mensaje existe, y nombra la línea. El error de lógica no tiene mensaje. suma acaba en 6 y tú querías 10;
1 + 2 = 3
3 + 3 = 6
6 + 4 = 10 el LED se enciende con 500 porque escribiste <= en vez de <. El programa está «bien» para el intérprete y mal para el patio.

Por eso la traza no es opcional en los errores de lógica. No hay un subrayado rojo. Tienes la tabla del cuaderno y el entorno del laboratorio. Si no coinciden, el fallo está en uno de los dos, y los dos se pueden releer. Sospechar del sensor, de la placa que no está conectada o del «canvas que va mal» es la última hipótesis, no la primera. En esta página no hay sensor.

Cómo se lee un mensaje

«Línea 4: índice 3 fuera del vector (longitud 3)» dice dónde y qué. No dice «fracaso». La línea 4 es la del acceso, aunque la causa sea el hasta de la línea 3. Se lee el hasta, se cuenta 0, 1, 2 y se ve que la tercera vuelta, i = 3, no cabe. Se corrige una cosa cada vez y se vuelve a ejecutar. Corregir tres cosas a la vez también «arregla» el ejemplo y te deja sin saber cuál era la causa. Eso no es depurar: es barajar.

Compilador e intérprete, otra vez

El IDE de Arduino compila: analiza todo el sketch y, si la sintaxis falla, no graba. Un warning a veces no detiene, y por eso se leen y no se esconden. El navegador interpreta JavaScript cuando la página corre: un fallo de sintaxis en un script impide ese script; un fallo de ejecución salta en el momento de la línea. El pseudocódigo de aquí lo interpreta el botón Ejecutar, que es un programa escrito para el aula, no el compilador de la UNO. Un sketch correcto compilado puede seguir teniendo un error de lógica: la placa hará exactamente el if equivocado, a toda velocidad y sin consola, salvo que tú hayas puesto un Serial.print. En el aula, la consola es esta caja de salida.

Licencia del código

El código también tiene autor y condiciones. No es el mismo papel que la foto o el texto del bloque B. Una licencia de software dice qué puede hacer otra persona con el programa: copiarlo, modificarlo, vender un aparato que lo incluye, y si debe publicar los cambios. MIT es corta y permite casi todo a cambio de mantener el aviso de autor. Apache-2.0 se parece en el permiso y añade cláusulas de patentes. GPL exige que, si distribuyes el programa modificado, entregues también el código bajo la misma licencia: el famoso copyleft. Un programa propietario no concede esos permisos. «Está en internet» no es una licencia. «Creative Commons» vale para textos, fotos y vídeos; no es la forma habitual de licenciar un sketch, y mezclarlas sin leerlas produce atribuciones falsas.

En la memoria del proyecto basta con tres cosas honestas: qué código es tuyo, qué código has copiado y bajo qué licencia está lo copiado, y que el ejemplo de esta página es material de aula para aprender, no una librería que publiques como tuya. El micromecenazgo y las licencias de contenidos se trabajaron en el bloque B. Aquí no se reabre una campaña: solo se evita regalar o apropiarse de un programa por no mirar el archivo LICENSE.

El interruptor como oráculo falso

Puedes dejar el LED simulado en ON con la mano mientras el programa calcula LOW. Las dos cosas se ven a la vez: el rótulo HIGH del interruptor y el valor de la variable. Depurar es explicar la diferencia, no mover el interruptor hasta que «quede como la demo». Si los dos coinciden y el patio real no, entonces sí toca hablar del sensor, y esa frase solo es creíble después de la traza.

Fallo marcado y traza 1 leer 2 sumar 3 índice 4 4 comparar traza i = 0 suma = 100 i = 1 suma = 240 i = 2 suma = 360 i = 3 fuera
Solo los dos primeros paran con mensaje. El de lógica exige traza. La licencia no arregla el índice, pero evita otro problema distinto.

Glosas de esta lección

Sintaxis. El texto no pertenece al lenguaje. No llega a hacer el algoritmo.

Ejecución. El texto es legal y la orden es imposible en ese momento.

Lógica. Hace otra cosa de la que querías, sin quejarse.

Línea. El número del mensaje. Se mira esa y la anterior, no el archivo entero al azar.

Traza. La herramienta de los errores que no se subrayan.

Compilador. Traduce antes de ejecutar. El IDE de Arduino. Si la sintaxis falla, no graba.

Intérprete. Ejecuta el texto. El navegador con JavaScript; esta página con el pseudocódigo.

MIT. Licencia permisiva: se puede reutilizar conservando el aviso de autoría.

GPL. Copyleft: al distribuir modificaciones hay que ofrecer el código bajo GPL.

CC. Familia de licencias de contenidos, vista en el bloque B. No sustituye a MIT o GPL para un programa.

Ejemplos resueltos

Ejemplo 1 — Índice de más

El ejemplo inicial usa hasta lecturas.longitud con tres casillas. Ejecutar señala el índice 3. Se cambia a longitud - 1. La suma pasa a 1320 y la media a 440.
420 + 510 = 930
930 + 390 = 1320
1320 ÷ 3 = 440 440 no se escribe a mano.

Ejemplo 2 — Un igual

si s = 1320 dentro de la condición. La pista pide una comparación. Se usa ==. Hasta que no se cambia, no hay un «sí» fiable.

Ejemplo 3 — Lógica del umbral

El programa compila, la media es 440 y el LED enciende porque alguien escribió <= 440 para el ensayo y el umbral acordado era 500. No hay mensaje. La tabla de la lección 25 lo caza.

Decisiones de aula

Cada caso es una entrega del avisador del patio del IES Duero (Aranda de Duero). Lee la situación antes de la decisión.

1. Arreglar de tres en tres

Situación. Se cambia el hasta, el umbral y el nombre a la vez, y «ya funciona».

No conviene. Porque hay prisa por la demo.

Decisión. Un cambio, una ejecución, una frase de qué ha cambiado en la salida.

Por qué: Cambiar a la vez el hasta, el umbral y el nombre, y decir que ya funciona, impide saber cuál de los tres era el fallo. La próxima vez repetirás los otros dos por superstición. Un cambio, una prueba, y se anota qué se tocó.

2. Esconder el warning

Situación. El IDE avisa y se baja el nivel de avisos a cero.

No conviene. Para ver el panel limpio.

Decisión. Leer el aviso. Muchos son índices y variables que no se usan, precisamente temas de esta lección.

Por qué: Bajar los avisos a cero deja el panel limpio y el programa silenciado, no correcto. Muchos avisos son un índice fuera de rango o una variable sin uso que mañana será el bug. Se lee el aviso antes de esconderlo.

3. Código de un foro

Situación. Se pega una función de media sin autor ni licencia.

No conviene. Porque funciona y «está publicada».

Decisión. Reescribir la media, que ya sabes hacer, o copiarla citando autor y licencia si de verdad es una librería.

Por qué: Pegar una función de media de un foro porque «está publicada» no regala la licencia, y una función de cuatro líneas no merece un plagio. Publicado no significa regalado. Se reescribe la media, que ya sabes hacer, y se cita si de verdad usas obra ajena.

4. Echarle la culpa al GPIO

Situación. El LED simulado no coincide y se concluye que la página está rota.

No conviene. Porque el dibujo es más visible que la variable.

Decisión. Comparar la variable pin o estado con el interruptor y decir cuál manda.

Por qué: Si el LED simulado no coincide, concluir que la página está rota confunde la mano con el programa. El interruptor es la mano; la variable es lo que el código decidió. Depurar empieza por no mezclarlos y por leer la traza antes de tocar el dibujo.

El mismo avisador, en tres lenguajes

El problema no cambia: si la luz del patio del IES Duero baja de 500, hay que avisar. Cambia quién ejecuta. El pseudocódigo lo ejecuta el laboratorio de esta página. El sketch lo compilaría el IDE de Arduino hacia la UNO. El fragmento de Python lo ejecutaría una Raspberry Pi con gpiozero, si hubiera placa. Aquí no hay placa.

Mal a propósito

Con tres casillas, i llega a 3 y el laboratorio se para. El arreglo es hasta lecturas.longitud - 1.

para i = 0 hasta lecturas.longitud
  s = s + lecturas[i]
fin

Lo que un compilador ve

i <= 3 visita cuatro índices. El compilador a veces ni avisa. Es un error de lógica o de ejecución según el entorno, y en la placa es peligroso. La condición segura es i < 3.

int lecturas[3] = {420, 510, 390};
int s = 0;
for (int i = 0; i <= 3; i++) {   // i == 3 se sale
  s = s + lecturas[i];
}

Licencia en la cabecera

Tres líneas. No convierten el trabajo en un producto, pero impiden que alguien lo publique como anónimo o que tú pegues el de otra persona sin mirar.

// Avisador de patio, departamento de Tecnología.
// Autor: grupo de 1º, IES Duero, 2026.
// Licencia: MIT. Ver LICENSE si el archivo se publica.

El mismo síntoma, tres causas

Qué vesFamiliaMensajeQué se toca
Falta un finsintaxissíel texto, antes de fiarte de la media
Índice 3 de 3 casillasejecuciónsí, con líneael hasta, a longitud-1
LED encendido en el empatelógicanola condición, con la traza del 500
Código de un foro firmado por tilicencianola cabecera o reescribir

La cuarta fila no se arregla ejecutando otra vez. Se arregla diciendo de quién es el programa. Confundirla con un bug de índice es una manera de no mirarla.

Lectura guiada

Corrige el ejemplo y anota la media que sale (440 para 420, 510 y 390).
420 + 510 = 930
930 + 390 = 1320
1320 ÷ 3 = 440 Luego mete un cuarto valor y predice la media antes de ejecutar. Si fallas, no es el intérprete: es la división o el índice. Vuelve a la tabla de la lección 27.

Añade un si s = 0 a propósito, ejecuta, lee la pista y quítalo. Querer ver el error una vez es mejor que tenerle miedo. El mensaje es parte del material, no una reprimenda.

Escribe las tres líneas de licencia en el cuaderno, con tu nombre o el del grupo. Si usas solo código tuyo, dilo. Si un día añades una librería, su LICENSE manda en ese archivo y no se pisa con el tuyo.

Errores que se repiten

Rúbrica de esta lección

CriterioAún noEn procesoConseguidoNotable
Clasificar«No va»Todo es sintaxisDistingue las tres familiasSabe cuál no da mensaje
MensajeNo lo leeLee y no toca esa líneaCorrige la causaUn cambio cada vez
LógicaNo hay trazaTraza decorativaLa tabla caza el <=No culpa al GPIO simulado
CompilarSe confunde con ejecutarLo nombraIDE frente a botón EjecutarUn sketch compilado puede estar mal
LicenciaCopia sin mirarDice «de internet»Separa código propio y ajenoNombra MIT o GPL y no la confunde con CC

Mini cierre

Sintaxis y ejecución hablan. La lógica no. Se depura con la línea, con una traza y con un cambio cada vez. La licencia se escribe aunque el programa sea de aula.

Comprueba

Abre cada pregunta, responde en el cuaderno y después mira la solución. El párrafo «Por qué» es la parte que se estudia.

1. El laboratorio dice que el índice 3 no existe y hay tres lecturas. ¿Cuál es la corrección, y por qué no vale borrar el vector?

Respuesta. El para debe llegar hasta longitud - 1. Borrar el vector esconde el síntoma y elimina los datos.

Por qué: Con tres lecturas, el índice 3 no existe: las casillas son 0, 1 y 2. El para debe llegar hasta longitud menos uno, que es lo que el mensaje ya está diciendo. Borrar el vector esconde el síntoma y elimina los datos que había que promediar.

2. ¿Por qué un sketch que compila puede encender el LED al revés?

Respuesta. Porque el compilador no conoce el umbral acordado en el patio. Solo conoce la sintaxis.

Por qué: Un sketch que compila puede encender el LED al revés porque el compilador no conoce el umbral acordado en el patio. Solo conoce la sintaxis. Un if con la comparación cambiada es un programa legal, y hace falta la traza del caso 500 para verlo.

3. Un compañero pega una librería con un archivo LICENSE que dice GPL. ¿Puede entregarla como si el grupo la hubiera escrito?

Respuesta. No. Puede usarla si cumple la GPL, y tiene que decir que no es suya.

Por qué: La licencia no es un pie de página decorativo: es la condición del autor. Borrar el aviso y firmar encima es quedarse el programa. Escribir la media uno mismo, en este tema, es además más corto que entender una librería ajena.

En la vida real

Castilla y León, sin servidor

  • El parte de avería del aula de tecnología separa «no enciende» de «enciende cuando no toca». Es la misma frontera entre fallo visible y fallo de lógica.
  • En un instituto de Segovia, reutilizar el sketch del año pasado sin mirar la cabecera es cómo se heredan umbrales y nombres de pin que ya no corresponden.
  • Una calculadora que da 640 en vez de 480 no está «estropeada» si el programa sumó tres casillas. Se revisa la cuenta, no el aparato.
  • Elegir MIT para un trabajo de clase que se va a leer en voz alta es suficiente. No hace falta una fundación. Hace falta no poner «todos los derechos reservados» en un código que en realidad copiaste.
Laboratorio · en esta página Abrir en pestaña →

El ejemplo del editor está roto a propósito: el para llega hasta longitud y se sale del vector. Ejecutar debe mostrar el error, no una media. Corrige a longitud - 1. Las pistas aparecen bajo la traza. Sigue siendo local.

GPIO 18

Simulación local · sin hardware

Raspberry Pi (BCM) · paralelo didáctico Arduino UNO D13 · pin GPIO 18

Estado del pin: LOW · LED apagado

OFF

Si el programa está mal, el LED puede quedarse apagado con el pin que tú crees en HIGH. El interruptor enseña el estado que la mano pide; la traza enseña el estado que el código pide. Si no coinciden, se depura el código. HIGH enciende el LED (en la Pi, 3,3 V; en Arduino UNO el paralelo didáctico es digitalWrite HIGH en D13). No se envía nada fuera de esta página.

Pulsa Ejecutar. El resultado se queda en esta página.

Escribes y dibujas aquí mismo: no hay salto a otro módulo. La misma herramienta, a pantalla completa, está en l29-depuracion-y-buenas-practicas.html y en el marco (útil si el navegador permite file:// en iframes).

Reto Profesor

Un bug, una corrección

Ejecuta el ejemplo roto, copia el mensaje en el cuaderno y corrige solo el hasta. Vuelve a ejecutar y anota la media. Después provoca un error de sintaxis (quita un fin) y un error de lógica (cambia el umbral de una comparación) y clasifícalos. Cierra con tres líneas de licencia de un código que sea tuyo. Una buena entrega no atribuye el primer fallo al interruptor.

reto_id: bach1-tic-L29