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.
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.
«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.
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.
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.
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.
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.
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.
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.
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.
Cada caso es una entrega del avisador del patio del IES Duero (Aranda de Duero). Lee la situación antes de la decisión.
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ó.
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.
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.
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 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.
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
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];
}
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.
| Qué ves | Familia | Mensaje | Qué se toca |
|---|---|---|---|
| Falta un fin | sintaxis | sí | el texto, antes de fiarte de la media |
| Índice 3 de 3 casillas | ejecución | sí, con línea | el hasta, a longitud-1 |
| LED encendido en el empate | lógica | no | la condición, con la traza del 500 |
| Código de un foro firmado por ti | licencia | no | la 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.
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.
| Criterio | Aún no | En proceso | Conseguido | Notable |
|---|---|---|---|---|
| Clasificar | «No va» | Todo es sintaxis | Distingue las tres familias | Sabe cuál no da mensaje |
| Mensaje | No lo lee | Lee y no toca esa línea | Corrige la causa | Un cambio cada vez |
| Lógica | No hay traza | Traza decorativa | La tabla caza el <= | No culpa al GPIO simulado |
| Compilar | Se confunde con ejecutar | Lo nombra | IDE frente a botón Ejecutar | Un sketch compilado puede estar mal |
| Licencia | Copia sin mirar | Dice «de internet» | Separa código propio y ajeno | Nombra MIT o GPL y no la confunde con CC |
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.
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.
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.
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.
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
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).
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