[{"data":1,"prerenderedAt":3249},["ShallowReactive",2],{"doc:\u002Frush00":3},{"id":4,"title":5,"body":6,"description":3243,"extension":3244,"meta":3245,"navigation":385,"path":3246,"seo":3247,"stem":2543,"__hash__":3248},"docs\u002Frush00.md","Rush 00 paso a paso",{"type":7,"value":8,"toc":3206},"minimark",[9,14,18,29,41,47,72,75,80,148,162,164,168,179,185,188,213,219,221,225,231,252,263,269,272,330,352,354,360,473,480,491,514,520,523,582,601,607,616,670,673,708,722,734,736,742,748,754,773,784,803,813,820,993,1001,1010,1018,1021,1025,1036,1055,1067,1079,1101,1109,1157,1166,1193,1226,1242,1248,1255,1408,1415,1554,1566,1580,1586,1750,1763,1783,1820,1846,1854,1859,1880,1902,1910,1912,1918,2025,2028,2033,2036,2038,2042,2049,2194,2218,2220,2226,2307,2327,2337,2361,2367,2369,2373,2421,2425,2498,2503,2519,2522,2530,2545,2548,2553,2557,2563,2582,2588,2607,2613,2616,2618,2622,2783,2785,2789,2796,2852,2862,2872,2874,2878,3029,3031,3035,3047,3051,3054,3180,3183,3192,3202],[10,11,13],"h1",{"id":12},"_42-piscine-rush-00-explicado-desde-cero","42 Piscine — Rush 00 (explicado desde cero)",[15,16,17],"p",{},"Vas a hacer que un programa de C dibuje un rectángulo en la pantalla:",[19,20,25],"pre",{"className":21,"code":23,"language":24},[22],"language-text","o---o\n|   |\no---o\n","text",[26,27,23],"code",{"__ignoreMap":28},"",[15,30,31,32,35,36,40],{},"Ese dibujo lo produce ",[26,33,34],{},"rush(5, 3)",": 5 caracteres de ancho y 3 de alto.\nEste documento explica ",[37,38,39],"strong",{},"cada línea"," de los tres archivos, asumiendo que\nllevas un día programando. Si algo no se entiende, es culpa de este README,\nno tuya.",[15,42,43],{},[44,45,46],"em",{},"Hecho con amor para Laura, por Bogdan.",[48,49,50],"blockquote",{},[15,51,52,55,56,63,64,67,68,71],{},[37,53,54],{},"¿Acabas de empezar?"," ",[57,58,60],"a",{"href":59},"\u002Fconceptos",[26,61,62],{},"CONCEPTOS.md"," explica, por separado,\nqué es una variable, una función, un ",[26,65,66],{},"return"," temprano, un bucle, una matriz,\ny qué hace ",[26,69,70],{},"gcc"," con sus flags. Este README asume que ya leíste eso.",[73,74],"hr",{},[76,77,79],"h2",{"id":78},"qué-tienes-que-entregar","Qué tienes que entregar",[81,82,83,96],"table",{},[84,85,86],"thead",{},[87,88,89,93],"tr",{},[90,91,92],"th",{},"Dato",[90,94,95],{},"Valor",[97,98,99,110,127,138],"tbody",{},[87,100,101,105],{},[102,103,104],"td",{},"Carpeta",[102,106,107],{},[26,108,109],{},"ex00\u002F",[87,111,112,115],{},[102,113,114],{},"Archivos",[102,116,117,120,121,120,124],{},[26,118,119],{},"main.c",", ",[26,122,123],{},"ft_putchar.c",[26,125,126],{},"rush00.c",[87,128,129,132],{},[102,130,131],{},"Funciones de librería permitidas",[102,133,134,135],{},"solo ",[26,136,137],{},"write",[87,139,140,143],{},[102,141,142],{},"Función obligatoria",[102,144,145],{},[26,146,147],{},"void rush(int x, int y)",[15,149,150,151,153,154,157,158,161],{},"Tres archivos, no más. El enunciado dice que ",[26,152,123],{}," debe contener\n",[37,155,156],{},"únicamente"," la función ",[26,159,160],{},"ft_putchar",", así que no agregues nada ahí.",[73,163],{},[76,165,167],{"id":166},"modelo-mental-qué-hace-un-compilador","Modelo mental: qué hace un compilador",[15,169,170,171,174,175,178],{},"Antes de leer código, necesitas una imagen mental. Programar en C es escribir\nun archivo de texto (",[26,172,173],{},".c",") con instrucciones que una persona puede leer.\nEl ordenador ",[37,176,177],{},"no"," ejecuta ese texto: primero hay que traducirlo.",[19,180,183],{"className":181,"code":182,"language":24},[22],"  rush00.c  ──┐\n  main.c    ──┼──► gcc ──► rush00  (programa ejecutable)\n  ft_putchar.c┘\n",[26,184,182],{"__ignoreMap":28},[15,186,187],{},"Tres ideas que van a aparecer todo el tiempo:",[189,190,191,201,207],"ul",{},[192,193,194,197,198,200],"li",{},[37,195,196],{},"Compilar",": traducir cada ",[26,199,173],{}," a instrucciones de máquina.",[192,202,203,206],{},[37,204,205],{},"Enlazar (link)",": unir las piezas ya compiladas en un solo ejecutable.",[192,208,209,212],{},[37,210,211],{},"Ejecutar",": correr ese ejecutable.",[15,214,215,216,218],{},"Si te olvidas de un archivo en el comando de ",[26,217,70],{},", el enlazador se queja de\nque no encuentra una función. Es el error más común y lo vas a ver más abajo.",[73,220],{},[76,222,224],{"id":223},"el-problema-filas-columnas-y-bordes","El problema: filas, columnas y bordes",[15,226,227,230],{},[26,228,229],{},"rush"," recibe dos números enteros:",[189,232,233,243],{},[192,234,235,238,239,242],{},[26,236,237],{},"x"," = ",[37,240,241],{},"ancho",", cuántos caracteres entran en una fila.",[192,244,245,238,248,251],{},[26,246,247],{},"y",[37,249,250],{},"alto",", cuántas filas hay.",[15,253,254,255,258,259,262],{},"Si ",[26,256,257],{},"x = 5"," e ",[26,260,261],{},"y = 3",", la salida es una grilla de 5 columnas por 3 filas:",[19,264,267],{"className":265,"code":266,"language":24},[22],"columna:  0   1   2   3   4\n         ┌───┬───┬───┬───┬───┐\nfila 0   │ o │ - │ - │ - │ o │\n         ├───┼───┼───┼───┼───┤\nfila 1   │ | │   │   │   │ | │\n         ├───┼───┼───┼───┼───┤\nfila 2   │ o │ - │ - │ - │ o │\n         └───┴───┴───┴───┴───┘\n",[26,268,266],{"__ignoreMap":28},[15,270,271],{},"Las reglas son tres:",[81,273,274,284],{},[84,275,276],{},[87,277,278,281],{},[90,279,280],{},"Posición",[90,282,283],{},"Carácter",[97,285,286,299,309,319],{},[87,287,288,294],{},[102,289,290,291,293],{},"Esquina (primera\u002Fúltima fila ",[37,292,247],{}," primera\u002Fúltima columna)",[102,295,296],{},[26,297,298],{},"o",[87,300,301,304],{},[102,302,303],{},"Borde de arriba o de abajo (sin ser esquina)",[102,305,306],{},[26,307,308],{},"-",[87,310,311,314],{},[102,312,313],{},"Borde izquierdo o derecho (sin ser esquina)",[102,315,316],{},[26,317,318],{},"|",[87,320,321,324],{},[102,322,323],{},"Todo lo de adentro",[102,325,326,327],{},"espacio ",[26,328,329],{},"' '",[15,331,332,333,336,337,340,341,344,345,347,348,351],{},"Y algo que confunde a todos el primer día: ",[37,334,335],{},"los índices empiezan en 0",".\nSi hay 5 columnas, sus índices son ",[26,338,339],{},"0, 1, 2, 3, 4",". La última columna es\n",[26,342,343],{},"x - 1",", no ",[26,346,237],{},". Por eso en el código vas a ver ",[26,349,350],{},"width - 1"," todo el tiempo.",[73,353],{},[76,355,357,358],{"id":356},"archivo-1-ft_putcharc","Archivo 1: ",[26,359,123],{},[19,361,365],{"className":362,"code":363,"language":364,"meta":28,"style":28},"language-c shiki shiki-themes github-light github-dark","#include \u003Cunistd.h>\n\n\u002F*\n** Escribe un solo caracter en la salida estandar (file descriptor 1).\n** Es la unica funcion permitida por el enunciado para mostrar texto.\n*\u002F\nvoid    ft_putchar(char c)\n{\n    write(1, &c, 1);\n}\n","c",[26,366,367,380,387,394,400,406,412,436,442,467],{"__ignoreMap":28},[368,369,372,376],"span",{"class":370,"line":371},"line",1,[368,373,375],{"class":374},"szBVR","#include",[368,377,379],{"class":378},"sZZnC"," \u003Cunistd.h>\n",[368,381,383],{"class":370,"line":382},2,[368,384,386],{"emptyLinePlaceholder":385},true,"\n",[368,388,390],{"class":370,"line":389},3,[368,391,393],{"class":392},"sJ8bj","\u002F*\n",[368,395,397],{"class":370,"line":396},4,[368,398,399],{"class":392},"** Escribe un solo caracter en la salida estandar (file descriptor 1).\n",[368,401,403],{"class":370,"line":402},5,[368,404,405],{"class":392},"** Es la unica funcion permitida por el enunciado para mostrar texto.\n",[368,407,409],{"class":370,"line":408},6,[368,410,411],{"class":392},"*\u002F\n",[368,413,415,418,422,426,429,433],{"class":370,"line":414},7,[368,416,417],{"class":374},"void",[368,419,421],{"class":420},"sScJk","    ft_putchar",[368,423,425],{"class":424},"sVt8B","(",[368,427,428],{"class":374},"char",[368,430,432],{"class":431},"s4XuR"," c",[368,434,435],{"class":424},")\n",[368,437,439],{"class":370,"line":438},8,[368,440,441],{"class":424},"{\n",[368,443,445,448,450,454,456,459,462,464],{"class":370,"line":444},9,[368,446,447],{"class":420},"    write",[368,449,425],{"class":424},[368,451,453],{"class":452},"sj4cs","1",[368,455,120],{"class":424},[368,457,458],{"class":374},"&",[368,460,461],{"class":424},"c, ",[368,463,453],{"class":452},[368,465,466],{"class":424},");\n",[368,468,470],{"class":370,"line":469},10,[368,471,472],{"class":424},"}\n",[474,475,477],"h3",{"id":476},"include-unistdh",[26,478,479],{},"#include \u003Cunistd.h>",[15,481,482,483,486,487,490],{},"Una línea que empieza con ",[26,484,485],{},"#"," no es C normal: es una orden para el\n",[37,488,489],{},"preprocesador",", un paso previo que copia y pega cosas antes de compilar.",[15,492,493,496,497,500,501,503,504,506,507,509,510,513],{},[26,494,495],{},"unistd.h"," es un archivo del sistema (\"Unix standard\") que contiene la\n",[37,498,499],{},"declaración"," de ",[26,502,137],{},". Es como el índice de un libro: le dice al\ncompilador \"existe una función llamada ",[26,505,137],{}," que recibe estos parámetros\".\nSin esa línea, el compilador no sabe qué es ",[26,508,137],{}," y con ",[26,511,512],{},"-Werror"," el\nprograma ni compila.",[474,515,517],{"id":516},"void-ft_putcharchar-c",[26,518,519],{},"void ft_putchar(char c)",[15,521,522],{},"Esta línea se lee así, de izquierda a derecha:",[81,524,525,535],{},[84,526,527],{},[87,528,529,532],{},[90,530,531],{},"Parte",[90,533,534],{},"Significado",[97,536,537,550,563],{},[87,538,539,543],{},[102,540,541],{},[26,542,417],{},[102,544,545,546,549],{},"la función ",[37,547,548],{},"no devuelve"," ningún valor",[87,551,552,556],{},[102,553,554],{},[26,555,160],{},[102,557,558,559,562],{},"el nombre (la ",[26,560,561],{},"ft_"," es convención de 42)",[87,564,565,570],{},[102,566,567],{},[26,568,569],{},"(char c)",[102,571,572,573,576,577,579,580],{},"recibe ",[37,574,575],{},"un"," parámetro llamado ",[26,578,364],{},", de tipo ",[26,581,428],{},[15,583,584,586,587,589,590,593,594,597,598,600],{},[26,585,428],{}," es el tipo de dato más chico: guarda ",[37,588,575],{}," carácter. Cuando ",[26,591,592],{},"main","\nllama a ",[26,595,596],{},"ft_putchar('o')",", la función recibe una copia de ese carácter dentro\nde una variable local llamada ",[26,599,364],{},". Esa variable vive en una cajita de memoria\nque existe solo mientras la función se está ejecutando.",[474,602,604],{"id":603},"write1-c-1",[26,605,606],{},"write(1, &c, 1);",[15,608,609,611,612,615],{},[26,610,137],{}," es una función del sistema operativo que escribe bytes en un\n",[37,613,614],{},"descriptor de archivo",". Tiene tres parámetros:",[81,617,618,628],{},[84,619,620],{},[87,621,622,625],{},[90,623,624],{},"Parámetro",[90,626,627],{},"Qué significa en este caso",[97,629,630,645,658],{},[87,631,632,636],{},[102,633,634],{},[26,635,453],{},[102,637,638,641,642,644],{},[37,639,640],{},"dónde"," escribir. ",[26,643,453],{}," = salida estándar (la pantalla \u002F la terminal)",[87,646,647,652],{},[102,648,649],{},[26,650,651],{},"&c",[102,653,654,657],{},[37,655,656],{},"qué"," escribir: la dirección de memoria donde está el carácter",[87,659,660,664],{},[102,661,662],{},[26,663,453],{},[102,665,666,669],{},[37,667,668],{},"cuántos"," bytes escribir: uno solo",[15,671,672],{},"Dos detalles que valen oro:",[674,675,676,700],"ol",{},[192,677,678,683,684,686,687,690,691,693,694,696,697,699],{},[37,679,680,682],{},[26,681,458],{}," significa \"la dirección de\"",". ",[26,685,137],{}," no recibe el valor del\ncarácter, recibe la ",[37,688,689],{},"ubicación"," de la cajita donde está guardado. Por eso\nse escribe ",[26,692,651],{}," y no ",[26,695,364],{},". Si pasas ",[26,698,364],{},", el compilador te va a marcar error\nde tipos (y con razón).",[192,701,702,55,704,707],{},[26,703,137],{},[37,705,706],{},"devuelve"," cuántos bytes pudo escribir. Aquí ese número no nos\ninteresa y se descarta. Eso es normal: no todo lo que devuelve una función\nse usa.",[15,709,710,711,714,715,718,719,721],{},"Otros descriptores que existen: ",[26,712,713],{},"0"," es la entrada (teclado), ",[26,716,717],{},"2"," es la salida\nde errores. ",[26,720,453],{}," es la de siempre.",[48,723,724],{},[15,725,726,729,730,733],{},[37,727,728],{},"Nota de estilo:"," la indentación es con ",[37,731,732],{},"tabs",", no con espacios. Es la\nNorm de 42 y el corrector lo revisa.",[73,735],{},[76,737,739,740],{"id":738},"archivo-2-rush00c","Archivo 2: ",[26,741,126],{},[15,743,744,745,747],{},"Este archivo tiene una función pública (",[26,746,229],{},") y dos funciones auxiliares.\nLo leemos de abajo hacia arriba: primero las piezas chicas, después el que las\nusa.",[474,749,751,752],{"id":750},"la-declaración-de-ft_putchar","La declaración de ",[26,753,160],{},[19,755,757],{"className":362,"code":756,"language":364,"meta":28,"style":28},"void    ft_putchar(char c);\n",[26,758,759],{"__ignoreMap":28},[368,760,761,763,765,767,769,771],{"class":370,"line":371},[368,762,417],{"class":374},[368,764,421],{"class":420},[368,766,425],{"class":424},[368,768,428],{"class":374},[368,770,432],{"class":431},[368,772,466],{"class":424},[15,774,775,776,779,780,783],{},"Esto es un ",[37,777,778],{},"prototipo",": la firma de una función que está en ",[37,781,782],{},"otro"," archivo.",[15,785,786,787,789,790,792,793,795,796,799,800,802],{},"¿Por qué hace falta? Porque el compilador procesa ",[26,788,126],{}," sin ver\n",[26,791,123],{},". El prototipo le avisa \"tranquilo, esta función existe en algún\nlado, y recibe un ",[26,794,428],{},"\". Gracias a eso puede verificar que la llames bien.\nSi lo borras, el compilador asume que existe y te tira un warning de\n",[44,797,798],{},"implicit declaration",", que con ",[26,801,512],{}," se convierte en error.",[15,804,805,806,809,810,812],{},"Fíjate que termina en ",[26,807,808],{},";",": es una ",[37,811,499],{},", no una definición. No lleva\ncuerpo, no ejecuta nada.",[474,814,816,819],{"id":815},"print_horizontal_edge-dibujar-un-borde",[26,817,818],{},"print_horizontal_edge",": dibujar un borde",[19,821,823],{"className":362,"code":822,"language":364,"meta":28,"style":28},"static void print_horizontal_edge(int width)\n{\n    int column;\n\n    column = 0;\n    while (column \u003C width)\n    {\n        if (column == 0 || column == width - 1)\n            ft_putchar('o');\n        else\n            ft_putchar('-');\n        column++;\n    }\n    ft_putchar('\\n');\n}\n",[26,824,825,846,850,858,862,876,890,895,925,937,942,954,965,971,988],{"__ignoreMap":28},[368,826,827,830,833,836,838,841,844],{"class":370,"line":371},[368,828,829],{"class":374},"static",[368,831,832],{"class":374}," void",[368,834,835],{"class":420}," print_horizontal_edge",[368,837,425],{"class":424},[368,839,840],{"class":374},"int",[368,842,843],{"class":431}," width",[368,845,435],{"class":424},[368,847,848],{"class":370,"line":382},[368,849,441],{"class":424},[368,851,852,855],{"class":370,"line":389},[368,853,854],{"class":374},"    int",[368,856,857],{"class":424}," column;\n",[368,859,860],{"class":370,"line":396},[368,861,386],{"emptyLinePlaceholder":385},[368,863,864,867,870,873],{"class":370,"line":402},[368,865,866],{"class":424},"    column ",[368,868,869],{"class":374},"=",[368,871,872],{"class":452}," 0",[368,874,875],{"class":424},";\n",[368,877,878,881,884,887],{"class":370,"line":408},[368,879,880],{"class":374},"    while",[368,882,883],{"class":424}," (column ",[368,885,886],{"class":374},"\u003C",[368,888,889],{"class":424}," width)\n",[368,891,892],{"class":370,"line":414},[368,893,894],{"class":424},"    {\n",[368,896,897,900,902,905,907,910,913,915,918,920,923],{"class":370,"line":438},[368,898,899],{"class":374},"        if",[368,901,883],{"class":424},[368,903,904],{"class":374},"==",[368,906,872],{"class":452},[368,908,909],{"class":374}," ||",[368,911,912],{"class":424}," column ",[368,914,904],{"class":374},[368,916,917],{"class":424}," width ",[368,919,308],{"class":374},[368,921,922],{"class":452}," 1",[368,924,435],{"class":424},[368,926,927,930,932,935],{"class":370,"line":444},[368,928,929],{"class":420},"            ft_putchar",[368,931,425],{"class":424},[368,933,934],{"class":378},"'o'",[368,936,466],{"class":424},[368,938,939],{"class":370,"line":469},[368,940,941],{"class":374},"        else\n",[368,943,945,947,949,952],{"class":370,"line":944},11,[368,946,929],{"class":420},[368,948,425],{"class":424},[368,950,951],{"class":378},"'-'",[368,953,466],{"class":424},[368,955,957,960,963],{"class":370,"line":956},12,[368,958,959],{"class":424},"        column",[368,961,962],{"class":374},"++",[368,964,875],{"class":424},[368,966,968],{"class":370,"line":967},13,[368,969,970],{"class":424},"    }\n",[368,972,974,976,978,981,984,986],{"class":370,"line":973},14,[368,975,421],{"class":420},[368,977,425],{"class":424},[368,979,980],{"class":378},"'",[368,982,983],{"class":452},"\\n",[368,985,980],{"class":378},[368,987,466],{"class":424},[368,989,991],{"class":370,"line":990},15,[368,992,472],{"class":424},[994,995,997,998,1000],"h4",{"id":996},"qué-significa-static","¿Qué significa ",[26,999,829],{},"?",[15,1002,1003,1004,55,1006,1009],{},"Una función ",[26,1005,829],{},[37,1007,1008],{},"solo existe dentro de este archivo",". Es una función\nprivada. ¿Por qué querrías eso?",[189,1011,1012,1015],{},[192,1013,1014],{},"Comunica la intención: \"esto es un ayudante interno, no lo uses desde afuera\".",[192,1016,1017],{},"Evita choques de nombres si otro archivo define una función igual.",[15,1019,1020],{},"No es obligatorio para aprobar, pero es buena práctica y es el equivalente en\nC a marcar un método como privado.",[994,1022,1024],{"id":1023},"paso-a-paso","Paso a paso",[15,1026,1027,1032,1033,1035],{},[37,1028,1029],{},[26,1030,1031],{},"int column;"," — declaramos una variable de tipo ",[26,1034,840],{}," (entero). La\ndeclaramos arriba del bloque porque el estilo de 42 (basado en C89) pide todas\nlas declaraciones al principio.",[15,1037,1038,1043,1044,1046,1047,1050,1051,1054],{},[37,1039,1040],{},[26,1041,1042],{},"column = 0;"," — le damos un valor inicial. Ojo: la declaración por sí sola\n",[37,1045,177],{}," inicializa nada. Si te olvidas de esta línea, ",[26,1048,1049],{},"column"," contiene basura\ny el ",[26,1052,1053],{},"while"," puede comportarse de forma impredecible.",[15,1056,1057,1062,1063,1066],{},[37,1058,1059],{},[26,1060,1061],{},"while (column \u003C width)"," — un bucle. La condición se evalúa ",[37,1064,1065],{},"antes"," de\ncada vuelta:",[48,1068,1069],{},[15,1070,1071,1072,1074,1075,1078],{},"\"Mientras ",[26,1073,1049],{}," sea menor que ",[26,1076,1077],{},"width",", repite todo lo que está entre\nllaves.\"",[15,1080,1081,1082,1085,1086,1089,1090,1092,1093,1096,1097,1100],{},"Con ",[26,1083,1084],{},"width = 5",", el cuerpo se ejecuta con ",[26,1087,1088],{},"column = 0, 1, 2, 3, 4",". Cuando\n",[26,1091,1049],{}," llega a ",[26,1094,1095],{},"5",", la condición ",[26,1098,1099],{},"5 \u003C 5"," es falsa y el bucle termina.",[15,1102,1103,1108],{},[37,1104,1105],{},[26,1106,1107],{},"if (column == 0 || column == width - 1)"," — una decisión.",[189,1110,1111,1123,1135,1141],{},[192,1112,1113,1115,1116,1119,1120,1122],{},[26,1114,904],{}," compara (devuelve verdadero o falso). ",[37,1117,1118],{},"No"," es lo mismo que ",[26,1121,869],{},", que\nasigna. Confundirlos es el error número uno de todo principiante.",[192,1124,1125,1128,1129,1131,1132,1134],{},[26,1126,1127],{},"||"," significa ",[37,1130,298],{},". La condición es verdadera si el lado izquierdo ",[37,1133,298],{},"\nel derecho lo son.",[192,1136,1137,1140],{},[26,1138,1139],{},"column == 0"," → ¿es la primera columna?",[192,1142,1143,1146,1147,1149,1150,1152,1153,1156],{},[26,1144,1145],{},"column == width - 1"," → ¿es la última columna? (",[26,1148,350],{}," es una resta de\nenteros: con ",[26,1151,1084],{}," da ",[26,1154,1155],{},"4",".)",[15,1158,1159,1160,1162,1163,1165],{},"Si es primera o última columna escribimos ",[26,1161,934],{},"; si no, ",[26,1164,951],{},".",[48,1167,1168],{},[15,1169,1170,1172,1173,683,1176,1179,1180,1183,1184,1186,1187,1189,1190,1192],{},[26,1171,934],{}," (comillas simples) es ",[37,1174,1175],{},"un carácter",[26,1177,1178],{},"\"o\""," (comillas dobles) es un\n",[37,1181,1182],{},"string",", que en C ocupa dos bytes (la ",[26,1185,298],{}," y un terminador invisible).\n",[26,1188,160],{}," espera un ",[26,1191,428],{},", así que siempre comillas simples.",[15,1194,1195,1200,1201,1204,1205,1208,1209,1212,1213,1215,1216,1219,1220,1222,1223,1225],{},[37,1196,1197],{},[26,1198,1199],{},"column++;"," — ",[26,1202,1203],{},"column++"," es la forma corta de ",[26,1206,1207],{},"column = column + 1;",".\nEstá ",[37,1210,1211],{},"dentro"," del ",[26,1214,1053],{},", al final del cuerpo. Es lo que hace avanzar el\nbucle. ",[37,1217,1218],{},"Si te olvidas de esta línea, el programa nunca termina",": ",[26,1221,1049],{},"\nqueda en ",[26,1224,713],{}," para siempre y la condición siempre es verdadera. El enunciado\nprohíbe explícitamente el bucle infinito, así que revisa esto.",[15,1227,1228,1233,1234,1237,1238,1241],{},[37,1229,1230],{},[26,1231,1232],{},"ft_putchar('\\n');"," — después de completar la fila, escribimos un salto de\nlínea. ",[26,1235,1236],{},"'\\n'"," es ",[37,1239,1240],{},"un solo carácter"," (el salto de línea), no dos. Sin esto,\ntodas las filas saldrían pegadas en la misma línea:",[19,1243,1246],{"className":1244,"code":1245,"language":24},[22],"o---o|   |o---o\n",[26,1247,1245],{"__ignoreMap":28},[994,1249,1251,1252],{"id":1250},"traza-de-print_horizontal_edge5","Traza de ",[26,1253,1254],{},"print_horizontal_edge(5)",[81,1256,1257,1283],{},[84,1258,1259],{},[87,1260,1261,1264,1268,1272,1277,1280],{},[90,1262,1263],{},"Vuelta",[90,1265,1266],{},[26,1267,1049],{},[90,1269,1270],{},[26,1271,1139],{},[90,1273,1274],{},[26,1275,1276],{},"column == 4",[90,1278,1279],{},"¿Qué imprime?",[90,1281,1282],{},"Salida acumulada",[97,1284,1285,1305,1324,1344,1363,1384],{},[87,1286,1287,1289,1291,1294,1297,1301],{},[102,1288,453],{},[102,1290,713],{},[102,1292,1293],{},"sí",[102,1295,1296],{},"no se evalúa",[102,1298,1299],{},[26,1300,298],{},[102,1302,1303],{},[26,1304,298],{},[87,1306,1307,1309,1311,1313,1315,1319],{},[102,1308,717],{},[102,1310,453],{},[102,1312,177],{},[102,1314,177],{},[102,1316,1317],{},[26,1318,308],{},[102,1320,1321],{},[26,1322,1323],{},"o-",[87,1325,1326,1329,1331,1333,1335,1339],{},[102,1327,1328],{},"3",[102,1330,717],{},[102,1332,177],{},[102,1334,177],{},[102,1336,1337],{},[26,1338,308],{},[102,1340,1341],{},[26,1342,1343],{},"o--",[87,1345,1346,1348,1350,1352,1354,1358],{},[102,1347,1155],{},[102,1349,1328],{},[102,1351,177],{},[102,1353,177],{},[102,1355,1356],{},[26,1357,308],{},[102,1359,1360],{},[26,1361,1362],{},"o---",[87,1364,1365,1367,1369,1371,1375,1379],{},[102,1366,1095],{},[102,1368,1155],{},[102,1370,177],{},[102,1372,1373],{},[37,1374,1293],{},[102,1376,1377],{},[26,1378,298],{},[102,1380,1381],{},[26,1382,1383],{},"o---o",[87,1385,1386,1389,1391,1397,1399,1403],{},[102,1387,1388],{},"—",[102,1390,1095],{},[102,1392,1393,1394,1396],{},"el bucle termina (",[26,1395,1099],{}," es falso)",[102,1398],{},[102,1400,1401],{},[26,1402,983],{},[102,1404,1405],{},[26,1406,1407],{},"o---o\\n",[474,1409,1411,1414],{"id":1410},"print_vertical_edge-dibujar-una-fila-del-medio",[26,1412,1413],{},"print_vertical_edge",": dibujar una fila del medio",[19,1416,1418],{"className":362,"code":1417,"language":364,"meta":28,"style":28},"static void print_vertical_edge(int width)\n{\n    int column;\n\n    column = 0;\n    while (column \u003C width)\n    {\n        if (column == 0 || column == width - 1)\n            ft_putchar('|');\n        else\n            ft_putchar(' ');\n        column++;\n    }\n    ft_putchar('\\n');\n}\n",[26,1419,1420,1437,1441,1447,1451,1461,1471,1475,1499,1510,1514,1524,1532,1536,1550],{"__ignoreMap":28},[368,1421,1422,1424,1426,1429,1431,1433,1435],{"class":370,"line":371},[368,1423,829],{"class":374},[368,1425,832],{"class":374},[368,1427,1428],{"class":420}," print_vertical_edge",[368,1430,425],{"class":424},[368,1432,840],{"class":374},[368,1434,843],{"class":431},[368,1436,435],{"class":424},[368,1438,1439],{"class":370,"line":382},[368,1440,441],{"class":424},[368,1442,1443,1445],{"class":370,"line":389},[368,1444,854],{"class":374},[368,1446,857],{"class":424},[368,1448,1449],{"class":370,"line":396},[368,1450,386],{"emptyLinePlaceholder":385},[368,1452,1453,1455,1457,1459],{"class":370,"line":402},[368,1454,866],{"class":424},[368,1456,869],{"class":374},[368,1458,872],{"class":452},[368,1460,875],{"class":424},[368,1462,1463,1465,1467,1469],{"class":370,"line":408},[368,1464,880],{"class":374},[368,1466,883],{"class":424},[368,1468,886],{"class":374},[368,1470,889],{"class":424},[368,1472,1473],{"class":370,"line":414},[368,1474,894],{"class":424},[368,1476,1477,1479,1481,1483,1485,1487,1489,1491,1493,1495,1497],{"class":370,"line":438},[368,1478,899],{"class":374},[368,1480,883],{"class":424},[368,1482,904],{"class":374},[368,1484,872],{"class":452},[368,1486,909],{"class":374},[368,1488,912],{"class":424},[368,1490,904],{"class":374},[368,1492,917],{"class":424},[368,1494,308],{"class":374},[368,1496,922],{"class":452},[368,1498,435],{"class":424},[368,1500,1501,1503,1505,1508],{"class":370,"line":444},[368,1502,929],{"class":420},[368,1504,425],{"class":424},[368,1506,1507],{"class":378},"'|'",[368,1509,466],{"class":424},[368,1511,1512],{"class":370,"line":469},[368,1513,941],{"class":374},[368,1515,1516,1518,1520,1522],{"class":370,"line":944},[368,1517,929],{"class":420},[368,1519,425],{"class":424},[368,1521,329],{"class":378},[368,1523,466],{"class":424},[368,1525,1526,1528,1530],{"class":370,"line":956},[368,1527,959],{"class":424},[368,1529,962],{"class":374},[368,1531,875],{"class":424},[368,1533,1534],{"class":370,"line":967},[368,1535,970],{"class":424},[368,1537,1538,1540,1542,1544,1546,1548],{"class":370,"line":973},[368,1539,421],{"class":420},[368,1541,425],{"class":424},[368,1543,980],{"class":378},[368,1545,983],{"class":452},[368,1547,980],{"class":378},[368,1549,466],{"class":424},[368,1551,1552],{"class":370,"line":990},[368,1553,472],{"class":424},[15,1555,1556,1557,1559,1560,55,1563,1565],{},"Es la misma estructura que la anterior. Solo cambian dos cosas: los bordes son\n",[26,1558,1507],{}," y el relleno es un ",[37,1561,1562],{},"espacio",[26,1564,329],{}," (que también es un carácter, y para\nel ordenador es tan real como una letra).",[15,1567,1081,1568,1570,1571,1573,1574,1576,1577,1165],{},[26,1569,1084],{}," imprime: ",[26,1572,318],{},", espacio, espacio, espacio, ",[26,1575,318],{},", salto de línea.\nEso es exactamente ",[26,1578,1579],{},"|   |",[474,1581,1583,1585],{"id":1582},"rush-el-director-de-orquesta",[26,1584,229],{},": el director de orquesta",[19,1587,1589],{"className":362,"code":1588,"language":364,"meta":28,"style":28},"void    rush(int x, int y)\n{\n    int row;\n\n    if (x \u003C= 0 || y \u003C= 0)\n        return ;\n    row = 0;\n    while (row \u003C y)\n    {\n        if (row == 0 || row == y - 1)\n            print_horizontal_edge(x);\n        else\n            print_vertical_edge(x);\n        row++;\n    }\n}\n",[26,1590,1591,1614,1618,1625,1629,1653,1661,1672,1684,1688,1713,1721,1725,1732,1741,1745],{"__ignoreMap":28},[368,1592,1593,1595,1598,1600,1602,1605,1607,1609,1612],{"class":370,"line":371},[368,1594,417],{"class":374},[368,1596,1597],{"class":420},"    rush",[368,1599,425],{"class":424},[368,1601,840],{"class":374},[368,1603,1604],{"class":431}," x",[368,1606,120],{"class":424},[368,1608,840],{"class":374},[368,1610,1611],{"class":431}," y",[368,1613,435],{"class":424},[368,1615,1616],{"class":370,"line":382},[368,1617,441],{"class":424},[368,1619,1620,1622],{"class":370,"line":389},[368,1621,854],{"class":374},[368,1623,1624],{"class":424}," row;\n",[368,1626,1627],{"class":370,"line":396},[368,1628,386],{"emptyLinePlaceholder":385},[368,1630,1631,1634,1637,1640,1642,1644,1647,1649,1651],{"class":370,"line":402},[368,1632,1633],{"class":374},"    if",[368,1635,1636],{"class":424}," (x ",[368,1638,1639],{"class":374},"\u003C=",[368,1641,872],{"class":452},[368,1643,909],{"class":374},[368,1645,1646],{"class":424}," y ",[368,1648,1639],{"class":374},[368,1650,872],{"class":452},[368,1652,435],{"class":424},[368,1654,1655,1658],{"class":370,"line":408},[368,1656,1657],{"class":374},"        return",[368,1659,1660],{"class":424}," ;\n",[368,1662,1663,1666,1668,1670],{"class":370,"line":414},[368,1664,1665],{"class":424},"    row ",[368,1667,869],{"class":374},[368,1669,872],{"class":452},[368,1671,875],{"class":424},[368,1673,1674,1676,1679,1681],{"class":370,"line":438},[368,1675,880],{"class":374},[368,1677,1678],{"class":424}," (row ",[368,1680,886],{"class":374},[368,1682,1683],{"class":424}," y)\n",[368,1685,1686],{"class":370,"line":444},[368,1687,894],{"class":424},[368,1689,1690,1692,1694,1696,1698,1700,1703,1705,1707,1709,1711],{"class":370,"line":469},[368,1691,899],{"class":374},[368,1693,1678],{"class":424},[368,1695,904],{"class":374},[368,1697,872],{"class":452},[368,1699,909],{"class":374},[368,1701,1702],{"class":424}," row ",[368,1704,904],{"class":374},[368,1706,1646],{"class":424},[368,1708,308],{"class":374},[368,1710,922],{"class":452},[368,1712,435],{"class":424},[368,1714,1715,1718],{"class":370,"line":944},[368,1716,1717],{"class":420},"            print_horizontal_edge",[368,1719,1720],{"class":424},"(x);\n",[368,1722,1723],{"class":370,"line":956},[368,1724,941],{"class":374},[368,1726,1727,1730],{"class":370,"line":967},[368,1728,1729],{"class":420},"            print_vertical_edge",[368,1731,1720],{"class":424},[368,1733,1734,1737,1739],{"class":370,"line":973},[368,1735,1736],{"class":424},"        row",[368,1738,962],{"class":374},[368,1740,875],{"class":424},[368,1742,1743],{"class":370,"line":990},[368,1744,970],{"class":424},[368,1746,1748],{"class":370,"line":1747},16,[368,1749,472],{"class":424},[15,1751,1752,1756,1757,1759,1760,1762],{},[37,1753,1754],{},[26,1755,147],{}," — la función que pide el enunciado, con esa firma\nexacta. Recibe ancho (",[26,1758,237],{},") y alto (",[26,1761,247],{},").",[15,1764,1765,1774,1775,1778,1779,1782],{},[37,1766,1767,1770,1771],{},[26,1768,1769],{},"if (x \u003C= 0 || y \u003C= 0)"," + ",[26,1772,1773],{},"return ;"," — esto se llama ",[37,1776,1777],{},"guard clause","\n(cláusula de guardia): resolver el caso inválido ",[37,1780,1781],{},"primero"," y salir.",[189,1784,1785,1793,1803],{},[192,1786,1787,1789,1790,1792],{},[26,1788,1639],{}," significa \"menor o igual\". Cubre el cero ",[37,1791,247],{}," los negativos con una\nsola comparación.",[192,1794,1795,1797,1798,1237,1800,1802],{},[26,1796,1773],{}," sin valor corta la función en el acto. Como ",[26,1799,229],{},[26,1801,417],{},", no\nhay nada que devolver.",[192,1804,1805,1806,1809,1810,1812,1813,1816,1817,1819],{},"Sin esta guardia, con ",[26,1807,1808],{},"y = 0"," el ",[26,1811,1053],{}," no entraría (bien), pero con\n",[26,1814,1815],{},"y = -3"," la lógica de \"primera o última fila\" se vuelve absurda y podrías\nentrar en un bucle raro. Además, el enunciado aclara que ",[37,1818,177],{}," se debe\nfallar con negativos. Aquí elegimos no dibujar nada; está permitido siempre\nque lo sepas explicar en la defensa.",[15,1821,1822,1646,1827,1832,1833,1835,1836,1839,1840,1842,1843,1165],{},[37,1823,1824],{},[26,1825,1826],{},"row = 0;",[37,1828,1829],{},[26,1830,1831],{},"while (row \u003C y)"," — recorremos las filas, de la ",[26,1834,713],{}," a la\n",[26,1837,1838],{},"y - 1",". Si ",[26,1841,261],{},", son las filas ",[26,1844,1845],{},"0, 1, 2",[15,1847,1848,1853],{},[37,1849,1850],{},[26,1851,1852],{},"if (row == 0 || row == y - 1)"," — la pregunta clave de todo el ejercicio:",[48,1855,1856],{},[15,1857,1858],{},"¿Esta fila es la primera o la última?",[189,1860,1861,1871],{},[192,1862,1863,1864,1867,1868,1165],{},"Si sí → es un ",[37,1865,1866],{},"borde horizontal"," → ",[26,1869,1870],{},"print_horizontal_edge(x)",[192,1872,1873,1874,1867,1877,1165],{},"Si no → es una ",[37,1875,1876],{},"fila del medio",[26,1878,1879],{},"print_vertical_edge(x)",[15,1881,1882,1883,55,1885,1888,1889,1891,1892,1894,1895,1897,1898,1901],{},"Fíjate que ",[26,1884,229],{},[37,1886,1887],{},"no sabe"," cómo se dibuja un borde. No usa ",[26,1890,934],{}," ni ",[26,1893,951],{},".\nSolo decide ",[44,1896,656],{}," fila toca y delega el ",[44,1899,1900],{},"cómo",". Esa separación es la que hace\nel código fácil de leer.",[15,1903,1904,1909],{},[37,1905,1906],{},[26,1907,1908],{},"row++;"," — avanzamos a la siguiente fila. Mismo aviso que antes: sin esto,\nbucle infinito.",[73,1911],{},[76,1913,1915,1916],{"id":1914},"traza-completa-qué-pasa-con-rush5-3","Traza completa: qué pasa con ",[26,1917,34],{},[81,1919,1920,1947],{},[84,1921,1922],{},[87,1923,1924,1926,1931,1936,1941,1944],{},[90,1925,1263],{},[90,1927,1928],{},[26,1929,1930],{},"row",[90,1932,1933],{},[26,1934,1935],{},"row == 0",[90,1937,1938],{},[26,1939,1940],{},"row == 2",[90,1942,1943],{},"Función llamada",[90,1945,1946],{},"Qué imprime",[97,1948,1949,1967,1987,2007],{},[87,1950,1951,1953,1955,1957,1959,1963],{},[102,1952,453],{},[102,1954,713],{},[102,1956,1293],{},[102,1958,1296],{},[102,1960,1961],{},[26,1962,1254],{},[102,1964,1965],{},[26,1966,1407],{},[87,1968,1969,1971,1973,1975,1977,1982],{},[102,1970,717],{},[102,1972,453],{},[102,1974,177],{},[102,1976,177],{},[102,1978,1979],{},[26,1980,1981],{},"print_vertical_edge(5)",[102,1983,1984],{},[26,1985,1986],{},"|   |\\n",[87,1988,1989,1991,1993,1995,1999,2003],{},[102,1990,1328],{},[102,1992,717],{},[102,1994,177],{},[102,1996,1997],{},[37,1998,1293],{},[102,2000,2001],{},[26,2002,1254],{},[102,2004,2005],{},[26,2006,1407],{},[87,2008,2009,2011,2013,2019,2021,2023],{},[102,2010,1388],{},[102,2012,1328],{},[102,2014,2015,2016,1396],{},"termina (",[26,2017,2018],{},"3 \u003C 3",[102,2020],{},[102,2022],{},[102,2024],{},[15,2026,2027],{},"Resultado en pantalla:",[19,2029,2031],{"className":2030,"code":23,"language":24},[22],[26,2032,23],{"__ignoreMap":28},[15,2034,2035],{},"Nada mágico: tres llamadas a funciones auxiliares, una por fila.",[73,2037],{},[76,2039,2041],{"id":2040},"casos-límite","Casos límite",[15,2043,2044,2045,2048],{},"El enunciado pide admitir ",[37,2046,2047],{},"cualquier"," entero, incluidos cero y negativos.",[81,2050,2051,2064],{},[84,2052,2053],{},[87,2054,2055,2058,2061],{},[90,2056,2057],{},"Caso",[90,2059,2060],{},"Qué pasa",[90,2062,2063],{},"Por qué funciona sola",[97,2065,2066,2079,2090,2108,2145,2172],{},[87,2067,2068,2073,2076],{},[102,2069,2070],{},[26,2071,2072],{},"x = 0",[102,2074,2075],{},"no imprime nada",[102,2077,2078],{},"la guardia corta antes de dibujar",[87,2080,2081,2085,2087],{},[102,2082,2083],{},[26,2084,1808],{},[102,2086,2075],{},[102,2088,2089],{},"idem",[87,2091,2092,2100,2102],{},[102,2093,2094,2096,2097,2099],{},[26,2095,237],{}," o ",[26,2098,247],{}," negativos",[102,2101,2075],{},[102,2103,2104,2107],{},[26,2105,2106],{},"\u003C= 0"," los atrapa a todos",[87,2109,2110,2118,2131],{},[102,2111,2112,120,2115],{},[26,2113,2114],{},"x = 1",[26,2116,2117],{},"y = 5",[102,2119,2120,2121,120,2123,120,2125,120,2127,120,2129],{},"una columna: ",[26,2122,298],{},[26,2124,318],{},[26,2126,318],{},[26,2128,318],{},[26,2130,298],{},[102,2132,2133,2134,120,2137,2140,2141,2144],{},"con ",[26,2135,2136],{},"width = 1",[26,2138,2139],{},"width - 1 = 0",", así que ",[37,2142,2143],{},"la misma"," columna es primera y última",[87,2146,2147,2152,2157],{},[102,2148,2149],{},[26,2150,2151],{},"y = 1",[102,2153,2154,2155],{},"una sola fila: ",[26,2156,1383],{},[102,2158,2159,2160,2163,2164,55,2166,55,2168,2171],{},"en la vuelta ",[26,2161,2162],{},"row = 0"," se cumple ",[26,2165,1935],{},[37,2167,247],{},[26,2169,2170],{},"row == y - 1","; se dibuja un solo borde",[87,2173,2174,2179,2188],{},[102,2175,2176],{},[26,2177,2178],{},"x = 2",[102,2180,2181,2184,2185,2187],{},[26,2182,2183],{},"oo"," arriba y abajo, ",[26,2186,1127],{}," al medio",[102,2189,2190,2191,2193],{},"no queda lugar para ",[26,2192,308],{}," ni para espacios; es correcto",[15,2195,2196,2197,2199,2200,2207,2208,2211,2212,2215,2216,1165],{},"El caso ",[26,2198,2114],{}," es el más lindo: ",[37,2201,2202,2203,2206],{},"no necesita ningún ",[26,2204,2205],{},"if"," extra",". La\ncondición ",[26,2209,2210],{},"column == 0 || column == width - 1"," ya contempla que ambos lados\nsean el mismo índice. Por eso ",[26,2213,2214],{},"rush(1, 1)"," imprime un único ",[26,2217,298],{},[73,2219],{},[76,2221,2223,2224],{"id":2222},"archivo-3-mainc","Archivo 3: ",[26,2225,119],{},[19,2227,2229],{"className":362,"code":2228,"language":364,"meta":28,"style":28},"\u002F* Prototipo de la funcion que vive en rush00.c. *\u002F\nvoid    rush(int x, int y);\n\nint main(void)\n{\n    rush(5, 3);\n    return (0);\n}\n",[26,2230,2231,2236,2256,2260,2273,2277,2291,2303],{"__ignoreMap":28},[368,2232,2233],{"class":370,"line":371},[368,2234,2235],{"class":392},"\u002F* Prototipo de la funcion que vive en rush00.c. *\u002F\n",[368,2237,2238,2240,2242,2244,2246,2248,2250,2252,2254],{"class":370,"line":382},[368,2239,417],{"class":374},[368,2241,1597],{"class":420},[368,2243,425],{"class":424},[368,2245,840],{"class":374},[368,2247,1604],{"class":431},[368,2249,120],{"class":424},[368,2251,840],{"class":374},[368,2253,1611],{"class":431},[368,2255,466],{"class":424},[368,2257,2258],{"class":370,"line":389},[368,2259,386],{"emptyLinePlaceholder":385},[368,2261,2262,2264,2267,2269,2271],{"class":370,"line":396},[368,2263,840],{"class":374},[368,2265,2266],{"class":420}," main",[368,2268,425],{"class":424},[368,2270,417],{"class":374},[368,2272,435],{"class":424},[368,2274,2275],{"class":370,"line":402},[368,2276,441],{"class":424},[368,2278,2279,2281,2283,2285,2287,2289],{"class":370,"line":408},[368,2280,1597],{"class":420},[368,2282,425],{"class":424},[368,2284,1095],{"class":452},[368,2286,120],{"class":424},[368,2288,1328],{"class":452},[368,2290,466],{"class":424},[368,2292,2293,2296,2299,2301],{"class":370,"line":414},[368,2294,2295],{"class":374},"    return",[368,2297,2298],{"class":424}," (",[368,2300,713],{"class":452},[368,2302,466],{"class":424},[368,2304,2305],{"class":370,"line":438},[368,2306,472],{"class":424},[15,2308,2309,1200,2314,2316,2317,2320,2321,2323,2324,2326],{},[37,2310,2311],{},[26,2312,2313],{},"int main(void)",[26,2315,592],{}," es el ",[37,2318,2319],{},"punto de entrada",": por aquí arranca\nsiempre el programa, lo llame quien lo llame. Devuelve un ",[26,2322,840],{}," al sistema\noperativo: ",[26,2325,713],{}," significa \"terminó bien\". Cualquier otro número indica error.",[15,2328,2329,2331,2332,500,2334,2336],{},[26,2330,417],{}," entre paréntesis significa \"no recibe argumentos\" (no confundir con el\n",[26,2333,417],{},[26,2335,160],{},", que ahí significaba \"no devuelve nada\"). Sí, C reusa\nla misma palabra para dos cosas distintas. Bienvenido.",[15,2338,2339,2344,2345,1646,2347,2349,2350,875,2353,258,2355,2349,2357,2360],{},[37,2340,2341],{},[26,2342,2343],{},"rush(5, 3);"," — una llamada a función. ",[26,2346,1095],{},[26,2348,1328],{}," son los ",[37,2351,2352],{},"argumentos",[26,2354,237],{},[26,2356,247],{},[37,2358,2359],{},"parámetros"," que los reciben. Es el ejemplo del enunciado.",[15,2362,2363,2364,2366],{},"Durante la defensa, el corrector va a reemplazar estos números por otros\n(incluso negativos) para ver si tu función aguanta. Por eso ",[26,2365,119],{}," es tan\ncorto: no es el ejercicio, es solo el botón de arranque.",[73,2368],{},[76,2370,2372],{"id":2371},"compilar-y-ejecutar","Compilar y ejecutar",[19,2374,2378],{"className":2375,"code":2376,"language":2377,"meta":28,"style":28},"language-sh shiki shiki-themes github-light github-dark","cd ex00\ngcc -Wall -Wextra -Werror main.c ft_putchar.c rush00.c -o rush00\n.\u002Frush00\n","sh",[26,2379,2380,2388,2416],{"__ignoreMap":28},[368,2381,2382,2385],{"class":370,"line":371},[368,2383,2384],{"class":452},"cd",[368,2386,2387],{"class":378}," ex00\n",[368,2389,2390,2392,2395,2398,2401,2404,2407,2410,2413],{"class":370,"line":382},[368,2391,70],{"class":420},[368,2393,2394],{"class":452}," -Wall",[368,2396,2397],{"class":452}," -Wextra",[368,2399,2400],{"class":452}," -Werror",[368,2402,2403],{"class":378}," main.c",[368,2405,2406],{"class":378}," ft_putchar.c",[368,2408,2409],{"class":378}," rush00.c",[368,2411,2412],{"class":452}," -o",[368,2414,2415],{"class":378}," rush00\n",[368,2417,2418],{"class":370,"line":389},[368,2419,2420],{"class":420},".\u002Frush00\n",[474,2422,2424],{"id":2423},"qué-hace-cada-parte","Qué hace cada parte",[81,2426,2427,2435],{},[84,2428,2429],{},[87,2430,2431,2433],{},[90,2432,531],{},[90,2434,534],{},[97,2436,2437,2446,2459,2469,2479,2488],{},[87,2438,2439,2443],{},[102,2440,2441],{},[26,2442,70],{},[102,2444,2445],{},"el compilador de C",[87,2447,2448,2453],{},[102,2449,2450],{},[26,2451,2452],{},"main.c ft_putchar.c rush00.c",[102,2454,2455,2458],{},[37,2456,2457],{},"los tres"," archivos; si falta uno, el enlazador falla",[87,2460,2461,2466],{},[102,2462,2463],{},[26,2464,2465],{},"-Wall",[102,2467,2468],{},"muestra los warnings más comunes",[87,2470,2471,2476],{},[102,2472,2473],{},[26,2474,2475],{},"-Wextra",[102,2477,2478],{},"muestra warnings adicionales",[87,2480,2481,2485],{},[102,2482,2483],{},[26,2484,512],{},[102,2486,2487],{},"convierte cada warning en error: si algo está mal, no compila",[87,2489,2490,2495],{},[102,2491,2492],{},[26,2493,2494],{},"-o rush00",[102,2496,2497],{},"nombre del ejecutable de salida",[15,2499,2500,2502],{},[26,2501,512],{}," parece cruel, y lo es a propósito: 42 no acepta código que compile\n\"con advertencias\". Mejor que el error te lo diga el compilador y no el\ncorrector.",[48,2504,2505],{},[15,2506,2507,2513,2514,1165],{},[37,2508,2509,2510,2512],{},"¿Qué es ",[26,2511,70],{}," y por qué esos flags?"," Está explicado a fondo, con las\ncuatro etapas de la compilación y un flag por flag, en\n",[57,2515,2517],{"href":2516},"\u002Fconceptos#compilar-qu%C3%A9-es-gcc-y-por-qu%C3%A9-esos-flags",[26,2518,62],{},[474,2520,211],{"id":2521},"ejecutar",[19,2523,2524],{"className":2375,"code":2420,"language":2377,"meta":28,"style":28},[26,2525,2526],{"__ignoreMap":28},[368,2527,2528],{"class":370,"line":371},[368,2529,2420],{"class":420},[15,2531,2532,2533,2536,2537,2540,2541,2544],{},"El ",[26,2534,2535],{},".\u002F"," significa \"busca el ejecutable en el directorio actual\". No es\ndecoración: por seguridad, el directorio actual no está en el ",[26,2538,2539],{},"PATH",", así que\nescribir solo ",[26,2542,2543],{},"rush00"," no lo encuentra.",[15,2546,2547],{},"Deberías ver:",[19,2549,2551],{"className":2550,"code":23,"language":24},[22],[26,2552,23],{"__ignoreMap":28},[474,2554,2556],{"id":2555},"probar-otros-tamaños","Probar otros tamaños",[15,2558,2559,2560,2562],{},"Editá el ",[26,2561,119],{},", cambia los números y vuelve a compilar:",[19,2564,2566],{"className":362,"code":2565,"language":364,"meta":28,"style":28},"rush(4, 4);\n",[26,2567,2568],{"__ignoreMap":28},[368,2569,2570,2572,2574,2576,2578,2580],{"class":370,"line":371},[368,2571,229],{"class":420},[368,2573,425],{"class":424},[368,2575,1155],{"class":452},[368,2577,120],{"class":424},[368,2579,1155],{"class":452},[368,2581,466],{"class":424},[19,2583,2586],{"className":2584,"code":2585,"language":24},[22],"o--o\n|  |\n|  |\no--o\n",[26,2587,2585],{"__ignoreMap":28},[19,2589,2591],{"className":362,"code":2590,"language":364,"meta":28,"style":28},"rush(1, 5);\n",[26,2592,2593],{"__ignoreMap":28},[368,2594,2595,2597,2599,2601,2603,2605],{"class":370,"line":371},[368,2596,229],{"class":420},[368,2598,425],{"class":424},[368,2600,453],{"class":452},[368,2602,120],{"class":424},[368,2604,1095],{"class":452},[368,2606,466],{"class":424},[19,2608,2611],{"className":2609,"code":2610,"language":24},[22],"o\n|\n|\n|\no\n",[26,2612,2610],{"__ignoreMap":28},[15,2614,2615],{},"No hace falta adivinar: compila, mira la salida y compárala con el enunciado.",[73,2617],{},[76,2619,2621],{"id":2620},"errores-típicos-del-primer-día","Errores típicos del primer día",[81,2623,2624,2637],{},[84,2625,2626],{},[87,2627,2628,2631,2634],{},[90,2629,2630],{},"Mensaje \u002F síntoma",[90,2632,2633],{},"Causa",[90,2635,2636],{},"Solución",[97,2638,2639,2654,2674,2692,2705,2722,2734,2747,2765],{},[87,2640,2641,2646,2651],{},[102,2642,2643],{},[26,2644,2645],{},"implicit declaration of function 'write'",[102,2647,2648,2649],{},"falta ",[26,2650,479],{},[102,2652,2653],{},"agrégalo arriba",[87,2655,2656,2661,2668],{},[102,2657,2658],{},[26,2659,2660],{},"implicit declaration of function 'ft_putchar'",[102,2662,2663,2664,2096,2666],{},"falta el prototipo en ",[26,2665,126],{},[26,2667,119],{},[102,2669,2670,2671],{},"agrega ",[26,2672,2673],{},"void ft_putchar(char c);",[87,2675,2676,2681,2689],{},[102,2677,2678],{},[26,2679,2680],{},"undefined reference to 'ft_putchar'",[102,2682,2683,2684,2686,2687],{},"no incluiste ",[26,2685,123],{}," en el comando de ",[26,2688,70],{},[102,2690,2691],{},"pasa los tres archivos",[87,2693,2694,2699,2702],{},[102,2695,2696],{},[26,2697,2698],{},"expected ';' before ...",[102,2700,2701],{},"falta un punto y coma",[102,2703,2704],{},"busca la línea anterior a la que marca",[87,2706,2707,2710,2717],{},[102,2708,2709],{},"El programa no termina nunca",[102,2711,2712,2713,2096,2715],{},"te olvidaste ",[26,2714,1199],{},[26,2716,1908],{},[102,2718,2719,2720],{},"agrégalo dentro del ",[26,2721,1053],{},[87,2723,2724,2727,2731],{},[102,2725,2726],{},"Todo sale en una sola línea",[102,2728,2712,2729],{},[26,2730,1232],{},[102,2732,2733],{},"agrégalo al final de cada fila",[87,2735,2736,2741,2744],{},[102,2737,2738],{},[26,2739,2740],{},"warning: unused parameter",[102,2742,2743],{},"declaraste un parámetro que no usas",[102,2745,2746],{},"úsalo o quita el nombre",[87,2748,2749,2752,2762],{},[102,2750,2751],{},"No aparece nada y antes andaba",[102,2753,2754,2096,2756,2758,2759,2761],{},[26,2755,237],{},[26,2757,247],{}," en ",[26,2760,713],{},"\u002Fnegativos",[102,2763,2764],{},"es el comportamiento esperado",[87,2766,2767,2773,2778],{},[102,2768,2769,2772],{},[26,2770,2771],{},"permission denied"," al ejecutar",[102,2774,2775,2776],{},"falta el ",[26,2777,2535],{},[102,2779,2780],{},[26,2781,2782],{},".\u002Frush00",[73,2784],{},[76,2786,2788],{"id":2787},"por-qué-el-código-está-ordenado-así-solid","Por qué el código está ordenado así (SOLID)",[15,2790,2791,2792,2795],{},"SOLID es un conjunto de principios pensados para ",[37,2793,2794],{},"diseño orientado a\nobjetos",": hablan de clases, interfaces y herencia. En C de piscina no hay\nclases, así que no aplica entero. Lo que sí se traslada, y es lo que usamos\naquí:",[81,2797,2798,2808],{},[84,2799,2800],{},[87,2801,2802,2805],{},[90,2803,2804],{},"Principio",[90,2806,2807],{},"Cómo se ve en este código",[97,2809,2810,2829,2842],{},[87,2811,2812,2818],{},[102,2813,2814,2817],{},[37,2815,2816],{},"S"," — Single Responsibility",[102,2819,2820,2822,2823,2825,2826,2828],{},[26,2821,818],{}," dibuja bordes; ",[26,2824,1413],{}," dibuja el medio; ",[26,2827,229],{}," decide el orden. Cada una hace una cosa.",[87,2830,2831,2837],{},[102,2832,2833,2836],{},[37,2834,2835],{},"O"," — Open\u002FClosed",[102,2838,2839,2840,1165],{},"Para otro dibujo (por ejemplo un triángulo) agregas funciones nuevas; no reescribes ",[26,2841,229],{},[87,2843,2844,2849],{},[102,2845,2846],{},[37,2847,2848],{},"L \u002F I \u002F D",[102,2850,2851],{},"No tienen equivalente útil en un ejercicio de 40 líneas. Forzarlos sería sobreingeniería.",[15,2853,2854,2855,2858,2859,2861],{},"La regla práctica que importa: ",[37,2856,2857],{},"una función, una tarea, un nombre honesto",".\nSi una función necesita la palabra \"y\" para describirse (\"dibuja el borde ",[37,2860,247],{},"\ndecide la fila\"), son dos funciones.",[15,2863,2864,2865,2867,2868,2871],{},"Lo que ",[37,2866,177],{}," hay que hacer aquí: crear ",[26,2869,2870],{},"struct","s, punteros a función o un\nsistema de \"renderers\" para dibujar un rectángulo. La Norm de 42 no premia la\ncomplejidad: premia que se entienda.",[73,2873],{},[76,2875,2877],{"id":2876},"glosario","Glosario",[81,2879,2880,2889],{},[84,2881,2882],{},[87,2883,2884,2887],{},[90,2885,2886],{},"Término",[90,2888,534],{},[97,2890,2891,2904,2914,2925,2934,2944,2960,2970,2982,2993,3006,3019],{},[87,2892,2893,2898],{},[102,2894,2895],{},[37,2896,2897],{},"compilador",[102,2899,2900,2901,2903],{},"programa que traduce C a instrucciones de máquina (",[26,2902,70],{},")",[87,2905,2906,2911],{},[102,2907,2908],{},[37,2909,2910],{},"enlazador (linker)",[102,2912,2913],{},"une los archivos ya compilados en un ejecutable",[87,2915,2916,2920],{},[102,2917,2918],{},[37,2919,489],{},[102,2921,2922,2923],{},"paso previo que procesa los ",[26,2924,375],{},[87,2926,2927,2931],{},[102,2928,2929],{},[37,2930,778],{},[102,2932,2933],{},"la firma de una función, sin su cuerpo",[87,2935,2936,2941],{},[102,2937,2938],{},[37,2939,2940],{},"parámetro \u002F argumento",[102,2942,2943],{},"la variable que recibe la función \u002F el valor que le pasas",[87,2945,2946,2951],{},[102,2947,2948],{},[37,2949,2950],{},"bloque",[102,2952,2953,2954,1646,2957],{},"todo lo que está entre ",[26,2955,2956],{},"{",[26,2958,2959],{},"}",[87,2961,2962,2967],{},[102,2963,2964],{},[37,2965,2966],{},"iteración",[102,2968,2969],{},"una vuelta de un bucle",[87,2971,2972,2976],{},[102,2973,2974],{},[37,2975,614],{},[102,2977,2978,2979,2981],{},"número que identifica dónde leer\u002Fescribir (",[26,2980,453],{}," = pantalla)",[87,2983,2984,2988],{},[102,2985,2986],{},[37,2987,1777],{},[102,2989,2990,2991],{},"resolver el caso inválido al principio y salir con ",[26,2992,66],{},[87,2994,2995,3000],{},[102,2996,2997],{},[37,2998,2999],{},"índice",[102,3001,3002,3003],{},"posición de un elemento, ",[37,3004,3005],{},"empezando en 0",[87,3007,3008,3013],{},[102,3009,3010],{},[37,3011,3012],{},"bucle infinito",[102,3014,3015,3016,3018],{},"un ",[26,3017,1053],{}," cuya condición nunca se vuelve falsa",[87,3020,3021,3026],{},[102,3022,3023],{},[37,3024,3025],{},"Norm",[102,3027,3028],{},"reglas de estilo de 42 (tabs, nombres, cantidad de líneas)",[73,3030],{},[76,3032,3034],{"id":3033},"siguiente-paso","Siguiente paso",[15,3036,3037,3038,3040,3041,3043,3044,3046],{},"Compila, cambia los números del ",[26,3039,119],{}," y predice la salida ",[37,3042,1065],{}," de\nejecutar. Si aciertas los cinco ejemplos del enunciado, entendiste el\nejercicio. Si no, vuelve a la traza de ",[26,3045,34],{},": ahí está todo.",[76,3048,3050],{"id":3049},"después-del-rush-el-módulo-c-00","Después del rush: el módulo C 00",[15,3052,3053],{},"El rectángulo es el Rush 00, pero el módulo C 00 de la piscina tiene nueve\nejercicios. Cada uno tiene su apartado propio, con el código explicado línea\npor línea, la salida exacta y los errores típicos:",[81,3055,3056,3066],{},[84,3057,3058],{},[87,3059,3060,3063],{},[90,3061,3062],{},"Ejercicio",[90,3064,3065],{},"Qué practica",[97,3067,3068,3083,3094,3105,3116,3127,3138,3155,3169],{},[87,3069,3070,3076],{},[102,3071,3072],{},[57,3073,3075],{"href":3074},"\u002Fex00","00 · ft_putchar",[102,3077,3078,3080,3081],{},[26,3079,137],{},", direcciones y ",[26,3082,428],{},[87,3084,3085,3091],{},[102,3086,3087],{},[57,3088,3090],{"href":3089},"\u002Fex01","01 · ft_print_alphabet",[102,3092,3093],{},"un bucle y la consecutividad de ASCII",[87,3095,3096,3102],{},[102,3097,3098],{},[57,3099,3101],{"href":3100},"\u002Fex02","02 · ft_print_reverse_alphabet",[102,3103,3104],{},"el mismo bucle al revés",[87,3106,3107,3113],{},[102,3108,3109],{},[57,3110,3112],{"href":3111},"\u002Fex03","03 · ft_print_numbers",[102,3114,3115],{},"convertir número en carácter",[87,3117,3118,3124],{},[102,3119,3120],{},[57,3121,3123],{"href":3122},"\u002Fex04","04 · ft_is_negative",[102,3125,3126],{},"decisiones y el caso del cero",[87,3128,3129,3135],{},[102,3130,3131],{},[57,3132,3134],{"href":3133},"\u002Fex05","05 · ft_print_comb",[102,3136,3137],{},"tres bucles y separadores",[87,3139,3140,3146],{},[102,3141,3142],{},[57,3143,3145],{"href":3144},"\u002Fex06","06 · ft_print_comb2",[102,3147,3148,3149,1646,3152],{},"dos cifras con ",[26,3150,3151],{},"\u002F",[26,3153,3154],{},"%",[87,3156,3157,3163],{},[102,3158,3159],{},[57,3160,3162],{"href":3161},"\u002Fex07","07 · ft_putnbr",[102,3164,3165,3166],{},"recursión e ",[26,3167,3168],{},"INT_MIN",[87,3170,3171,3177],{},[102,3172,3173],{},[57,3174,3176],{"href":3175},"\u002Fex08","08 · ft_print_combn",[102,3178,3179],{},"arrays, topes y recursión",[15,3181,3182],{},"Los nueve se comprueban de una vez con:",[19,3184,3186],{"className":2375,"code":3185,"language":2377,"meta":28,"style":28},".\u002Fscripts\u002Fcheck-exercises.sh\n",[26,3187,3188],{"__ignoreMap":28},[368,3189,3190],{"class":370,"line":371},[368,3191,3185],{"class":420},[15,3193,3194,3195,3198,3199,3201],{},"Compila cada carpeta con ",[26,3196,3197],{},"-Wall -Wextra -Werror",", ejecuta el resultado con un\n",[26,3200,592],{}," temporal y compara la salida byte a byte. Si algo falla, imprime el\nprimer byte distinto.",[3203,3204,3205],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":28,"searchDepth":382,"depth":382,"links":3207},[3208,3209,3210,3211,3217,3228,3230,3231,3233,3238,3239,3240,3241,3242],{"id":78,"depth":382,"text":79},{"id":166,"depth":382,"text":167},{"id":223,"depth":382,"text":224},{"id":356,"depth":382,"text":3212,"children":3213},"Archivo 1: ft_putchar.c",[3214,3215,3216],{"id":476,"depth":389,"text":479},{"id":516,"depth":389,"text":519},{"id":603,"depth":389,"text":606},{"id":738,"depth":382,"text":3218,"children":3219},"Archivo 2: rush00.c",[3220,3222,3224,3226],{"id":750,"depth":389,"text":3221},"La declaración de ft_putchar",{"id":815,"depth":389,"text":3223},"print_horizontal_edge: dibujar un borde",{"id":1410,"depth":389,"text":3225},"print_vertical_edge: dibujar una fila del medio",{"id":1582,"depth":389,"text":3227},"rush: el director de orquesta",{"id":1914,"depth":382,"text":3229},"Traza completa: qué pasa con rush(5, 3)",{"id":2040,"depth":382,"text":2041},{"id":2222,"depth":382,"text":3232},"Archivo 3: main.c",{"id":2371,"depth":382,"text":2372,"children":3234},[3235,3236,3237],{"id":2423,"depth":389,"text":2424},{"id":2521,"depth":389,"text":211},{"id":2555,"depth":389,"text":2556},{"id":2620,"depth":382,"text":2621},{"id":2787,"depth":382,"text":2788},{"id":2876,"depth":382,"text":2877},{"id":3033,"depth":382,"text":3034},{"id":3049,"depth":382,"text":3050},"Cada línea de los tres archivos del Rush 00, con trazas, casos límite y errores típicos.","md",{},"\u002Frush00",{"title":5,"description":3243},"NQ-RuaQQrjSeBmK30VYhFiO9XM6avDsLOsOg_rCeel8",1793539815756]