[{"data":1,"prerenderedAt":6341},["ShallowReactive",2],{"doc:\u002Fconceptos":3},{"id":4,"title":5,"body":6,"description":6334,"extension":6335,"meta":6336,"navigation":397,"path":6337,"seo":6338,"stem":6339,"__hash__":6340},"docs\u002Fconceptos.md","Conceptos de C",{"type":7,"value":8,"toc":6261},"minimark",[9,14,32,38,49,52,57,62,69,138,182,193,214,217,221,232,310,331,335,342,474,477,495,509,513,546,553,557,612,639,641,644,647,654,712,719,727,731,734,783,786,792,795,833,863,867,874,999,1011,1021,1025,1031,1133,1143,1191,1229,1244,1248,1251,1368,1382,1396,1403,1427,1436,1445,1448,1451,1457,1467,1469,1473,1477,1480,1800,1807,1810,1887,1890,1894,1962,1966,1969,2024,2027,2053,2056,2067,2069,2073,2076,2086,2157,2161,2164,2170,2286,2291,2402,2415,2419,2468,2479,2488,2555,2568,2572,2606,2620,2623,2654,2668,2670,2674,2677,2680,2738,2792,2796,2799,2863,2868,2875,2930,3003,3009,3012,3042,3051,3098,3137,3149,3160,3164,3167,3281,3284,3290,3303,3307,3326,3348,3360,3369,3405,3414,3417,3424,3487,3500,3502,3506,3510,3517,3538,3544,3561,3565,3588,3594,3600,3603,3627,3634,3640,3652,3656,3659,3745,3760,3764,3767,4136,4138,4144,4151,4155,4165,4204,4225,4228,4248,4255,4257,4261,4276,4336,4339,4386,4389,4391,4395,4405,4411,4414,4471,4481,4513,4515,4519,4523,4534,4547,4553,4675,4678,4748,4752,4798,4804,4810,4816,4822,4832,4840,4860,4885,4889,4920,5010,5021,5025,5031,5037,5112,5121,5126,5129,5194,5213,5218,5221,5260,5263,5269,5274,5280,5286,5292,5295,5314,5347,5351,5358,5366,5390,5399,5405,5420,5455,5458,5465,5483,5492,5495,5549,5567,5573,5580,5617,5623,5635,5644,5650,5657,5677,5711,5725,5731,5738,5757,5761,5767,5770,5815,5819,5872,5882,5885,5905,5907,5911,6101,6103,6107,6110,6229,6236,6238,6242,6257],[10,11,13],"h1",{"id":12},"conceptos-de-c-que-usa-el-rush-00","Conceptos de C que usa el Rush 00",[15,16,17,18,22,23,31],"p",{},"Este documento explica ",[19,20,21],"strong",{},"los conceptos",", no el ejercicio. El ejercicio está en\n",[24,25,27],"a",{"href":26},"\u002Frush00",[28,29,30],"code",{},"README.md",". Lee esto primero si llevas poco tiempo programando:\ncada concepto aquí tiene un ejemplo mínimo y una línea que dice dónde aparece\nen el rush.",[15,33,34],{},[35,36,37],"em",{},"Hecho con amor para Laura, por Bogdan.",[15,39,40,41,44,45,48],{},"Todos los conceptos comparten un mismo enemigo: ",[19,42,43],{},"el anidamiento",". Cuanto más\nadentro está tu código (más llaves, más indentación), más difícil es entenderlo.\nVariables con buenos nombres, funciones chicas, ",[28,46,47],{},"return"," temprano y bucles\nsimples son las cuatro herramientas para mantenerlo plano.",[50,51],"hr",{},[53,54,56],"h2",{"id":55},"variables","Variables",[58,59,61],"h3",{"id":60},"qué-es","Qué es",[15,63,64,65,68],{},"Una variable es una ",[19,66,67],{},"caja con nombre"," en la memoria. La caja tiene tres cosas:",[70,71,72,88],"table",{},[73,74,75],"thead",{},[76,77,78,82,85],"tr",{},[79,80,81],"th",{},"Propiedad",[79,83,84],{},"Ejemplo",[79,86,87],{},"Detalle",[89,90,91,108,123],"tbody",{},[76,92,93,100,105],{},[94,95,96,97],"td",{},"un ",[19,98,99],{},"nombre",[94,101,102],{},[28,103,104],{},"column",[94,106,107],{},"cómo la llamas en el código",[76,109,110,115,120],{},[94,111,96,112],{},[19,113,114],{},"tipo",[94,116,117],{},[28,118,119],{},"int",[94,121,122],{},"qué forma tiene lo que guarda y cuánto ocupa",[76,124,125,130,135],{},[94,126,96,127],{},[19,128,129],{},"valor",[94,131,132],{},[28,133,134],{},"0",[94,136,137],{},"lo que hay adentro ahora mismo",[139,140,145],"pre",{"className":141,"code":142,"language":143,"meta":144,"style":144},"language-c shiki shiki-themes github-light github-dark","int column;      \u002F* creo la caja. Adentro hay BASURA. *\u002F\ncolumn = 0;      \u002F* guardo un 0. Solo ahora sé qué hay. *\u002F\n","c","",[28,146,147,163],{"__ignoreMap":144},[148,149,152,155,159],"span",{"class":150,"line":151},"line",1,[148,153,119],{"class":154},"szBVR",[148,156,158],{"class":157},"sVt8B"," column;",[148,160,162],{"class":161},"sJ8bj","      \u002F* creo la caja. Adentro hay BASURA. *\u002F\n",[148,164,166,169,172,176,179],{"class":150,"line":165},2,[148,167,168],{"class":157},"column ",[148,170,171],{"class":154},"=",[148,173,175],{"class":174},"sj4cs"," 0",[148,177,178],{"class":157},";",[148,180,181],{"class":161},"      \u002F* guardo un 0. Solo ahora sé qué hay. *\u002F\n",[15,183,184,185,188,189,192],{},"La primera línea es una ",[19,186,187],{},"declaración","; la segunda, una ",[19,190,191],{},"asignación",". También\nse pueden juntar:",[139,194,196],{"className":141,"code":195,"language":143,"meta":144,"style":144},"int column = 0;  \u002F* declaro y asigno en una sola línea *\u002F\n",[28,197,198],{"__ignoreMap":144},[148,199,200,202,205,207,209,211],{"class":150,"line":151},[148,201,119],{"class":154},[148,203,204],{"class":157}," column ",[148,206,171],{"class":154},[148,208,175],{"class":174},[148,210,178],{"class":157},[148,212,213],{"class":161},"  \u002F* declaro y asigno en una sola línea *\u002F\n",[15,215,216],{},"Las dos formas son válidas. En este proyecto usamos la primera porque la Norm de\n42 pide las declaraciones al principio del bloque, separadas del código.",[58,218,220],{"id":219},"el-tipo-importa","El tipo importa",[15,222,223,224,227,228,231],{},"El tipo decide ",[19,225,226],{},"cuántos bytes"," ocupa la caja y ",[19,229,230],{},"cómo se interpretan",":",[70,233,234,249],{},[73,235,236],{},[76,237,238,241,244,247],{},[79,239,240],{},"Tipo",[79,242,243],{},"Tamaño típico",[79,245,246],{},"Guarda",[79,248,84],{},[89,250,251,269,292],{},[76,252,253,258,261,264],{},[94,254,255],{},[28,256,257],{},"char",[94,259,260],{},"1 byte",[94,262,263],{},"un carácter (o un número entre -128 y 127)",[94,265,266],{},[28,267,268],{},"'o'",[76,270,271,275,278,281],{},[94,272,273],{},[28,274,119],{},[94,276,277],{},"4 bytes",[94,279,280],{},"un entero",[94,282,283,286,287,286,289],{},[28,284,285],{},"-3",", ",[28,288,134],{},[28,290,291],{},"42",[76,293,294,299,302,305],{},[94,295,296],{},[28,297,298],{},"long",[94,300,301],{},"8 bytes",[94,303,304],{},"un entero más grande",[94,306,307],{},[28,308,309],{},"1000000",[15,311,312,313,315,316,318,319,315,322,324,325,327,328,330],{},"Si guardas ",[28,314,268],{}," en un ",[28,317,257],{},", la caja contiene el número 111 (su código ASCII).\nSi guardas ",[28,320,321],{},"300",[28,323,257],{},", se desborda: no entra. Ese es el motivo por el\nque el ancho y el alto del rush son ",[28,326,119],{}," y no ",[28,329,257],{},".",[58,332,334],{"id":333},"ciclo-de-vida-scope","Ciclo de vida (scope)",[15,336,337,338,341],{},"Una variable ",[19,339,340],{},"vive entre la llave que la abre y la llave que la cierra",". Al\nsalir de ese bloque, la caja desaparece:",[139,343,345],{"className":141,"code":344,"language":143,"meta":144,"style":144},"void    rush(int x, int y)\n{\n    int row;      \u002F* row vive hasta el } de rush *\u002F\n\n    row = 0;\n    while (row \u003C y)\n    {\n        \u002F* aquí row sigue viviendo *\u002F\n        row++;\n    }\n    \u002F* aquí row sigue viviendo *\u002F\n}\n\u002F* aquí row ya no existe: usarla es un error de compilación *\u002F\n",[28,346,347,375,380,392,399,412,427,433,439,450,456,462,468],{"__ignoreMap":144},[148,348,349,352,356,359,361,365,367,369,372],{"class":150,"line":151},[148,350,351],{"class":154},"void",[148,353,355],{"class":354},"sScJk","    rush",[148,357,358],{"class":157},"(",[148,360,119],{"class":154},[148,362,364],{"class":363},"s4XuR"," x",[148,366,286],{"class":157},[148,368,119],{"class":154},[148,370,371],{"class":363}," y",[148,373,374],{"class":157},")\n",[148,376,377],{"class":150,"line":165},[148,378,379],{"class":157},"{\n",[148,381,383,386,389],{"class":150,"line":382},3,[148,384,385],{"class":154},"    int",[148,387,388],{"class":157}," row;",[148,390,391],{"class":161},"      \u002F* row vive hasta el } de rush *\u002F\n",[148,393,395],{"class":150,"line":394},4,[148,396,398],{"emptyLinePlaceholder":397},true,"\n",[148,400,402,405,407,409],{"class":150,"line":401},5,[148,403,404],{"class":157},"    row ",[148,406,171],{"class":154},[148,408,175],{"class":174},[148,410,411],{"class":157},";\n",[148,413,415,418,421,424],{"class":150,"line":414},6,[148,416,417],{"class":154},"    while",[148,419,420],{"class":157}," (row ",[148,422,423],{"class":154},"\u003C",[148,425,426],{"class":157}," y)\n",[148,428,430],{"class":150,"line":429},7,[148,431,432],{"class":157},"    {\n",[148,434,436],{"class":150,"line":435},8,[148,437,438],{"class":161},"        \u002F* aquí row sigue viviendo *\u002F\n",[148,440,442,445,448],{"class":150,"line":441},9,[148,443,444],{"class":157},"        row",[148,446,447],{"class":154},"++",[148,449,411],{"class":157},[148,451,453],{"class":150,"line":452},10,[148,454,455],{"class":157},"    }\n",[148,457,459],{"class":150,"line":458},11,[148,460,461],{"class":161},"    \u002F* aquí row sigue viviendo *\u002F\n",[148,463,465],{"class":150,"line":464},12,[148,466,467],{"class":157},"}\n",[148,469,471],{"class":150,"line":470},13,[148,472,473],{"class":161},"\u002F* aquí row ya no existe: usarla es un error de compilación *\u002F\n",[15,475,476],{},"Dos consecuencias que sorprenden el primer día:",[478,479,480,484],"ol",{},[481,482,483],"li",{},"Una variable no se puede usar fuera de su bloque.",[481,485,486,487,490,491,494],{},"Dos funciones pueden tener una variable llamada ",[28,488,489],{},"row"," ",[19,492,493],{},"sin pisarse",": son\ncajas distintas en lugares distintos.",[15,496,497,498,501,502,505,506,508],{},"Por eso ",[28,499,500],{},"print_horizontal_edge"," y ",[28,503,504],{},"print_vertical_edge"," pueden declarar cada una\nsu propio ",[28,507,104],{},": no comparten nada.",[58,510,512],{"id":511},"nunca-uses-una-variable-sin-inicializar","Nunca uses una variable sin inicializar",[139,514,516],{"className":141,"code":515,"language":143,"meta":144,"style":144},"int column;         \u002F* contiene basura: lo que quedó de otro programa *\u002F\nwhile (column \u003C 5)  \u002F* compara basura con 5: resultado impredecible *\u002F\n",[28,517,518,527],{"__ignoreMap":144},[148,519,520,522,524],{"class":150,"line":151},[148,521,119],{"class":154},[148,523,158],{"class":157},[148,525,526],{"class":161},"         \u002F* contiene basura: lo que quedó de otro programa *\u002F\n",[148,528,529,532,535,537,540,543],{"class":150,"line":165},[148,530,531],{"class":154},"while",[148,533,534],{"class":157}," (column ",[148,536,423],{"class":154},[148,538,539],{"class":174}," 5",[148,541,542],{"class":157},")",[148,544,545],{"class":161},"  \u002F* compara basura con 5: resultado impredecible *\u002F\n",[15,547,548,549,552],{},"Esto no siempre da error: da ",[19,550,551],{},"comportamiento raro",", que es peor. La regla es\nsimple: la primera vez que nombres una variable, dale un valor.",[58,554,556],{"id":555},"dónde-aparece-en-el-rush","Dónde aparece en el rush",[70,558,559,569],{},[73,560,561],{},[76,562,563,566],{},[79,564,565],{},"Variable",[79,567,568],{},"Para qué",[89,570,571,584,594,603],{},[76,572,573,581],{},[94,574,575,286,578],{},[28,576,577],{},"x",[28,579,580],{},"y",[94,582,583],{},"parámetros: ancho y alto",[76,585,586,591],{},[94,587,588],{},[28,589,590],{},"width",[94,592,593],{},"copia del ancho dentro de las funciones auxiliares",[76,595,596,600],{},[94,597,598],{},[28,599,489],{},[94,601,602],{},"qué fila estoy imprimiendo",[76,604,605,609],{},[94,606,607],{},[28,608,104],{},[94,610,611],{},"qué columna de esa fila estoy imprimiendo",[15,613,614,615,617,618,621,622,624,625,627,628,630,631,634,635,330],{},"Ojo: ",[28,616,590],{}," es una ",[19,619,620],{},"copia"," de ",[28,623,577],{},". Si dentro de la función cambiaras ",[28,626,590],{},",\n",[28,629,577],{}," en ",[28,632,633],{},"rush"," no se entera. Eso se explica en ",[24,636,638],{"href":637},"#funciones","Funciones",[50,640],{},[53,642,638],{"id":643},"funciones",[58,645,61],{"id":646},"qué-es-1",[15,648,649,650,653],{},"Una función es un ",[19,651,652],{},"bloque de código con nombre"," que puedes ejecutar cuando\nquieras, todas las veces que quieras, sin copiar y pegar.",[139,655,657],{"className":141,"code":656,"language":143,"meta":144,"style":144},"void    ft_putchar(char c)   \u002F* firma: qué devuelve, cómo se llama, qué recibe *\u002F\n{\n    write(1, &c, 1);         \u002F* cuerpo: lo que hace *\u002F\n}\n",[28,658,659,678,682,708],{"__ignoreMap":144},[148,660,661,663,666,668,670,673,675],{"class":150,"line":151},[148,662,351],{"class":154},[148,664,665],{"class":354},"    ft_putchar",[148,667,358],{"class":157},[148,669,257],{"class":154},[148,671,672],{"class":363}," c",[148,674,542],{"class":157},[148,676,677],{"class":161},"   \u002F* firma: qué devuelve, cómo se llama, qué recibe *\u002F\n",[148,679,680],{"class":150,"line":165},[148,681,379],{"class":157},[148,683,684,687,689,692,694,697,700,702,705],{"class":150,"line":382},[148,685,686],{"class":354},"    write",[148,688,358],{"class":157},[148,690,691],{"class":174},"1",[148,693,286],{"class":157},[148,695,696],{"class":154},"&",[148,698,699],{"class":157},"c, ",[148,701,691],{"class":174},[148,703,704],{"class":157},");",[148,706,707],{"class":161},"         \u002F* cuerpo: lo que hace *\u002F\n",[148,709,710],{"class":150,"line":394},[148,711,467],{"class":157},[15,713,714,715,718],{},"La ",[19,716,717],{},"firma"," se lee así:",[139,720,725],{"className":721,"code":723,"language":724},[722],"language-text","void        ft_putchar   (char c)\n │              │            │\n │              │            └── parámetro: qué recibe\n │              └─────────────── nombre\n └────────────────────────────── qué devuelve (void = nada)\n","text",[28,726,723],{"__ignoreMap":144},[58,728,730],{"id":729},"parámetro-vs-argumento","Parámetro vs argumento",[15,732,733],{},"Se confunden todo el tiempo y no son lo mismo:",[70,735,736,748],{},[73,737,738],{},[76,739,740,743,746],{},[79,741,742],{},"Término",[79,744,745],{},"Dónde vive",[79,747,84],{},[89,749,750,765],{},[76,751,752,757,760],{},[94,753,754],{},[19,755,756],{},"parámetro",[94,758,759],{},"en la definición de la función",[94,761,762],{},[28,763,764],{},"char c",[76,766,767,772,775],{},[94,768,769],{},[19,770,771],{},"argumento",[94,773,774],{},"en el lugar donde la llamas",[94,776,777,778,621,780],{},"el ",[28,779,268],{},[28,781,782],{},"ft_putchar('o')",[15,784,785],{},"El parámetro es la caja vacía; el argumento es lo que metes en la caja al\nllamar.",[58,787,789,791],{"id":788},"void-significa-dos-cosas-distintas",[28,790,351],{}," significa dos cosas distintas",[15,793,794],{},"Sí, C reusa la palabra. Mira:",[139,796,798],{"className":141,"code":797,"language":143,"meta":144,"style":144},"void    ft_putchar(char c);   \u002F* void aquí: NO DEVUELVE nada *\u002F\nint     main(void);           \u002F* void aquí: NO RECIBE argumentos *\u002F\n",[28,799,800,817],{"__ignoreMap":144},[148,801,802,804,806,808,810,812,814],{"class":150,"line":151},[148,803,351],{"class":154},[148,805,665],{"class":354},[148,807,358],{"class":157},[148,809,257],{"class":154},[148,811,672],{"class":363},[148,813,704],{"class":157},[148,815,816],{"class":161},"   \u002F* void aquí: NO DEVUELVE nada *\u002F\n",[148,818,819,821,824,826,828,830],{"class":150,"line":165},[148,820,119],{"class":154},[148,822,823],{"class":354},"     main",[148,825,358],{"class":157},[148,827,351],{"class":154},[148,829,704],{"class":157},[148,831,832],{"class":161},"           \u002F* void aquí: NO RECIBE argumentos *\u002F\n",[70,834,835,845],{},[73,836,837],{},[76,838,839,842],{},[79,840,841],{},"Posición",[79,843,844],{},"Significado",[89,846,847,855],{},[76,848,849,852],{},[94,850,851],{},"antes del nombre",[94,853,854],{},"no devuelve valor",[76,856,857,860],{},[94,858,859],{},"entre paréntesis",[94,861,862],{},"no recibe parámetros",[58,864,866],{"id":865},"valor-de-retorno","Valor de retorno",[15,868,869,870,873],{},"Una función puede devolver ",[19,871,872],{},"un"," valor, y ese valor se puede usar:",[139,875,877],{"className":141,"code":876,"language":143,"meta":144,"style":144},"int add(int a, int b)\n{\n    return (a + b);   \u002F* devuelve el resultado y termina la función *\u002F\n}\n\nint main(void)\n{\n    int total;\n\n    total = add(2, 3);   \u002F* total vale 5 *\u002F\n    return (0);\n}\n",[28,878,879,902,906,923,927,931,944,948,955,959,983,995],{"__ignoreMap":144},[148,880,881,883,886,888,890,893,895,897,900],{"class":150,"line":151},[148,882,119],{"class":154},[148,884,885],{"class":354}," add",[148,887,358],{"class":157},[148,889,119],{"class":154},[148,891,892],{"class":363}," a",[148,894,286],{"class":157},[148,896,119],{"class":154},[148,898,899],{"class":363}," b",[148,901,374],{"class":157},[148,903,904],{"class":150,"line":165},[148,905,379],{"class":157},[148,907,908,911,914,917,920],{"class":150,"line":382},[148,909,910],{"class":154},"    return",[148,912,913],{"class":157}," (a ",[148,915,916],{"class":154},"+",[148,918,919],{"class":157}," b);",[148,921,922],{"class":161},"   \u002F* devuelve el resultado y termina la función *\u002F\n",[148,924,925],{"class":150,"line":394},[148,926,467],{"class":157},[148,928,929],{"class":150,"line":401},[148,930,398],{"emptyLinePlaceholder":397},[148,932,933,935,938,940,942],{"class":150,"line":414},[148,934,119],{"class":154},[148,936,937],{"class":354}," main",[148,939,358],{"class":157},[148,941,351],{"class":154},[148,943,374],{"class":157},[148,945,946],{"class":150,"line":429},[148,947,379],{"class":157},[148,949,950,952],{"class":150,"line":435},[148,951,385],{"class":154},[148,953,954],{"class":157}," total;\n",[148,956,957],{"class":150,"line":441},[148,958,398],{"emptyLinePlaceholder":397},[148,960,961,964,966,968,970,973,975,978,980],{"class":150,"line":452},[148,962,963],{"class":157},"    total ",[148,965,171],{"class":154},[148,967,885],{"class":354},[148,969,358],{"class":157},[148,971,972],{"class":174},"2",[148,974,286],{"class":157},[148,976,977],{"class":174},"3",[148,979,704],{"class":157},[148,981,982],{"class":161},"   \u002F* total vale 5 *\u002F\n",[148,984,985,987,990,992],{"class":150,"line":458},[148,986,910],{"class":154},[148,988,989],{"class":157}," (",[148,991,134],{"class":174},[148,993,994],{"class":157},");\n",[148,996,997],{"class":150,"line":464},[148,998,467],{"class":157},[15,1000,1001,1003,1004,501,1007,1010],{},[28,1002,47],{}," hace dos cosas a la vez: ",[19,1005,1006],{},"entrega el valor",[19,1008,1009],{},"sale de la función",".\nNada de lo que está después se ejecuta.",[15,1012,1013,1014,1016,1017,1020],{},"En una función ",[28,1015,351],{}," no hay valor que entregar, así que se escribe ",[28,1018,1019],{},"return ;","\n(sí, con espacio antes del punto y coma, por la Norm).",[58,1022,1024],{"id":1023},"paso-por-valor-las-funciones-reciben-copias","Paso por valor: las funciones reciben COPIAS",[15,1026,1027,1028,231],{},"Este es el concepto que más cuesta. En C, cuando llamas a una función, ",[19,1029,1030],{},"se\ncopian los valores",[139,1032,1034],{"className":141,"code":1033,"language":143,"meta":144,"style":144},"void    romper(int n)\n{\n    n = 999;          \u002F* cambia la COPIA, no el original *\u002F\n}\n\nint main(void)\n{\n    int numero;\n\n    numero = 5;\n    romper(numero);\n    \u002F* numero sigue valiendo 5 *\u002F\n}\n",[28,1035,1036,1052,1056,1071,1075,1079,1091,1095,1102,1106,1117,1124,1129],{"__ignoreMap":144},[148,1037,1038,1040,1043,1045,1047,1050],{"class":150,"line":151},[148,1039,351],{"class":154},[148,1041,1042],{"class":354},"    romper",[148,1044,358],{"class":157},[148,1046,119],{"class":154},[148,1048,1049],{"class":363}," n",[148,1051,374],{"class":157},[148,1053,1054],{"class":150,"line":165},[148,1055,379],{"class":157},[148,1057,1058,1061,1063,1066,1068],{"class":150,"line":382},[148,1059,1060],{"class":157},"    n ",[148,1062,171],{"class":154},[148,1064,1065],{"class":174}," 999",[148,1067,178],{"class":157},[148,1069,1070],{"class":161},"          \u002F* cambia la COPIA, no el original *\u002F\n",[148,1072,1073],{"class":150,"line":394},[148,1074,467],{"class":157},[148,1076,1077],{"class":150,"line":401},[148,1078,398],{"emptyLinePlaceholder":397},[148,1080,1081,1083,1085,1087,1089],{"class":150,"line":414},[148,1082,119],{"class":154},[148,1084,937],{"class":354},[148,1086,358],{"class":157},[148,1088,351],{"class":154},[148,1090,374],{"class":157},[148,1092,1093],{"class":150,"line":429},[148,1094,379],{"class":157},[148,1096,1097,1099],{"class":150,"line":435},[148,1098,385],{"class":154},[148,1100,1101],{"class":157}," numero;\n",[148,1103,1104],{"class":150,"line":441},[148,1105,398],{"emptyLinePlaceholder":397},[148,1107,1108,1111,1113,1115],{"class":150,"line":452},[148,1109,1110],{"class":157},"    numero ",[148,1112,171],{"class":154},[148,1114,539],{"class":174},[148,1116,411],{"class":157},[148,1118,1119,1121],{"class":150,"line":458},[148,1120,1042],{"class":354},[148,1122,1123],{"class":157},"(numero);\n",[148,1125,1126],{"class":150,"line":464},[148,1127,1128],{"class":161},"    \u002F* numero sigue valiendo 5 *\u002F\n",[148,1130,1131],{"class":150,"line":470},[148,1132,467],{"class":157},[15,1134,1135,1136,1139,1140,231],{},"Si quieres que una función modifique la variable original, tienes que pasarle la\n",[19,1137,1138],{},"dirección"," de esa variable (un puntero). Eso es lo que hace ",[28,1141,1142],{},"write",[139,1144,1146],{"className":141,"code":1145,"language":143,"meta":144,"style":144},"void    ft_putchar(char c)\n{\n    write(1, &c, 1);   \u002F* &c = \"la dirección donde está la caja c\" *\u002F\n}\n",[28,1147,1148,1162,1166,1187],{"__ignoreMap":144},[148,1149,1150,1152,1154,1156,1158,1160],{"class":150,"line":151},[148,1151,351],{"class":154},[148,1153,665],{"class":354},[148,1155,358],{"class":157},[148,1157,257],{"class":154},[148,1159,672],{"class":363},[148,1161,374],{"class":157},[148,1163,1164],{"class":150,"line":165},[148,1165,379],{"class":157},[148,1167,1168,1170,1172,1174,1176,1178,1180,1182,1184],{"class":150,"line":382},[148,1169,686],{"class":354},[148,1171,358],{"class":157},[148,1173,691],{"class":174},[148,1175,286],{"class":157},[148,1177,696],{"class":154},[148,1179,699],{"class":157},[148,1181,691],{"class":174},[148,1183,704],{"class":157},[148,1185,1186],{"class":161},"   \u002F* &c = \"la dirección donde está la caja c\" *\u002F\n",[148,1188,1189],{"class":150,"line":394},[148,1190,467],{"class":157},[70,1192,1193,1203],{},[73,1194,1195],{},[76,1196,1197,1200],{},[79,1198,1199],{},"Forma",[79,1201,1202],{},"Qué significa",[89,1204,1205,1216],{},[76,1206,1207,1211],{},[94,1208,1209],{},[28,1210,143],{},[94,1212,777,1213,1215],{},[19,1214,129],{}," guardado en la caja",[76,1217,1218,1223],{},[94,1219,1220],{},[28,1221,1222],{},"&c",[94,1224,1225,1226,1228],{},"la ",[19,1227,1138],{}," de la caja",[15,1230,1231,1233,1234,1237,1238,1240,1241,1243],{},[28,1232,1142],{}," no pide el carácter, pide ",[19,1235,1236],{},"dónde leerlo",". Como ",[28,1239,143],{}," es la copia local\ndel parámetro, ",[28,1242,1222],{}," es una dirección válida mientras la función se ejecuta, y\npor eso funciona.",[58,1245,1247],{"id":1246},"declaración-definición-y-llamada","Declaración, definición y llamada",[15,1249,1250],{},"Tres cosas que se parecen y no son iguales:",[139,1252,1254],{"className":141,"code":1253,"language":143,"meta":144,"style":144},"void    ft_putchar(char c);   \u002F* 1. DECLARACIÓN (prototipo): \"existe, y así es\" *\u002F\n\nvoid    ft_putchar(char c)    \u002F* 2. DEFINICIÓN: el cuerpo, lo que hace *\u002F\n{\n    write(1, &c, 1);\n}\n\nint main(void)\n{\n    ft_putchar('o');          \u002F* 3. LLAMADA: ejecútala ahora *\u002F\n    return (0);\n}\n",[28,1255,1256,1273,1277,1294,1298,1316,1320,1324,1336,1340,1354,1364],{"__ignoreMap":144},[148,1257,1258,1260,1262,1264,1266,1268,1270],{"class":150,"line":151},[148,1259,351],{"class":154},[148,1261,665],{"class":354},[148,1263,358],{"class":157},[148,1265,257],{"class":154},[148,1267,672],{"class":363},[148,1269,704],{"class":157},[148,1271,1272],{"class":161},"   \u002F* 1. DECLARACIÓN (prototipo): \"existe, y así es\" *\u002F\n",[148,1274,1275],{"class":150,"line":165},[148,1276,398],{"emptyLinePlaceholder":397},[148,1278,1279,1281,1283,1285,1287,1289,1291],{"class":150,"line":382},[148,1280,351],{"class":154},[148,1282,665],{"class":354},[148,1284,358],{"class":157},[148,1286,257],{"class":154},[148,1288,672],{"class":363},[148,1290,542],{"class":157},[148,1292,1293],{"class":161},"    \u002F* 2. DEFINICIÓN: el cuerpo, lo que hace *\u002F\n",[148,1295,1296],{"class":150,"line":394},[148,1297,379],{"class":157},[148,1299,1300,1302,1304,1306,1308,1310,1312,1314],{"class":150,"line":401},[148,1301,686],{"class":354},[148,1303,358],{"class":157},[148,1305,691],{"class":174},[148,1307,286],{"class":157},[148,1309,696],{"class":154},[148,1311,699],{"class":157},[148,1313,691],{"class":174},[148,1315,994],{"class":157},[148,1317,1318],{"class":150,"line":414},[148,1319,467],{"class":157},[148,1321,1322],{"class":150,"line":429},[148,1323,398],{"emptyLinePlaceholder":397},[148,1325,1326,1328,1330,1332,1334],{"class":150,"line":435},[148,1327,119],{"class":154},[148,1329,937],{"class":354},[148,1331,358],{"class":157},[148,1333,351],{"class":154},[148,1335,374],{"class":157},[148,1337,1338],{"class":150,"line":441},[148,1339,379],{"class":157},[148,1341,1342,1344,1346,1349,1351],{"class":150,"line":452},[148,1343,665],{"class":354},[148,1345,358],{"class":157},[148,1347,268],{"class":1348},"sZZnC",[148,1350,704],{"class":157},[148,1352,1353],{"class":161},"          \u002F* 3. LLAMADA: ejecútala ahora *\u002F\n",[148,1355,1356,1358,1360,1362],{"class":150,"line":458},[148,1357,910],{"class":154},[148,1359,989],{"class":157},[148,1361,134],{"class":174},[148,1363,994],{"class":157},[148,1365,1366],{"class":150,"line":464},[148,1367,467],{"class":157},[15,1369,1370,1373,1374,1377,1378,1381],{},[19,1371,1372],{},"¿Por qué existe la declaración?"," Porque el compilador lee los archivos de\narriba a abajo y de a uno. Cuando compila ",[28,1375,1376],{},"rush00.c",", no ve ",[28,1379,1380],{},"ft_putchar.c",". El\nprototipo es la promesa de que esa función existe en otro lado, y le permite\nverificar que la llames con los argumentos correctos.",[15,1383,1384,1385,1388,1389,1392,1393,330],{},"Si la promesa no se cumple (declaras ",[28,1386,1387],{},"ft_putchar"," pero nunca compilas su\narchivo), el error aparece solo al final, en el ",[19,1390,1391],{},"enlazador",":\n",[28,1394,1395],{},"undefined reference to 'ft_putchar'",[58,1397,1399,1402],{"id":1398},"static-funciones-privadas-del-archivo",[28,1400,1401],{},"static",": funciones privadas del archivo",[139,1404,1406],{"className":141,"code":1405,"language":143,"meta":144,"style":144},"static void print_horizontal_edge(int width)\n",[28,1407,1408],{"__ignoreMap":144},[148,1409,1410,1412,1415,1418,1420,1422,1425],{"class":150,"line":151},[148,1411,1401],{"class":154},[148,1413,1414],{"class":154}," void",[148,1416,1417],{"class":354}," print_horizontal_edge",[148,1419,358],{"class":157},[148,1421,119],{"class":154},[148,1423,1424],{"class":363}," width",[148,1426,374],{"class":157},[15,1428,1429,1431,1432,1435],{},[28,1430,1401],{}," aquí significa: ",[19,1433,1434],{},"esta función solo existe dentro de este archivo",".\nNadie de afuera puede llamarla. Sirve para dos cosas:",[1437,1438,1439,1442],"ul",{},[481,1440,1441],{},"decir \"esto es un ayudante interno, no parte de la interfaz\";",[481,1443,1444],{},"evitar que dos archivos choquen si definen una función con el mismo nombre.",[15,1446,1447],{},"No hace falta para aprobar. Sí hace el código más honesto.",[58,1449,556],{"id":1450},"dónde-aparece-en-el-rush-1",[139,1452,1455],{"className":1453,"code":1454,"language":724},[722],"rush                     ← decide qué fila toca\n ├── print_horizontal_edge   ← dibuja una fila de borde\n └── print_vertical_edge     ← dibuja una fila del medio\n      └── ft_putchar              ← escribe un carácter\n",[28,1456,1454],{"__ignoreMap":144},[15,1458,1459,1460,1463,1464,1466],{},"Cada nivel usa al de abajo y ",[19,1461,1462],{},"no sabe cómo funciona por dentro",". ",[28,1465,633],{}," no\nsabe qué carácter es una esquina: solo pide \"dibuja un borde\".",[50,1468],{},[53,1470,1472],{"id":1471},"por-qué-subdividir-en-funciones","Por qué subdividir en funciones",[58,1474,1476],{"id":1475},"el-problema-que-resuelve","El problema que resuelve",[15,1478,1479],{},"Supongamos que no usamos funciones auxiliares. Todo en una sola:",[139,1481,1483],{"className":141,"code":1482,"language":143,"meta":144,"style":144},"void    rush(int x, int y)\n{\n    int row;\n    int column;\n\n    row = 0;\n    while (row \u003C y)\n    {\n        column = 0;\n        while (column \u003C x)\n        {\n            if (row == 0 || row == y - 1)\n            {\n                if (column == 0 || column == x - 1)\n                    ft_putchar('o');\n                else\n                    ft_putchar('-');\n            }\n            else\n            {\n                if (column == 0 || column == x - 1)\n                    ft_putchar('|');\n                else\n                    ft_putchar(' ');\n            }\n            column++;\n        }\n        ft_putchar('\\n');\n        row++;\n    }\n}\n",[28,1484,1485,1505,1509,1516,1523,1527,1537,1547,1551,1562,1574,1579,1609,1614,1641,1653,1659,1671,1677,1683,1688,1713,1725,1730,1742,1747,1757,1763,1781,1790,1795],{"__ignoreMap":144},[148,1486,1487,1489,1491,1493,1495,1497,1499,1501,1503],{"class":150,"line":151},[148,1488,351],{"class":154},[148,1490,355],{"class":354},[148,1492,358],{"class":157},[148,1494,119],{"class":154},[148,1496,364],{"class":363},[148,1498,286],{"class":157},[148,1500,119],{"class":154},[148,1502,371],{"class":363},[148,1504,374],{"class":157},[148,1506,1507],{"class":150,"line":165},[148,1508,379],{"class":157},[148,1510,1511,1513],{"class":150,"line":382},[148,1512,385],{"class":154},[148,1514,1515],{"class":157}," row;\n",[148,1517,1518,1520],{"class":150,"line":394},[148,1519,385],{"class":154},[148,1521,1522],{"class":157}," column;\n",[148,1524,1525],{"class":150,"line":401},[148,1526,398],{"emptyLinePlaceholder":397},[148,1528,1529,1531,1533,1535],{"class":150,"line":414},[148,1530,404],{"class":157},[148,1532,171],{"class":154},[148,1534,175],{"class":174},[148,1536,411],{"class":157},[148,1538,1539,1541,1543,1545],{"class":150,"line":429},[148,1540,417],{"class":154},[148,1542,420],{"class":157},[148,1544,423],{"class":154},[148,1546,426],{"class":157},[148,1548,1549],{"class":150,"line":435},[148,1550,432],{"class":157},[148,1552,1553,1556,1558,1560],{"class":150,"line":441},[148,1554,1555],{"class":157},"        column ",[148,1557,171],{"class":154},[148,1559,175],{"class":174},[148,1561,411],{"class":157},[148,1563,1564,1567,1569,1571],{"class":150,"line":452},[148,1565,1566],{"class":154},"        while",[148,1568,534],{"class":157},[148,1570,423],{"class":154},[148,1572,1573],{"class":157}," x)\n",[148,1575,1576],{"class":150,"line":458},[148,1577,1578],{"class":157},"        {\n",[148,1580,1581,1584,1586,1589,1591,1594,1597,1599,1601,1604,1607],{"class":150,"line":464},[148,1582,1583],{"class":154},"            if",[148,1585,420],{"class":157},[148,1587,1588],{"class":154},"==",[148,1590,175],{"class":174},[148,1592,1593],{"class":154}," ||",[148,1595,1596],{"class":157}," row ",[148,1598,1588],{"class":154},[148,1600,501],{"class":157},[148,1602,1603],{"class":154},"-",[148,1605,1606],{"class":174}," 1",[148,1608,374],{"class":157},[148,1610,1611],{"class":150,"line":470},[148,1612,1613],{"class":157},"            {\n",[148,1615,1617,1620,1622,1624,1626,1628,1630,1632,1635,1637,1639],{"class":150,"line":1616},14,[148,1618,1619],{"class":154},"                if",[148,1621,534],{"class":157},[148,1623,1588],{"class":154},[148,1625,175],{"class":174},[148,1627,1593],{"class":154},[148,1629,204],{"class":157},[148,1631,1588],{"class":154},[148,1633,1634],{"class":157}," x ",[148,1636,1603],{"class":154},[148,1638,1606],{"class":174},[148,1640,374],{"class":157},[148,1642,1644,1647,1649,1651],{"class":150,"line":1643},15,[148,1645,1646],{"class":354},"                    ft_putchar",[148,1648,358],{"class":157},[148,1650,268],{"class":1348},[148,1652,994],{"class":157},[148,1654,1656],{"class":150,"line":1655},16,[148,1657,1658],{"class":154},"                else\n",[148,1660,1662,1664,1666,1669],{"class":150,"line":1661},17,[148,1663,1646],{"class":354},[148,1665,358],{"class":157},[148,1667,1668],{"class":1348},"'-'",[148,1670,994],{"class":157},[148,1672,1674],{"class":150,"line":1673},18,[148,1675,1676],{"class":157},"            }\n",[148,1678,1680],{"class":150,"line":1679},19,[148,1681,1682],{"class":154},"            else\n",[148,1684,1686],{"class":150,"line":1685},20,[148,1687,1613],{"class":157},[148,1689,1691,1693,1695,1697,1699,1701,1703,1705,1707,1709,1711],{"class":150,"line":1690},21,[148,1692,1619],{"class":154},[148,1694,534],{"class":157},[148,1696,1588],{"class":154},[148,1698,175],{"class":174},[148,1700,1593],{"class":154},[148,1702,204],{"class":157},[148,1704,1588],{"class":154},[148,1706,1634],{"class":157},[148,1708,1603],{"class":154},[148,1710,1606],{"class":174},[148,1712,374],{"class":157},[148,1714,1716,1718,1720,1723],{"class":150,"line":1715},22,[148,1717,1646],{"class":354},[148,1719,358],{"class":157},[148,1721,1722],{"class":1348},"'|'",[148,1724,994],{"class":157},[148,1726,1728],{"class":150,"line":1727},23,[148,1729,1658],{"class":154},[148,1731,1733,1735,1737,1740],{"class":150,"line":1732},24,[148,1734,1646],{"class":354},[148,1736,358],{"class":157},[148,1738,1739],{"class":1348},"' '",[148,1741,994],{"class":157},[148,1743,1745],{"class":150,"line":1744},25,[148,1746,1676],{"class":157},[148,1748,1750,1753,1755],{"class":150,"line":1749},26,[148,1751,1752],{"class":157},"            column",[148,1754,447],{"class":154},[148,1756,411],{"class":157},[148,1758,1760],{"class":150,"line":1759},27,[148,1761,1762],{"class":157},"        }\n",[148,1764,1766,1769,1771,1774,1777,1779],{"class":150,"line":1765},28,[148,1767,1768],{"class":354},"        ft_putchar",[148,1770,358],{"class":157},[148,1772,1773],{"class":1348},"'",[148,1775,1776],{"class":174},"\\n",[148,1778,1773],{"class":1348},[148,1780,994],{"class":157},[148,1782,1784,1786,1788],{"class":150,"line":1783},29,[148,1785,444],{"class":157},[148,1787,447],{"class":154},[148,1789,411],{"class":157},[148,1791,1793],{"class":150,"line":1792},30,[148,1794,455],{"class":157},[148,1796,1798],{"class":150,"line":1797},31,[148,1799,467],{"class":157},[15,1801,1802,1803,1806],{},"Funciona. Pero para entender qué hace tienes que sostener ",[19,1804,1805],{},"cuatro decisiones a\nla vez",": fila, columna, borde, relleno. Y la indentación ya va por el cuarto\nnivel.",[15,1808,1809],{},"Con funciones queda así:",[139,1811,1813],{"className":141,"code":1812,"language":143,"meta":144,"style":144},"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",[28,1814,1815,1825,1829,1854,1862,1867,1874,1883],{"__ignoreMap":144},[148,1816,1817,1819,1821,1823],{"class":150,"line":151},[148,1818,531],{"class":154},[148,1820,420],{"class":157},[148,1822,423],{"class":154},[148,1824,426],{"class":157},[148,1826,1827],{"class":150,"line":165},[148,1828,379],{"class":157},[148,1830,1831,1834,1836,1838,1840,1842,1844,1846,1848,1850,1852],{"class":150,"line":382},[148,1832,1833],{"class":154},"    if",[148,1835,420],{"class":157},[148,1837,1588],{"class":154},[148,1839,175],{"class":174},[148,1841,1593],{"class":154},[148,1843,1596],{"class":157},[148,1845,1588],{"class":154},[148,1847,501],{"class":157},[148,1849,1603],{"class":154},[148,1851,1606],{"class":174},[148,1853,374],{"class":157},[148,1855,1856,1859],{"class":150,"line":394},[148,1857,1858],{"class":354},"        print_horizontal_edge",[148,1860,1861],{"class":157},"(x);\n",[148,1863,1864],{"class":150,"line":401},[148,1865,1866],{"class":154},"    else\n",[148,1868,1869,1872],{"class":150,"line":414},[148,1870,1871],{"class":354},"        print_vertical_edge",[148,1873,1861],{"class":157},[148,1875,1876,1879,1881],{"class":150,"line":429},[148,1877,1878],{"class":157},"    row",[148,1880,447],{"class":154},[148,1882,411],{"class":157},[148,1884,1885],{"class":150,"line":435},[148,1886,467],{"class":157},[15,1888,1889],{},"Leído en voz alta: \"mientras haya filas: si es la primera o la última, dibuja un\nborde; si no, dibuja el medio\". Se entiende sin mirar las otras funciones.",[58,1891,1893],{"id":1892},"los-cuatro-beneficios-reales","Los cuatro beneficios reales",[70,1895,1896,1906],{},[73,1897,1898],{},[76,1899,1900,1903],{},[79,1901,1902],{},"Beneficio",[79,1904,1905],{},"Qué significa en la práctica",[89,1907,1908,1928,1938,1952],{},[76,1909,1910,1915],{},[94,1911,1912],{},[19,1913,1914],{},"Nombre en lugar de código",[94,1916,1917,1920,1921,1923,1924,1927],{},[28,1918,1919],{},"print_horizontal_edge(x)"," se explica solo; un ",[28,1922,531],{}," con cuatro ",[28,1925,1926],{},"if"," no",[76,1929,1930,1935],{},[94,1931,1932],{},[19,1933,1934],{},"Una tarea por función",[94,1936,1937],{},"si algo está mal en el borde, sabes en qué función mirar",[76,1939,1940,1945],{},[94,1941,1942],{},[19,1943,1944],{},"Sin duplicación",[94,1946,1947,1948,1951],{},"la lógica de \"primera o última columna\" está escrita ",[19,1949,1950],{},"una"," vez",[76,1953,1954,1959],{},[94,1955,1956],{},[19,1957,1958],{},"Menos anidamiento",[94,1960,1961],{},"cada función nueva es un nivel de indentación que desaparece",[58,1963,1965],{"id":1964},"cuándo-no-subdividir","Cuándo NO subdividir",[15,1967,1968],{},"Esto es tan importante como lo anterior. Subdividir de más también es un error:",[139,1970,1972],{"className":141,"code":1971,"language":143,"meta":144,"style":144},"void    print_o(void)   { ft_putchar('o'); }   \u002F* no aporta nada *\u002F\nvoid    print_dash(void){ ft_putchar('-'); }   \u002F* no aporta nada *\u002F\n",[28,1973,1974,2000],{"__ignoreMap":144},[148,1975,1976,1978,1981,1983,1985,1988,1990,1992,1994,1997],{"class":150,"line":151},[148,1977,351],{"class":154},[148,1979,1980],{"class":354},"    print_o",[148,1982,358],{"class":157},[148,1984,351],{"class":154},[148,1986,1987],{"class":157},")   { ",[148,1989,1387],{"class":354},[148,1991,358],{"class":157},[148,1993,268],{"class":1348},[148,1995,1996],{"class":157},"); }",[148,1998,1999],{"class":161},"   \u002F* no aporta nada *\u002F\n",[148,2001,2002,2004,2007,2009,2011,2014,2016,2018,2020,2022],{"class":150,"line":165},[148,2003,351],{"class":154},[148,2005,2006],{"class":354},"    print_dash",[148,2008,358],{"class":157},[148,2010,351],{"class":154},[148,2012,2013],{"class":157},"){ ",[148,2015,1387],{"class":354},[148,2017,358],{"class":157},[148,2019,1668],{"class":1348},[148,2021,1996],{"class":157},[148,2023,1999],{"class":161},[15,2025,2026],{},"Esa función no tiene nombre propio ni lógica propia: solo agrega un salto\nmental. Reglas prácticas:",[478,2028,2029,2035,2041,2047],{},[481,2030,2031,2034],{},[19,2032,2033],{},"Regla de tres",": si el mismo bloque aparece tres veces, extráelo a una\nfunción. Dos veces todavía se tolera.",[481,2036,2037,2040],{},[19,2038,2039],{},"Nombre honesto",": si para describirla necesitas un \"y\", son dos funciones.",[481,2042,2043,2046],{},[19,2044,2045],{},"Una pantalla",": si no entra en ~25 líneas, probablemente haga demasiado.",[481,2048,2049,2052],{},[19,2050,2051],{},"Si el nombre repite el cuerpo",", no la crees.",[58,2054,556],{"id":2055},"dónde-aparece-en-el-rush-2",[15,2057,2058,501,2060,2062,2063,2066],{},[28,2059,500],{},[28,2061,504],{}," se ganaron su lugar porque cada\nuna tiene un bucle propio y un nombre que dice exactamente lo que hacen. En\ncambio no creamos ",[28,2064,2065],{},"print_newline()",": sería una función de una línea cuyo nombre\nya es la función de librería.",[50,2068],{},[53,2070,2072],{"id":2071},"early-return-guard-clauses","Early return (guard clauses)",[58,2074,61],{"id":2075},"qué-es-2",[15,2077,2078,2079,2082,2083,2085],{},"Una ",[19,2080,2081],{},"guard clause"," es un ",[28,2084,47],{}," al principio de la función que resuelve el\ncaso inválido y sale. El resto de la función queda para el caso normal.",[139,2087,2089],{"className":141,"code":2088,"language":143,"meta":144,"style":144},"void    rush(int x, int y)\n{\n    if (x \u003C= 0 || y \u003C= 0)\n        return ;   \u002F* caso inválido: me voy ya *\u002F\n    \u002F* de aquí para abajo, x e y son válidos. Siempre. *\u002F\n}\n",[28,2090,2091,2111,2115,2137,2148,2153],{"__ignoreMap":144},[148,2092,2093,2095,2097,2099,2101,2103,2105,2107,2109],{"class":150,"line":151},[148,2094,351],{"class":154},[148,2096,355],{"class":354},[148,2098,358],{"class":157},[148,2100,119],{"class":154},[148,2102,364],{"class":363},[148,2104,286],{"class":157},[148,2106,119],{"class":154},[148,2108,371],{"class":363},[148,2110,374],{"class":157},[148,2112,2113],{"class":150,"line":165},[148,2114,379],{"class":157},[148,2116,2117,2119,2122,2125,2127,2129,2131,2133,2135],{"class":150,"line":382},[148,2118,1833],{"class":154},[148,2120,2121],{"class":157}," (x ",[148,2123,2124],{"class":154},"\u003C=",[148,2126,175],{"class":174},[148,2128,1593],{"class":154},[148,2130,501],{"class":157},[148,2132,2124],{"class":154},[148,2134,175],{"class":174},[148,2136,374],{"class":157},[148,2138,2139,2142,2145],{"class":150,"line":394},[148,2140,2141],{"class":154},"        return",[148,2143,2144],{"class":157}," ;",[148,2146,2147],{"class":161},"   \u002F* caso inválido: me voy ya *\u002F\n",[148,2149,2150],{"class":150,"line":401},[148,2151,2152],{"class":161},"    \u002F* de aquí para abajo, x e y son válidos. Siempre. *\u002F\n",[148,2154,2155],{"class":150,"line":414},[148,2156,467],{"class":157},[58,2158,2160],{"id":2159},"por-qué-al-principio-y-no-al-final","Por qué al principio y no al final",[15,2162,2163],{},"Compará las dos versiones:",[15,2165,2166,2169],{},[19,2167,2168],{},"Sin guard clause"," (todo anidado):",[139,2171,2173],{"className":141,"code":2172,"language":143,"meta":144,"style":144},"void    rush(int x, int y)\n{\n    int row;\n\n    if (x > 0 && y > 0)\n    {\n        row = 0;\n        while (row \u003C y)\n        {\n            \u002F* ... *\u002F\n            row++;\n        }\n    }\n}\n",[28,2174,2175,2195,2199,2205,2209,2231,2235,2246,2256,2260,2265,2274,2278,2282],{"__ignoreMap":144},[148,2176,2177,2179,2181,2183,2185,2187,2189,2191,2193],{"class":150,"line":151},[148,2178,351],{"class":154},[148,2180,355],{"class":354},[148,2182,358],{"class":157},[148,2184,119],{"class":154},[148,2186,364],{"class":363},[148,2188,286],{"class":157},[148,2190,119],{"class":154},[148,2192,371],{"class":363},[148,2194,374],{"class":157},[148,2196,2197],{"class":150,"line":165},[148,2198,379],{"class":157},[148,2200,2201,2203],{"class":150,"line":382},[148,2202,385],{"class":154},[148,2204,1515],{"class":157},[148,2206,2207],{"class":150,"line":394},[148,2208,398],{"emptyLinePlaceholder":397},[148,2210,2211,2213,2215,2218,2220,2223,2225,2227,2229],{"class":150,"line":401},[148,2212,1833],{"class":154},[148,2214,2121],{"class":157},[148,2216,2217],{"class":154},">",[148,2219,175],{"class":174},[148,2221,2222],{"class":154}," &&",[148,2224,501],{"class":157},[148,2226,2217],{"class":154},[148,2228,175],{"class":174},[148,2230,374],{"class":157},[148,2232,2233],{"class":150,"line":414},[148,2234,432],{"class":157},[148,2236,2237,2240,2242,2244],{"class":150,"line":429},[148,2238,2239],{"class":157},"        row ",[148,2241,171],{"class":154},[148,2243,175],{"class":174},[148,2245,411],{"class":157},[148,2247,2248,2250,2252,2254],{"class":150,"line":435},[148,2249,1566],{"class":154},[148,2251,420],{"class":157},[148,2253,423],{"class":154},[148,2255,426],{"class":157},[148,2257,2258],{"class":150,"line":441},[148,2259,1578],{"class":157},[148,2261,2262],{"class":150,"line":452},[148,2263,2264],{"class":161},"            \u002F* ... *\u002F\n",[148,2266,2267,2270,2272],{"class":150,"line":458},[148,2268,2269],{"class":157},"            row",[148,2271,447],{"class":154},[148,2273,411],{"class":157},[148,2275,2276],{"class":150,"line":464},[148,2277,1762],{"class":157},[148,2279,2280],{"class":150,"line":470},[148,2281,455],{"class":157},[148,2283,2284],{"class":150,"line":1616},[148,2285,467],{"class":157},[15,2287,2288,231],{},[19,2289,2290],{},"Con guard clause",[139,2292,2294],{"className":141,"code":2293,"language":143,"meta":144,"style":144},"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        \u002F* ... *\u002F\n        row++;\n    }\n}\n",[28,2295,2296,2316,2320,2326,2330,2350,2357,2367,2377,2381,2386,2394,2398],{"__ignoreMap":144},[148,2297,2298,2300,2302,2304,2306,2308,2310,2312,2314],{"class":150,"line":151},[148,2299,351],{"class":154},[148,2301,355],{"class":354},[148,2303,358],{"class":157},[148,2305,119],{"class":154},[148,2307,364],{"class":363},[148,2309,286],{"class":157},[148,2311,119],{"class":154},[148,2313,371],{"class":363},[148,2315,374],{"class":157},[148,2317,2318],{"class":150,"line":165},[148,2319,379],{"class":157},[148,2321,2322,2324],{"class":150,"line":382},[148,2323,385],{"class":154},[148,2325,1515],{"class":157},[148,2327,2328],{"class":150,"line":394},[148,2329,398],{"emptyLinePlaceholder":397},[148,2331,2332,2334,2336,2338,2340,2342,2344,2346,2348],{"class":150,"line":401},[148,2333,1833],{"class":154},[148,2335,2121],{"class":157},[148,2337,2124],{"class":154},[148,2339,175],{"class":174},[148,2341,1593],{"class":154},[148,2343,501],{"class":157},[148,2345,2124],{"class":154},[148,2347,175],{"class":174},[148,2349,374],{"class":157},[148,2351,2352,2354],{"class":150,"line":414},[148,2353,2141],{"class":154},[148,2355,2356],{"class":157}," ;\n",[148,2358,2359,2361,2363,2365],{"class":150,"line":429},[148,2360,404],{"class":157},[148,2362,171],{"class":154},[148,2364,175],{"class":174},[148,2366,411],{"class":157},[148,2368,2369,2371,2373,2375],{"class":150,"line":435},[148,2370,417],{"class":154},[148,2372,420],{"class":157},[148,2374,423],{"class":154},[148,2376,426],{"class":157},[148,2378,2379],{"class":150,"line":441},[148,2380,432],{"class":157},[148,2382,2383],{"class":150,"line":452},[148,2384,2385],{"class":161},"        \u002F* ... *\u002F\n",[148,2387,2388,2390,2392],{"class":150,"line":458},[148,2389,444],{"class":157},[148,2391,447],{"class":154},[148,2393,411],{"class":157},[148,2395,2396],{"class":150,"line":464},[148,2397,455],{"class":157},[148,2399,2400],{"class":150,"line":470},[148,2401,467],{"class":157},[15,2403,2404,2405,2408,2409,2411,2412,2414],{},"La segunda tiene una indentación menos y, sobre todo, ",[19,2406,2407],{},"elimina la pregunta",".\nEn la primera, cada vez que lees el ",[28,2410,531],{}," tienes que recordar \"esto solo pasa\nsi x e y son positivos\". En la segunda, el ",[28,2413,531],{}," no está condicionado por\nnada: si llegaste hasta ahí, los datos son válidos.",[58,2416,2418],{"id":2417},"las-tres-razones","Las tres razones",[70,2420,2421,2430],{},[73,2422,2423],{},[76,2424,2425,2428],{},[79,2426,2427],{},"Razón",[79,2429,87],{},[89,2431,2432,2445,2458],{},[76,2433,2434,2439],{},[94,2435,2436],{},[19,2437,2438],{},"Aplana el código",[94,2440,2441,2442,2444],{},"cada guard clause es un nivel de ",[28,2443,1926],{}," que no aparece",[76,2446,2447,2452],{},[94,2448,2449],{},[19,2450,2451],{},"Protege el resto",[94,2453,2454,2455,2457],{},"después del ",[28,2456,47],{}," no hay estados inválidos posibles",[76,2459,2460,2465],{},[94,2461,2462],{},[19,2463,2464],{},"Es fácil de auditar",[94,2466,2467],{},"todos los casos raros están juntos, arriba, en tres líneas",[15,2469,2470,2471,2474,2475,2478],{},"El patrón tiene nombre en la industria: ",[19,2472,2473],{},"\"return early, return often\"",". La\nidea es que el ",[35,2476,2477],{},"happy path"," (el camino feliz, el caso normal) quede alineado a\nla izquierda, sin escalones.",[58,2480,2482,2484,2485],{"id":2481},"return-no-es-exit",[28,2483,47],{}," no es ",[28,2486,2487],{},"exit",[70,2489,2490,2503],{},[73,2491,2492],{},[76,2493,2494,2497,2500],{},[79,2495,2496],{},"Instrucción",[79,2498,2499],{},"Qué hace",[79,2501,2502],{},"Necesita",[89,2504,2505,2521,2537],{},[76,2506,2507,2511,2518],{},[94,2508,2509],{},[28,2510,1019],{},[94,2512,2513,2514,2517],{},"sale ",[19,2515,2516],{},"de esta función"," y vuelve a quien la llamó",[94,2519,2520],{},"nada",[76,2522,2523,2528,2535],{},[94,2524,2525],{},[28,2526,2527],{},"return (0);",[94,2529,2530,2531,2534],{},"sale de ",[28,2532,2533],{},"main"," y le devuelve 0 al sistema operativo",[94,2536,2520],{},[76,2538,2539,2544,2550],{},[94,2540,2541],{},[28,2542,2543],{},"exit(1);",[94,2545,2546,2549],{},[19,2547,2548],{},"mata todo el programa",", desde cualquier función",[94,2551,2552],{},[28,2553,2554],{},"#include \u003Cstdlib.h>",[15,2556,2557,2558,2560,2561,2564,2565,2567],{},"En el rush usamos ",[28,2559,1019],{},". Si usaramos ",[28,2562,2563],{},"exit()",", el programa moriría y el\n",[28,2566,2533],{}," no podría seguir probando otros casos. En un examen eso es fatal.",[58,2569,2571],{"id":2570},"el-error-clásico","El error clásico",[139,2573,2575],{"className":141,"code":2574,"language":143,"meta":144,"style":144},"if (x == 0 || y == 0)   \u002F* MAL: no cubre los negativos *\u002F\n    return ;\n",[28,2576,2577,2600],{"__ignoreMap":144},[148,2578,2579,2581,2583,2585,2587,2589,2591,2593,2595,2597],{"class":150,"line":151},[148,2580,1926],{"class":154},[148,2582,2121],{"class":157},[148,2584,1588],{"class":154},[148,2586,175],{"class":174},[148,2588,1593],{"class":154},[148,2590,501],{"class":157},[148,2592,1588],{"class":154},[148,2594,175],{"class":174},[148,2596,542],{"class":157},[148,2598,2599],{"class":161},"   \u002F* MAL: no cubre los negativos *\u002F\n",[148,2601,2602,2604],{"class":150,"line":165},[148,2603,910],{"class":154},[148,2605,2356],{"class":157},[15,2607,2608,2609,2612,2613,2615,2616,2619],{},"El enunciado dice \"cualquier entero, incluidos cero y negativos\". ",[28,2610,2611],{},"== 0"," deja\npasar ",[28,2614,285],{},". Por eso se escribe ",[28,2617,2618],{},"\u003C= 0",": una comparación que cubre los dos casos\nde una vez.",[58,2621,556],{"id":2622},"dónde-aparece-en-el-rush-3",[139,2624,2626],{"className":141,"code":2625,"language":143,"meta":144,"style":144},"if (x \u003C= 0 || y \u003C= 0)\n    return ;\n",[28,2627,2628,2648],{"__ignoreMap":144},[148,2629,2630,2632,2634,2636,2638,2640,2642,2644,2646],{"class":150,"line":151},[148,2631,1926],{"class":154},[148,2633,2121],{"class":157},[148,2635,2124],{"class":154},[148,2637,175],{"class":174},[148,2639,1593],{"class":154},[148,2641,501],{"class":157},[148,2643,2124],{"class":154},[148,2645,175],{"class":174},[148,2647,374],{"class":157},[148,2649,2650,2652],{"class":150,"line":165},[148,2651,910],{"class":154},[148,2653,2356],{"class":157},[15,2655,2656,2657,2659,2660,2663,2664,2667],{},"Es la primera instrucción de ",[28,2658,633],{},". Sin ella, con ",[28,2661,2662],{},"y = -3"," la condición\n",[28,2665,2666],{},"row == y - 1"," se vuelve absurda y la función puede quedarse dando vueltas.",[50,2669],{},[53,2671,2673],{"id":2672},"bucles","Bucles",[58,2675,61],{"id":2676},"qué-es-3",[15,2678,2679],{},"Un bucle repite un bloque mientras se cumpla una condición. Existe para no\nescribir lo mismo cinco veces:",[139,2681,2683],{"className":141,"code":2682,"language":143,"meta":144,"style":144},"ft_putchar('o');   \u002F* quiero \"ooooo\" *\u002F\nft_putchar('o');\nft_putchar('o');\nft_putchar('o');\nft_putchar('o');\n",[28,2684,2685,2698,2708,2718,2728],{"__ignoreMap":144},[148,2686,2687,2689,2691,2693,2695],{"class":150,"line":151},[148,2688,1387],{"class":354},[148,2690,358],{"class":157},[148,2692,268],{"class":1348},[148,2694,704],{"class":157},[148,2696,2697],{"class":161},"   \u002F* quiero \"ooooo\" *\u002F\n",[148,2699,2700,2702,2704,2706],{"class":150,"line":165},[148,2701,1387],{"class":354},[148,2703,358],{"class":157},[148,2705,268],{"class":1348},[148,2707,994],{"class":157},[148,2709,2710,2712,2714,2716],{"class":150,"line":382},[148,2711,1387],{"class":354},[148,2713,358],{"class":157},[148,2715,268],{"class":1348},[148,2717,994],{"class":157},[148,2719,2720,2722,2724,2726],{"class":150,"line":394},[148,2721,1387],{"class":354},[148,2723,358],{"class":157},[148,2725,268],{"class":1348},[148,2727,994],{"class":157},[148,2729,2730,2732,2734,2736],{"class":150,"line":401},[148,2731,1387],{"class":354},[148,2733,358],{"class":157},[148,2735,268],{"class":1348},[148,2737,994],{"class":157},[139,2739,2741],{"className":141,"code":2740,"language":143,"meta":144,"style":144},"column = 0;\nwhile (column \u003C 5)\n{\n    ft_putchar('o');\n    column++;\n}\n",[28,2742,2743,2753,2765,2769,2779,2788],{"__ignoreMap":144},[148,2744,2745,2747,2749,2751],{"class":150,"line":151},[148,2746,168],{"class":157},[148,2748,171],{"class":154},[148,2750,175],{"class":174},[148,2752,411],{"class":157},[148,2754,2755,2757,2759,2761,2763],{"class":150,"line":165},[148,2756,531],{"class":154},[148,2758,534],{"class":157},[148,2760,423],{"class":154},[148,2762,539],{"class":174},[148,2764,374],{"class":157},[148,2766,2767],{"class":150,"line":382},[148,2768,379],{"class":157},[148,2770,2771,2773,2775,2777],{"class":150,"line":394},[148,2772,665],{"class":354},[148,2774,358],{"class":157},[148,2776,268],{"class":1348},[148,2778,994],{"class":157},[148,2780,2781,2784,2786],{"class":150,"line":401},[148,2782,2783],{"class":157},"    column",[148,2785,447],{"class":154},[148,2787,411],{"class":157},[148,2789,2790],{"class":150,"line":414},[148,2791,467],{"class":157},[58,2793,2795],{"id":2794},"la-anatomía-de-todo-bucle-tres-piezas","La anatomía de todo bucle: tres piezas",[15,2797,2798],{},"Cualquier bucle, en cualquier lenguaje, necesita estas tres cosas. Si falta una,\nel bucle se rompe:",[70,2800,2801,2814],{},[73,2802,2803],{},[76,2804,2805,2808,2811],{},[79,2806,2807],{},"Pieza",[79,2809,2810],{},"En el rush",[79,2812,2813],{},"Qué pasa si falta",[89,2815,2816,2831,2846],{},[76,2817,2818,2823,2828],{},[94,2819,2820],{},[19,2821,2822],{},"inicio",[94,2824,2825],{},[28,2826,2827],{},"column = 0;",[94,2829,2830],{},"empieza con basura",[76,2832,2833,2838,2843],{},[94,2834,2835],{},[19,2836,2837],{},"condición",[94,2839,2840],{},[28,2841,2842],{},"column \u003C width",[94,2844,2845],{},"no hay forma de terminar",[76,2847,2848,2853,2858],{},[94,2849,2850],{},[19,2851,2852],{},"avance",[94,2854,2855],{},[28,2856,2857],{},"column++;",[94,2859,2860],{},[19,2861,2862],{},"bucle infinito",[15,2864,2865,2866,330],{},"El 90 % de los bucles infinitos de un principiante son la tercera pieza\nolvidada. Si tu programa no termina, busca el ",[28,2867,447],{},[58,2869,2871,2872,2874],{"id":2870},"cómo-funciona-while-paso-a-paso","Cómo funciona ",[28,2873,531],{},", paso a paso",[139,2876,2878],{"className":141,"code":2877,"language":143,"meta":144,"style":144},"column = 0;\nwhile (column \u003C 3)\n{\n    ft_putchar('#');\n    column++;\n}\n",[28,2879,2880,2890,2903,2907,2918,2926],{"__ignoreMap":144},[148,2881,2882,2884,2886,2888],{"class":150,"line":151},[148,2883,168],{"class":157},[148,2885,171],{"class":154},[148,2887,175],{"class":174},[148,2889,411],{"class":157},[148,2891,2892,2894,2896,2898,2901],{"class":150,"line":165},[148,2893,531],{"class":154},[148,2895,534],{"class":157},[148,2897,423],{"class":154},[148,2899,2900],{"class":174}," 3",[148,2902,374],{"class":157},[148,2904,2905],{"class":150,"line":382},[148,2906,379],{"class":157},[148,2908,2909,2911,2913,2916],{"class":150,"line":394},[148,2910,665],{"class":354},[148,2912,358],{"class":157},[148,2914,2915],{"class":1348},"'#'",[148,2917,994],{"class":157},[148,2919,2920,2922,2924],{"class":150,"line":401},[148,2921,2783],{"class":157},[148,2923,447],{"class":154},[148,2925,411],{"class":157},[148,2927,2928],{"class":150,"line":414},[148,2929,467],{"class":157},[70,2931,2932,2951],{},[73,2933,2934],{},[76,2935,2936,2939,2943,2948],{},[79,2937,2938],{},"Momento",[79,2940,2941],{},[28,2942,104],{},[79,2944,2945],{},[28,2946,2947],{},"column \u003C 3",[79,2949,2950],{},"Acción",[89,2952,2953,2966,2977,2988],{},[76,2954,2955,2958,2960,2963],{},[94,2956,2957],{},"antes de entrar",[94,2959,134],{},[94,2961,2962],{},"verdadero",[94,2964,2965],{},"ejecuta el cuerpo",[76,2967,2968,2971,2973,2975],{},[94,2969,2970],{},"fin de vuelta 1",[94,2972,691],{},[94,2974,2962],{},[94,2976,2965],{},[76,2978,2979,2982,2984,2986],{},[94,2980,2981],{},"fin de vuelta 2",[94,2983,972],{},[94,2985,2962],{},[94,2987,2965],{},[76,2989,2990,2993,2995,3000],{},[94,2991,2992],{},"fin de vuelta 3",[94,2994,977],{},[94,2996,2997],{},[19,2998,2999],{},"falso",[94,3001,3002],{},"sale del bucle",[15,3004,3005,3006,330],{},"Salida: ",[28,3007,3008],{},"###",[15,3010,3011],{},"Dos detalles:",[478,3013,3014,3025],{},[481,3015,3016,3017,3020,3021,3024],{},"La condición se evalúa ",[19,3018,3019],{},"antes"," de cada vuelta. Si es falsa desde el\nprincipio, el cuerpo ",[19,3022,3023],{},"no se ejecuta nunca"," (cero vueltas es válido).",[481,3026,3027,3030,3031,3034,3035,286,3038,3041],{},[28,3028,3029],{},"i++"," es lo mismo que ",[28,3032,3033],{},"i = i + 1",". Existe también ",[28,3036,3037],{},"i--",[28,3039,3040],{},"i += 2",", etc.",[58,3043,3045,501,3047,3050],{"id":3044},"while-y-for-son-lo-mismo",[28,3046,531],{},[28,3048,3049],{},"for"," son lo mismo",[139,3052,3054],{"className":141,"code":3053,"language":143,"meta":144,"style":144},"column = 0;\nwhile (column \u003C width)\n{\n    \u002F* cuerpo *\u002F\n    column++;\n}\n",[28,3055,3056,3066,3077,3081,3086,3094],{"__ignoreMap":144},[148,3057,3058,3060,3062,3064],{"class":150,"line":151},[148,3059,168],{"class":157},[148,3061,171],{"class":154},[148,3063,175],{"class":174},[148,3065,411],{"class":157},[148,3067,3068,3070,3072,3074],{"class":150,"line":165},[148,3069,531],{"class":154},[148,3071,534],{"class":157},[148,3073,423],{"class":154},[148,3075,3076],{"class":157}," width)\n",[148,3078,3079],{"class":150,"line":382},[148,3080,379],{"class":157},[148,3082,3083],{"class":150,"line":394},[148,3084,3085],{"class":161},"    \u002F* cuerpo *\u002F\n",[148,3087,3088,3090,3092],{"class":150,"line":401},[148,3089,2783],{"class":157},[148,3091,447],{"class":154},[148,3093,411],{"class":157},[148,3095,3096],{"class":150,"line":414},[148,3097,467],{"class":157},[139,3099,3101],{"className":141,"code":3100,"language":143,"meta":144,"style":144},"for (column = 0; column \u003C width; column++)\n{\n    \u002F* cuerpo *\u002F\n}\n",[28,3102,3103,3125,3129,3133],{"__ignoreMap":144},[148,3104,3105,3107,3109,3111,3113,3116,3118,3121,3123],{"class":150,"line":151},[148,3106,3049],{"class":154},[148,3108,534],{"class":157},[148,3110,171],{"class":154},[148,3112,175],{"class":174},[148,3114,3115],{"class":157},"; column ",[148,3117,423],{"class":154},[148,3119,3120],{"class":157}," width; column",[148,3122,447],{"class":154},[148,3124,374],{"class":157},[148,3126,3127],{"class":150,"line":165},[148,3128,379],{"class":157},[148,3130,3131],{"class":150,"line":382},[148,3132,3085],{"class":161},[148,3134,3135],{"class":150,"line":394},[148,3136,467],{"class":157},[15,3138,3139,3140,3142,3143,3145,3146,3148],{},"El ",[28,3141,3049],{}," junta las tres piezas en una línea: inicio, condición, avance. Se usa\ncuando el recorrido es \"de 0 a n\". El ",[28,3144,531],{}," se usa cuando no sabes cuántas\nvueltas van a hacer falta. En el rush usamos ",[28,3147,531],{}," porque es el estilo que\npredomina en la piscina de 42, pero ambos son correctos.",[15,3150,3151,3152,3155,3156,3159],{},"Existe también ",[28,3153,3154],{},"do { ... } while (condición);",", que ejecuta el cuerpo ",[19,3157,3158],{},"al menos\nuna vez",". Aquí no lo necesitamos.",[58,3161,3163],{"id":3162},"bucles-anidados","Bucles anidados",[15,3165,3166],{},"Un bucle dentro de otro recorre una grilla: el de afuera las filas, el de\nadentro las columnas.",[139,3168,3170],{"className":141,"code":3169,"language":143,"meta":144,"style":144},"row = 0;\nwhile (row \u003C 3)          \u002F* 3 filas *\u002F\n{\n    column = 0;\n    while (column \u003C 5)   \u002F* 5 columnas por fila *\u002F\n    {\n        ft_putchar('#');\n        column++;\n    }\n    ft_putchar('\\n');\n    row++;\n}\n",[28,3171,3172,3183,3198,3202,3213,3228,3232,3242,3251,3255,3269,3277],{"__ignoreMap":144},[148,3173,3174,3177,3179,3181],{"class":150,"line":151},[148,3175,3176],{"class":157},"row ",[148,3178,171],{"class":154},[148,3180,175],{"class":174},[148,3182,411],{"class":157},[148,3184,3185,3187,3189,3191,3193,3195],{"class":150,"line":165},[148,3186,531],{"class":154},[148,3188,420],{"class":157},[148,3190,423],{"class":154},[148,3192,2900],{"class":174},[148,3194,542],{"class":157},[148,3196,3197],{"class":161},"          \u002F* 3 filas *\u002F\n",[148,3199,3200],{"class":150,"line":382},[148,3201,379],{"class":157},[148,3203,3204,3207,3209,3211],{"class":150,"line":394},[148,3205,3206],{"class":157},"    column ",[148,3208,171],{"class":154},[148,3210,175],{"class":174},[148,3212,411],{"class":157},[148,3214,3215,3217,3219,3221,3223,3225],{"class":150,"line":401},[148,3216,417],{"class":154},[148,3218,534],{"class":157},[148,3220,423],{"class":154},[148,3222,539],{"class":174},[148,3224,542],{"class":157},[148,3226,3227],{"class":161},"   \u002F* 5 columnas por fila *\u002F\n",[148,3229,3230],{"class":150,"line":414},[148,3231,432],{"class":157},[148,3233,3234,3236,3238,3240],{"class":150,"line":429},[148,3235,1768],{"class":354},[148,3237,358],{"class":157},[148,3239,2915],{"class":1348},[148,3241,994],{"class":157},[148,3243,3244,3247,3249],{"class":150,"line":435},[148,3245,3246],{"class":157},"        column",[148,3248,447],{"class":154},[148,3250,411],{"class":157},[148,3252,3253],{"class":150,"line":441},[148,3254,455],{"class":157},[148,3256,3257,3259,3261,3263,3265,3267],{"class":150,"line":452},[148,3258,665],{"class":354},[148,3260,358],{"class":157},[148,3262,1773],{"class":1348},[148,3264,1776],{"class":174},[148,3266,1773],{"class":1348},[148,3268,994],{"class":157},[148,3270,3271,3273,3275],{"class":150,"line":458},[148,3272,1878],{"class":157},[148,3274,447],{"class":154},[148,3276,411],{"class":157},[148,3278,3279],{"class":150,"line":464},[148,3280,467],{"class":157},[15,3282,3283],{},"Salida:",[139,3285,3288],{"className":3286,"code":3287,"language":724},[722],"#####\n#####\n#####\n",[28,3289,3287],{"__ignoreMap":144},[15,3291,3292,3293,3296,3297,3299,3300,3302],{},"Las tres piezas del bucle interno se ",[19,3294,3295],{},"reinician en cada fila",". Si te olvidas\nde ",[28,3298,2827],{}," dentro del ",[28,3301,531],{}," externo, la primera fila sale bien y las\ndemás salen vacías. Es un error clásico y silencioso.",[58,3304,3306],{"id":3305},"el-error-de-uno-de-más-off-by-one","El error de \"uno de más\" (off-by-one)",[139,3308,3310],{"className":141,"code":3309,"language":143,"meta":144,"style":144},"while (column \u003C= width)   \u002F* MAL si los índices van de 0 a width - 1 *\u002F\n",[28,3311,3312],{"__ignoreMap":144},[148,3313,3314,3316,3318,3320,3323],{"class":150,"line":151},[148,3315,531],{"class":154},[148,3317,534],{"class":157},[148,3319,2124],{"class":154},[148,3321,3322],{"class":157}," width)",[148,3324,3325],{"class":161},"   \u002F* MAL si los índices van de 0 a width - 1 *\u002F\n",[15,3327,3328,3329,286,3332,3334,3335,3338,3339,3342,3343,3347],{},"Con ",[28,3330,3331],{},"width = 5",[28,3333,104],{}," toma los valores ",[28,3336,3337],{},"0, 1, 2, 3, 4, 5",": ",[19,3340,3341],{},"seis","\niteraciones. En el rush eso imprime un carácter extra. En un array, eso es\nleer o escribir fuera de los límites, que es peor (ver\n",[24,3344,3346],{"href":3345},"#matrices-y-grillas","Matrices",").",[15,3349,3350,3351,3356,3357,3359],{},"Regla mnemotécnica: ",[19,3352,3353,3354],{},"si empiezas en 0, comparas con ",[28,3355,423],{},". Si empiezas en 1,\ncomparas con ",[28,3358,2124],{},". No mezcles.",[58,3361,3363,501,3366],{"id":3362},"break-y-continue",[28,3364,3365],{},"break",[28,3367,3368],{},"continue",[70,3370,3371,3379],{},[73,3372,3373],{},[76,3374,3375,3377],{},[79,3376,2496],{},[79,3378,2499],{},[89,3380,3381,3395],{},[76,3382,3383,3388],{},[94,3384,3385],{},[28,3386,3387],{},"break;",[94,3389,3390,3391,3394],{},"sale del bucle ",[19,3392,3393],{},"más interno"," ahora mismo",[76,3396,3397,3402],{},[94,3398,3399],{},[28,3400,3401],{},"continue;",[94,3403,3404],{},"salta al final de la vuelta y evalúa la condición",[15,3406,3407,3408,3410,3411,3413],{},"Funcionan, pero en la piscina se evitan: hacen que la condición del ",[28,3409,531],{}," deje\nde contar la historia completa. Si necesitas un ",[28,3412,3365],{},", probablemente la\ncondición esté mal escrita o falte una guard clause.",[58,3415,556],{"id":3416},"dónde-aparece-en-el-rush-4",[15,3418,3419,3420,3423],{},"Hay ",[19,3421,3422],{},"tres"," bucles, uno por cada nivel:",[70,3425,3426,3439],{},[73,3427,3428],{},[76,3429,3430,3433,3436],{},[79,3431,3432],{},"Bucle",[79,3434,3435],{},"Recorre",[79,3437,3438],{},"En qué función",[89,3440,3441,3457,3473],{},[76,3442,3443,3447,3453],{},[94,3444,3445],{},[28,3446,489],{},[94,3448,3449,3450,542],{},"las filas (0 a ",[28,3451,3452],{},"y - 1",[94,3454,3455],{},[28,3456,633],{},[76,3458,3459,3463,3469],{},[94,3460,3461],{},[28,3462,104],{},[94,3464,3465,3466,542],{},"las columnas (0 a ",[28,3467,3468],{},"x - 1",[94,3470,3471],{},[28,3472,500],{},[76,3474,3475,3479,3483],{},[94,3476,3477],{},[28,3478,104],{},[94,3480,3465,3481,542],{},[28,3482,3468],{},[94,3484,3485],{},[28,3486,504],{},[15,3488,3489,3490,3492,3493,3499],{},"Y una decisión de diseño: en lugar de anidar los dos bucles dentro de ",[28,3491,633],{},",\ndejamos el bucle de columnas dentro de las funciones auxiliares. ",[19,3494,3495,3496,3498],{},"Así ",[28,3497,633],{},"\ntiene un solo bucle."," Subdividir funciones también sirve para esto: bajar el\nanidamiento.",[50,3501],{},[53,3503,3505],{"id":3504},"matrices-y-grillas","Matrices y grillas",[58,3507,3509],{"id":3508},"primero-arrays-de-una-dimensión","Primero: arrays de una dimensión",[15,3511,3512,3513,3516],{},"Un array es una fila de cajas ",[19,3514,3515],{},"contiguas"," en memoria, todas del mismo tipo:",[139,3518,3520],{"className":141,"code":3519,"language":143,"meta":144,"style":144},"char    linea[5];\n",[28,3521,3522],{"__ignoreMap":144},[148,3523,3524,3526,3529,3532,3535],{"class":150,"line":151},[148,3525,257],{"class":154},[148,3527,3528],{"class":363},"    linea",[148,3530,3531],{"class":157},"[",[148,3533,3534],{"class":174},"5",[148,3536,3537],{"class":157},"];\n",[139,3539,3542],{"className":3540,"code":3541,"language":724},[722],"índice:   0     1     2     3     4\n        ┌─────┬─────┬─────┬─────┬─────┐\n        │     │     │     │     │     │\n        └─────┴─────┴─────┴─────┴─────┘\n",[28,3543,3541],{"__ignoreMap":144},[15,3545,3546,3547,286,3550,3553,3554,490,3557,3560],{},"Se accede con ",[28,3548,3549],{},"linea[0]",[28,3551,3552],{},"linea[4]",", etc. ",[19,3555,3556],{},"El índice no es un adorno: es la\ndistancia desde el principio.",[28,3558,3559],{},"linea[3]"," significa \"3 bytes después del\ninicio\".",[58,3562,3564],{"id":3563},"matriz-array-de-arrays","Matriz = array de arrays",[139,3566,3568],{"className":141,"code":3567,"language":143,"meta":144,"style":144},"char    tablero[3][5];\n",[28,3569,3570],{"__ignoreMap":144},[148,3571,3572,3574,3577,3579,3581,3584,3586],{"class":150,"line":151},[148,3573,257],{"class":154},[148,3575,3576],{"class":363},"    tablero",[148,3578,3531],{"class":157},[148,3580,977],{"class":174},[148,3582,3583],{"class":157},"][",[148,3585,3534],{"class":174},[148,3587,3537],{"class":157},[15,3589,3590,3591,3593],{},"Se lee de derecha a izquierda: \"5 ",[28,3592,257],{}," por fila, 3 filas\". Son 15 bytes\nseguidos:",[139,3595,3598],{"className":3596,"code":3597,"language":724},[722],"tablero[0][0] tablero[0][1] tablero[0][2] tablero[0][3] tablero[0][4]\ntablero[1][0] tablero[1][1] tablero[1][2] tablero[1][3] tablero[1][4]\ntablero[2][0] tablero[2][1] tablero[2][2] tablero[2][3] tablero[2][4]\n",[28,3599,3597],{"__ignoreMap":144},[15,3601,3602],{},"Dos reglas que evitan el 80 % de los bugs:",[478,3604,3605,3613],{},[481,3606,3607,3338,3610,330],{},[19,3608,3609],{},"Primero la fila, después la columna",[28,3611,3612],{},"tablero[fila][columna]",[481,3614,3615,3616,3619,3620,3623,3624,330],{},"En memoria, las filas van ",[19,3617,3618],{},"enteras y en orden",". Eso se llama\n",[35,3621,3622],{},"row-major order"," y es la razón por la que al imprimir hay que terminar cada\nfila con ",[28,3625,3626],{},"'\\n'",[15,3628,3629,3630,3633],{},"La dirección del elemento ",[28,3631,3632],{},"[fila][columna]"," es:",[139,3635,3638],{"className":3636,"code":3637,"language":724},[722],"dirección_base + (fila * ancho + columna) * tamaño_del_elemento\n",[28,3639,3637],{"__ignoreMap":144},[15,3641,3328,3642,3644,3645,3648,3649,3347],{},[28,3643,257],{}," el tamaño es 1, así que ",[28,3646,3647],{},"tablero[1][2]"," está exactamente 7 bytes\ndespués del inicio (",[28,3650,3651],{},"1 * 5 + 2",[58,3653,3655],{"id":3654},"recorrer-una-matriz","Recorrer una matriz",[15,3657,3658],{},"Siempre con dos bucles anidados: el externo las filas, el interno las columnas.",[139,3660,3662],{"className":141,"code":3661,"language":143,"meta":144,"style":144},"row = 0;\nwhile (row \u003C 3)\n{\n    column = 0;\n    while (column \u003C 5)\n    {\n        \u002F* aquí trabajas con tablero[row][column] *\u002F\n        column++;\n    }\n    row++;\n}\n",[28,3663,3664,3674,3686,3690,3700,3712,3716,3721,3729,3733,3741],{"__ignoreMap":144},[148,3665,3666,3668,3670,3672],{"class":150,"line":151},[148,3667,3176],{"class":157},[148,3669,171],{"class":154},[148,3671,175],{"class":174},[148,3673,411],{"class":157},[148,3675,3676,3678,3680,3682,3684],{"class":150,"line":165},[148,3677,531],{"class":154},[148,3679,420],{"class":157},[148,3681,423],{"class":154},[148,3683,2900],{"class":174},[148,3685,374],{"class":157},[148,3687,3688],{"class":150,"line":382},[148,3689,379],{"class":157},[148,3691,3692,3694,3696,3698],{"class":150,"line":394},[148,3693,3206],{"class":157},[148,3695,171],{"class":154},[148,3697,175],{"class":174},[148,3699,411],{"class":157},[148,3701,3702,3704,3706,3708,3710],{"class":150,"line":401},[148,3703,417],{"class":154},[148,3705,534],{"class":157},[148,3707,423],{"class":154},[148,3709,539],{"class":174},[148,3711,374],{"class":157},[148,3713,3714],{"class":150,"line":414},[148,3715,432],{"class":157},[148,3717,3718],{"class":150,"line":429},[148,3719,3720],{"class":161},"        \u002F* aquí trabajas con tablero[row][column] *\u002F\n",[148,3722,3723,3725,3727],{"class":150,"line":435},[148,3724,3246],{"class":157},[148,3726,447],{"class":154},[148,3728,411],{"class":157},[148,3730,3731],{"class":150,"line":441},[148,3732,455],{"class":157},[148,3734,3735,3737,3739],{"class":150,"line":452},[148,3736,1878],{"class":157},[148,3738,447],{"class":154},[148,3740,411],{"class":157},[148,3742,3743],{"class":150,"line":458},[148,3744,467],{"class":157},[15,3746,3747,3748,3751,3752,3755,3756,3759],{},"Si inviertes el orden (columnas afuera, filas adentro) el resultado no es un\nerror de compilación: es un dibujo ",[19,3749,3750],{},"transpuesto",". Y si intercambias los\níndices (",[28,3753,3754],{},"tablero[column][row]","), puedes leer fuera de los límites. El compilador\nno te va a avisar: en C, pasarse de un array es ",[19,3757,3758],{},"comportamiento indefinido",".\nPuede andar, puede imprimir basura, puede explotar.",[58,3761,3763],{"id":3762},"ejemplo-completo-dibujar-en-una-matriz-y-después-imprimir","Ejemplo completo: dibujar en una matriz y después imprimir",[15,3765,3766],{},"Este programa llena un tablero de 3×5 con el mismo rectángulo del rush y\ndespués lo imprime. Es la versión \"con memoria\", para que veas la mecánica.",[139,3768,3770],{"className":141,"code":3769,"language":143,"meta":144,"style":144},"#include \u003Cunistd.h>\n\n\u002F* Suponemos que ft_putchar ya existe. *\u002F\n\nvoid    ft_putchar(char c);\n\nvoid    dibujar_tablero(void)\n{\n    char    tablero[3][5];\n    int     row;\n    int     column;\n\n    \u002F* 1. Llenar la matriz celda por celda *\u002F\n    row = 0;\n    while (row \u003C 3)\n    {\n        column = 0;\n        while (column \u003C 5)\n        {\n            if (row == 0 || row == 2 || column == 0 || column == 4)\n                tablero[row][column] = 'o';\n            else\n                tablero[row][column] = ' ';\n            column++;\n        }\n        row++;\n    }\n    \u002F* 2. Imprimir la matriz fila por fila *\u002F\n    row = 0;\n    while (row \u003C 3)\n    {\n        column = 0;\n        while (column \u003C 5)\n        {\n            ft_putchar(tablero[row][column]);\n            column++;\n        }\n        ft_putchar('\\n');\n        row++;\n    }\n}\n",[28,3771,3772,3780,3784,3789,3793,3807,3811,3824,3828,3845,3852,3859,3863,3868,3878,3890,3894,3904,3916,3920,3958,3973,3977,3990,3998,4002,4010,4014,4019,4029,4041,4045,4056,4069,4074,4088,4097,4102,4117,4126,4131],{"__ignoreMap":144},[148,3773,3774,3777],{"class":150,"line":151},[148,3775,3776],{"class":154},"#include",[148,3778,3779],{"class":1348}," \u003Cunistd.h>\n",[148,3781,3782],{"class":150,"line":165},[148,3783,398],{"emptyLinePlaceholder":397},[148,3785,3786],{"class":150,"line":382},[148,3787,3788],{"class":161},"\u002F* Suponemos que ft_putchar ya existe. *\u002F\n",[148,3790,3791],{"class":150,"line":394},[148,3792,398],{"emptyLinePlaceholder":397},[148,3794,3795,3797,3799,3801,3803,3805],{"class":150,"line":401},[148,3796,351],{"class":154},[148,3798,665],{"class":354},[148,3800,358],{"class":157},[148,3802,257],{"class":154},[148,3804,672],{"class":363},[148,3806,994],{"class":157},[148,3808,3809],{"class":150,"line":414},[148,3810,398],{"emptyLinePlaceholder":397},[148,3812,3813,3815,3818,3820,3822],{"class":150,"line":429},[148,3814,351],{"class":154},[148,3816,3817],{"class":354},"    dibujar_tablero",[148,3819,358],{"class":157},[148,3821,351],{"class":154},[148,3823,374],{"class":157},[148,3825,3826],{"class":150,"line":435},[148,3827,379],{"class":157},[148,3829,3830,3833,3835,3837,3839,3841,3843],{"class":150,"line":441},[148,3831,3832],{"class":154},"    char",[148,3834,3576],{"class":363},[148,3836,3531],{"class":157},[148,3838,977],{"class":174},[148,3840,3583],{"class":157},[148,3842,3534],{"class":174},[148,3844,3537],{"class":157},[148,3846,3847,3849],{"class":150,"line":452},[148,3848,385],{"class":154},[148,3850,3851],{"class":157},"     row;\n",[148,3853,3854,3856],{"class":150,"line":458},[148,3855,385],{"class":154},[148,3857,3858],{"class":157},"     column;\n",[148,3860,3861],{"class":150,"line":464},[148,3862,398],{"emptyLinePlaceholder":397},[148,3864,3865],{"class":150,"line":470},[148,3866,3867],{"class":161},"    \u002F* 1. Llenar la matriz celda por celda *\u002F\n",[148,3869,3870,3872,3874,3876],{"class":150,"line":1616},[148,3871,404],{"class":157},[148,3873,171],{"class":154},[148,3875,175],{"class":174},[148,3877,411],{"class":157},[148,3879,3880,3882,3884,3886,3888],{"class":150,"line":1643},[148,3881,417],{"class":154},[148,3883,420],{"class":157},[148,3885,423],{"class":154},[148,3887,2900],{"class":174},[148,3889,374],{"class":157},[148,3891,3892],{"class":150,"line":1655},[148,3893,432],{"class":157},[148,3895,3896,3898,3900,3902],{"class":150,"line":1661},[148,3897,1555],{"class":157},[148,3899,171],{"class":154},[148,3901,175],{"class":174},[148,3903,411],{"class":157},[148,3905,3906,3908,3910,3912,3914],{"class":150,"line":1673},[148,3907,1566],{"class":154},[148,3909,534],{"class":157},[148,3911,423],{"class":154},[148,3913,539],{"class":174},[148,3915,374],{"class":157},[148,3917,3918],{"class":150,"line":1679},[148,3919,1578],{"class":157},[148,3921,3922,3924,3926,3928,3930,3932,3934,3936,3939,3941,3943,3945,3947,3949,3951,3953,3956],{"class":150,"line":1685},[148,3923,1583],{"class":154},[148,3925,420],{"class":157},[148,3927,1588],{"class":154},[148,3929,175],{"class":174},[148,3931,1593],{"class":154},[148,3933,1596],{"class":157},[148,3935,1588],{"class":154},[148,3937,3938],{"class":174}," 2",[148,3940,1593],{"class":154},[148,3942,204],{"class":157},[148,3944,1588],{"class":154},[148,3946,175],{"class":174},[148,3948,1593],{"class":154},[148,3950,204],{"class":157},[148,3952,1588],{"class":154},[148,3954,3955],{"class":174}," 4",[148,3957,374],{"class":157},[148,3959,3960,3963,3966,3968,3971],{"class":150,"line":1690},[148,3961,3962],{"class":363},"                tablero",[148,3964,3965],{"class":157},"[row][column] ",[148,3967,171],{"class":154},[148,3969,3970],{"class":1348}," 'o'",[148,3972,411],{"class":157},[148,3974,3975],{"class":150,"line":1715},[148,3976,1682],{"class":154},[148,3978,3979,3981,3983,3985,3988],{"class":150,"line":1727},[148,3980,3962],{"class":363},[148,3982,3965],{"class":157},[148,3984,171],{"class":154},[148,3986,3987],{"class":1348}," ' '",[148,3989,411],{"class":157},[148,3991,3992,3994,3996],{"class":150,"line":1732},[148,3993,1752],{"class":157},[148,3995,447],{"class":154},[148,3997,411],{"class":157},[148,3999,4000],{"class":150,"line":1744},[148,4001,1762],{"class":157},[148,4003,4004,4006,4008],{"class":150,"line":1749},[148,4005,444],{"class":157},[148,4007,447],{"class":154},[148,4009,411],{"class":157},[148,4011,4012],{"class":150,"line":1759},[148,4013,455],{"class":157},[148,4015,4016],{"class":150,"line":1765},[148,4017,4018],{"class":161},"    \u002F* 2. Imprimir la matriz fila por fila *\u002F\n",[148,4020,4021,4023,4025,4027],{"class":150,"line":1783},[148,4022,404],{"class":157},[148,4024,171],{"class":154},[148,4026,175],{"class":174},[148,4028,411],{"class":157},[148,4030,4031,4033,4035,4037,4039],{"class":150,"line":1792},[148,4032,417],{"class":154},[148,4034,420],{"class":157},[148,4036,423],{"class":154},[148,4038,2900],{"class":174},[148,4040,374],{"class":157},[148,4042,4043],{"class":150,"line":1797},[148,4044,432],{"class":157},[148,4046,4048,4050,4052,4054],{"class":150,"line":4047},32,[148,4049,1555],{"class":157},[148,4051,171],{"class":154},[148,4053,175],{"class":174},[148,4055,411],{"class":157},[148,4057,4059,4061,4063,4065,4067],{"class":150,"line":4058},33,[148,4060,1566],{"class":154},[148,4062,534],{"class":157},[148,4064,423],{"class":154},[148,4066,539],{"class":174},[148,4068,374],{"class":157},[148,4070,4072],{"class":150,"line":4071},34,[148,4073,1578],{"class":157},[148,4075,4077,4080,4082,4085],{"class":150,"line":4076},35,[148,4078,4079],{"class":354},"            ft_putchar",[148,4081,358],{"class":157},[148,4083,4084],{"class":363},"tablero",[148,4086,4087],{"class":157},"[row][column]);\n",[148,4089,4091,4093,4095],{"class":150,"line":4090},36,[148,4092,1752],{"class":157},[148,4094,447],{"class":154},[148,4096,411],{"class":157},[148,4098,4100],{"class":150,"line":4099},37,[148,4101,1762],{"class":157},[148,4103,4105,4107,4109,4111,4113,4115],{"class":150,"line":4104},38,[148,4106,1768],{"class":354},[148,4108,358],{"class":157},[148,4110,1773],{"class":1348},[148,4112,1776],{"class":174},[148,4114,1773],{"class":1348},[148,4116,994],{"class":157},[148,4118,4120,4122,4124],{"class":150,"line":4119},39,[148,4121,444],{"class":157},[148,4123,447],{"class":154},[148,4125,411],{"class":157},[148,4127,4129],{"class":150,"line":4128},40,[148,4130,455],{"class":157},[148,4132,4134],{"class":150,"line":4133},41,[148,4135,467],{"class":157},[15,4137,3283],{},[139,4139,4142],{"className":4140,"code":4141,"language":724},[722],"ooooo\no   o\nooooo\n",[28,4143,4141],{"__ignoreMap":144},[15,4145,4146,4147,4150],{},"Fíjate que son ",[19,4148,4149],{},"dos recorridos completos",": uno para llenar, otro para\nimprimir. Es el patrón estándar cuando el dibujo depende de toda la matriz (por\nejemplo, para resolver un Sudoku o un laberinto).",[58,4152,4154],{"id":4153},"por-qué-el-rush-no-usa-una-matriz","Por qué el rush NO usa una matriz",[15,4156,4157,4158,4160,4161,4164],{},"Porque no hace falta. ",[28,4159,633],{}," calcula el carácter de cada posición ",[19,4162,4163],{},"en el\nmomento"," y lo escribe: no guarda nada. Ventajas:",[70,4166,4167,4180],{},[73,4168,4169],{},[76,4170,4171,4174,4177],{},[79,4172,4173],{},"Enfoque",[79,4175,4176],{},"Ventaja",[79,4178,4179],{},"Desventaja",[89,4181,4182,4193],{},[76,4183,4184,4187,4190],{},[94,4185,4186],{},"Escribir directo (el rush)",[94,4188,4189],{},"no usa memoria, menos código, imposible pasarse de límites",[94,4191,4192],{},"no puedes \"volver atrás\" ni cambiar una celda ya impresa",[76,4194,4195,4198,4201],{},[94,4196,4197],{},"Matriz primero",[94,4199,4200],{},"puedes consultar y modificar celdas",[94,4202,4203],{},"necesitas tamaño fijo o memoria dinámica, y recorrerla dos veces",[15,4205,4206,4207,4210,4211,4213,4214,4216,4217,4220,4221,4224],{},"Además hay un detalle de C: ",[28,4208,4209],{},"char tablero[x][y]"," con ",[28,4212,577],{}," e ",[28,4215,580],{}," que llegan por\nparámetro ",[19,4218,4219],{},"no compila en C clásico",", porque el tamaño tiene que conocerse al\ncompilar. Se puede con VLA (C99) o con ",[28,4222,4223],{},"malloc",", pero en la piscina eso trae\nmás problemas que soluciones. Si el ejercicio no pide guardar, no guardes.",[58,4226,556],{"id":4227},"dónde-aparece-en-el-rush-5",[15,4229,4230,4231,4234,4235,4237,4238,4240,4241,286,4244,4247],{},"El rectángulo ",[19,4232,4233],{},"es"," una matriz: ",[28,4236,577],{}," columnas por ",[28,4239,580],{}," filas. Lo único que cambia\nes que en lugar de guardar cada celda en memoria, la mandamos a la pantalla en\nel momento. El razonamiento ",[28,4242,4243],{},"fila = 0..y-1",[28,4245,4246],{},"columna = 0..x-1"," es idéntico.",[15,4249,4250,4251,4254],{},"Y para el ",[28,4252,4253],{},"rush01"," (el de las vistas) sí vas a necesitar matrices de verdad.\nEsta sección es la base para eso.",[50,4256],{},[53,4258,4260],{"id":4259},"char-y-ascii","Char y ASCII",[15,4262,4263,4264,4266,4267,4270,4271,4273,4274,330],{},"Un ",[28,4265,257],{}," guarda ",[19,4268,4269],{},"un byte",", y un byte es un número de 0 a 255. Las letras son\nuna convención: la tabla ASCII dice que el número 111 es ",[28,4272,268],{}," y el 45 es ",[28,4275,1668],{},[70,4277,4278,4288],{},[73,4279,4280],{},[76,4281,4282,4285],{},[79,4283,4284],{},"Carácter",[79,4286,4287],{},"Número",[89,4289,4290,4300,4310,4319,4328],{},[76,4291,4292,4297],{},[94,4293,4294,4296],{},[28,4295,1739],{}," (espacio)",[94,4298,4299],{},"32",[76,4301,4302,4307],{},[94,4303,4304,4306],{},[28,4305,3626],{}," (salto de línea)",[94,4308,4309],{},"10",[76,4311,4312,4316],{},[94,4313,4314],{},[28,4315,1668],{},[94,4317,4318],{},"45",[76,4320,4321,4325],{},[94,4322,4323],{},[28,4324,268],{},[94,4326,4327],{},"111",[76,4329,4330,4333],{},[94,4331,4332],{},"`'",[94,4334,4335],{},"'`",[15,4337,4338],{},"Consecuencias prácticas:",[1437,4340,4341,4356,4364],{},[481,4342,4343,501,4345,4348,4349,4352,4353,4355],{},[28,4344,782],{},[28,4346,4347],{},"ft_putchar(111)"," hacen ",[19,4350,4351],{},"exactamente lo mismo",". El\ncompilador traduce ",[28,4354,268],{}," a 111.",[481,4357,4358,4360,4361,4363],{},[28,4359,3626],{}," es ",[19,4362,872],{}," carácter, no dos. La barra invertida es la forma de escribir\ncaracteres que no se ven.",[481,4365,4366,4369,4370,4373,4374,501,4377,4380,4381,4383,4384,330],{},[28,4367,4368],{},"\"o\""," (comillas dobles) es un ",[19,4371,4372],{},"string",": un array de 2 bytes (",[28,4375,4376],{},"o",[28,4378,4379],{},"\\0",").\nNo sirve como argumento de ",[28,4382,1387],{},", que espera un solo ",[28,4385,257],{},[15,4387,4388],{},"Comillas simples = un carácter. Comillas dobles = texto. No se mezclan.",[50,4390],{},[53,4392,4394],{"id":4393},"índices-y-el-cero","Índices y el cero",[15,4396,4397,4398,4400,4401,4404],{},"Los índices empiezan en ",[19,4399,134],{}," porque un índice es una ",[19,4402,4403],{},"distancia",", no un\nnúmero de orden. El primer elemento está a distancia 0 del inicio.",[139,4406,4409],{"className":4407,"code":4408,"language":724},[722],"posición:  1°    2°    3°    4°    5°\níndice:     0     1     2     3     4\n",[28,4410,4408],{"__ignoreMap":144},[15,4412,4413],{},"Consecuencias que vas a usar todo el tiempo:",[70,4415,4416,4426],{},[73,4417,4418],{},[76,4419,4420,4423],{},[79,4421,4422],{},"Quieres",[79,4424,4425],{},"Escribís",[89,4427,4428,4438,4451,4461],{},[76,4429,4430,4433],{},[94,4431,4432],{},"el primero",[94,4434,4435],{},[28,4436,4437],{},"[0]",[76,4439,4440,4446],{},[94,4441,4442,4443],{},"el último de ",[28,4444,4445],{},"n",[94,4447,4448],{},[28,4449,4450],{},"[n - 1]",[76,4452,4453,4456],{},[94,4454,4455],{},"recorrer todos",[94,4457,4458],{},[28,4459,4460],{},"while (i \u003C n)",[76,4462,4463,4466],{},[94,4464,4465],{},"el del medio (aproximado)",[94,4467,4468],{},[28,4469,4470],{},"[n \u002F 2]",[15,4472,4473,4474,4477,4478,4480],{},"En el rush, ",[28,4475,4476],{},"width - 1"," es la última columna y ",[28,4479,3452],{}," la última fila. No es\ncapricho: es la distancia desde 0.",[15,4482,4483,4484,4487,4488,4491,4492,4495,4496,4499,4500,4502,4503,4505,4506,4509,4510,4512],{},"Y esto explica el caso raro del enunciado: si ",[28,4485,4486],{},"x = 1",", entonces\n",[28,4489,4490],{},"width - 1 = 0",", así que la columna 0 es ",[19,4493,4494],{},"a la vez"," la primera y la última.\nPor eso ",[28,4497,4498],{},"rush(1, 5)"," imprime ",[28,4501,4376],{}," arriba, ",[28,4504,4376],{}," abajo y ",[28,4507,4508],{},"|"," en el medio, sin\nningún ",[28,4511,1926],{}," especial.",[50,4514],{},[53,4516,4518],{"id":4517},"compilar-qué-es-gcc-y-por-qué-esos-flags","Compilar: qué es gcc y por qué esos flags",[58,4520,4522],{"id":4521},"gcc-no-es-un-programa-es-un-director-de-orquesta","gcc no es \"un programa\", es un director de orquesta",[15,4524,4525,4526,4529,4530,4533],{},"GCC significa ",[19,4527,4528],{},"GNU Compiler Collection"," (colección de compiladores de GNU).\nNació en 1987 como \"GNU C Compiler\", pero hoy compila C, C++, Objective-C,\nFortran, Ada, Go y más. ",[28,4531,4532],{},"gcc"," es el que usas para C.",[15,4535,4536,4537,490,4539,4542,4543,4546],{},"Lo importante: ",[28,4538,4532],{},[19,4540,4541],{},"no traduce nada por sí mismo",". Es un ",[35,4544,4545],{},"driver",": recibe\ntus archivos, coordina cuatro programas distintos y te devuelve un ejecutable.",[139,4548,4551],{"className":4549,"code":4550,"language":724},[722],"main.c ──► preprocesador ──► compilador ──► ensamblador ──► enlazador ──► rush00\n            (cpp)            (cc1)          (as)            (ld)\n             .c → .i          .i → .s        .s → .o         .o + libs → binario\n",[28,4552,4550],{"__ignoreMap":144},[70,4554,4555,4573],{},[73,4556,4557],{},[76,4558,4559,4562,4565,4567,4570],{},[79,4560,4561],{},"Etapa",[79,4563,4564],{},"Programa",[79,4566,2499],{},[79,4568,4569],{},"Flag para frenar ahí",[79,4571,4572],{},"Salida",[89,4574,4575,4605,4629,4653],{},[76,4576,4577,4580,4585,4594,4599],{},[94,4578,4579],{},"1. Preprocesar",[94,4581,4582],{},[28,4583,4584],{},"cpp",[94,4586,4587,4588,286,4590,4593],{},"resuelve ",[28,4589,3776],{},[28,4591,4592],{},"#define"," y borra comentarios",[94,4595,4596],{},[28,4597,4598],{},"-E",[94,4600,4601,4604],{},[28,4602,4603],{},".i"," (C todavía legible)",[76,4606,4607,4610,4615,4618,4623],{},[94,4608,4609],{},"2. Compilar",[94,4611,4612],{},[28,4613,4614],{},"cc1",[94,4616,4617],{},"traduce C a ensamblador",[94,4619,4620],{},[28,4621,4622],{},"-S",[94,4624,4625,4628],{},[28,4626,4627],{},".s"," (ensamblador)",[76,4630,4631,4634,4639,4642,4647],{},[94,4632,4633],{},"3. Ensamblar",[94,4635,4636],{},[28,4637,4638],{},"as",[94,4640,4641],{},"traduce ensamblador a código máquina",[94,4643,4644],{},[28,4645,4646],{},"-c",[94,4648,4649,4652],{},[28,4650,4651],{},".o"," (objeto)",[76,4654,4655,4658,4663,4669,4672],{},[94,4656,4657],{},"4. Enlazar",[94,4659,4660],{},[28,4661,4662],{},"ld",[94,4664,4665,4666,4668],{},"une los ",[28,4667,4651],{}," y las librerías en un ejecutable",[94,4670,4671],{},"—",[94,4673,4674],{},"binario",[15,4676,4677],{},"Puedes verlo con tus propios ojos:",[139,4679,4683],{"className":4680,"code":4681,"language":4682,"meta":144,"style":144},"language-sh shiki shiki-themes github-light github-dark","gcc -E main.c -o main.i    # solo preprocesar\ngcc -S main.c -o main.s    # hasta ensamblador\ngcc -c main.c -o main.o    # hasta objeto (sin enlazar)\nfile main.o                # \"ELF 64-bit ... relocatable\"\n","sh",[28,4684,4685,4704,4721,4738],{"__ignoreMap":144},[148,4686,4687,4689,4692,4695,4698,4701],{"class":150,"line":151},[148,4688,4532],{"class":354},[148,4690,4691],{"class":174}," -E",[148,4693,4694],{"class":1348}," main.c",[148,4696,4697],{"class":174}," -o",[148,4699,4700],{"class":1348}," main.i",[148,4702,4703],{"class":161},"    # solo preprocesar\n",[148,4705,4706,4708,4711,4713,4715,4718],{"class":150,"line":165},[148,4707,4532],{"class":354},[148,4709,4710],{"class":174}," -S",[148,4712,4694],{"class":1348},[148,4714,4697],{"class":174},[148,4716,4717],{"class":1348}," main.s",[148,4719,4720],{"class":161},"    # hasta ensamblador\n",[148,4722,4723,4725,4728,4730,4732,4735],{"class":150,"line":382},[148,4724,4532],{"class":354},[148,4726,4727],{"class":174}," -c",[148,4729,4694],{"class":1348},[148,4731,4697],{"class":174},[148,4733,4734],{"class":1348}," main.o",[148,4736,4737],{"class":161},"    # hasta objeto (sin enlazar)\n",[148,4739,4740,4743,4745],{"class":150,"line":394},[148,4741,4742],{"class":354},"file",[148,4744,4734],{"class":1348},[148,4746,4747],{"class":161},"                # \"ELF 64-bit ... relocatable\"\n",[58,4749,4751],{"id":4750},"por-qué-esto-te-importa-hay-dos-familias-de-errores","Por qué esto te importa: hay DOS familias de errores",[70,4753,4754,4767],{},[73,4755,4756],{},[76,4757,4758,4761,4764],{},[79,4759,4760],{},"Familia",[79,4762,4763],{},"Cuándo aparece",[79,4765,4766],{},"Ejemplo real",[89,4768,4769,4785],{},[76,4770,4771,4776,4779],{},[94,4772,4773],{},[19,4774,4775],{},"Error de compilación",[94,4777,4778],{},"etapas 1–3",[94,4780,4781,4782,4784],{},"falta un ",[28,4783,178],{},", tipo equivocado, variable sin declarar",[76,4786,4787,4792,4795],{},[94,4788,4789],{},[19,4790,4791],{},"Error de enlazado (link)",[94,4793,4794],{},"etapa 4",[94,4796,4797],{},"la función existe pero nunca la compilaste",[15,4799,4800,4801,231],{},"Ejemplo de compilación, con ",[28,4802,4803],{},"-Wall -Wextra -Werror",[139,4805,4808],{"className":4806,"code":4807,"language":724},[722],"w1.c: In function 'main':\nw1.c:5:13: error: suggest parentheses around assignment used as truth value [-Werror=parentheses]\n    5 |         if (x = 0)\n      |             ^\n",[28,4809,4807],{"__ignoreMap":144},[15,4811,4812,4813,4815],{},"Ejemplo de enlazado (olvidaste pasar ",[28,4814,1380],{},"):",[139,4817,4820],{"className":4818,"code":4819,"language":724},[722],"\u002Fusr\u002Fbin\u002Fld: \u002Ftmp\u002FccXa9fT2.o: in function `print_horizontal_edge':\nrush00.c:(.text+0x2b): undefined reference to `ft_putchar'\n",[28,4821,4819],{"__ignoreMap":144},[15,4823,4824,4825,4828,4829,4831],{},"Fíjate en el prefijo: ",[28,4826,4827],{},"ld:"," significa que el compilador ya terminó y el que se\nqueja es el ",[19,4830,1391],{},". Ahí no hay nada mal escrito en tu código: falta una\npieza en el comando.",[58,4833,4835,4836,4839],{"id":4834},"por-qué-cada-c-se-compila-por-separado","Por qué cada ",[28,4837,4838],{},".c"," se compila por separado",[15,4841,4842,4843,1463,4846,4848,4849,4852,4853,4855,4856,4859],{},"Cada archivo es una ",[19,4844,4845],{},"unidad de compilación independiente",[28,4847,4532],{}," compila\n",[28,4850,4851],{},"main.c"," sin mirar ",[28,4854,1376],{},", genera ",[28,4857,4858],{},"main.o",", y solo al final junta todo.\nDe ahí sale todo lo que ya viste:",[1437,4861,4862,4869,4879],{},[481,4863,4864,4865,4868],{},"Necesitas ",[19,4866,4867],{},"prototipos",": el compilador no puede adivinar qué hay en otro\narchivo.",[481,4870,4871,4872,4874,4875,4878],{},"Cambiar un solo ",[28,4873,4838],{}," no obliga a recompilar los demás (por eso ",[28,4876,4877],{},"make"," es\nrápido en proyectos grandes).",[481,4880,4881,4882,330],{},"Si dos archivos definen la misma función global, el enlazador se queja de\n",[35,4883,4884],{},"multiple definition",[58,4886,4888],{"id":4887},"el-comando-palabra-por-palabra","El comando, palabra por palabra",[139,4890,4892],{"className":4680,"code":4891,"language":4682,"meta":144,"style":144},"gcc -Wall -Wextra -Werror main.c ft_putchar.c rush00.c -o rush00\n",[28,4893,4894],{"__ignoreMap":144},[148,4895,4896,4898,4901,4904,4907,4909,4912,4915,4917],{"class":150,"line":151},[148,4897,4532],{"class":354},[148,4899,4900],{"class":174}," -Wall",[148,4902,4903],{"class":174}," -Wextra",[148,4905,4906],{"class":174}," -Werror",[148,4908,4694],{"class":1348},[148,4910,4911],{"class":1348}," ft_putchar.c",[148,4913,4914],{"class":1348}," rush00.c",[148,4916,4697],{"class":174},[148,4918,4919],{"class":1348}," rush00\n",[70,4921,4922,4933],{},[73,4923,4924],{},[76,4925,4926,4929,4931],{},[79,4927,4928],{},"Palabra",[79,4930,61],{},[79,4932,2499],{},[89,4934,4935,4947,4960,4972,4984,4997],{},[76,4936,4937,4941,4944],{},[94,4938,4939],{},[28,4940,4532],{},[94,4942,4943],{},"programa",[94,4945,4946],{},"el driver",[76,4948,4949,4954,4957],{},[94,4950,4951],{},[28,4952,4953],{},"-Wall",[94,4955,4956],{},"flag",[94,4958,4959],{},"activa el primer grupo de warnings",[76,4961,4962,4967,4969],{},[94,4963,4964],{},[28,4965,4966],{},"-Wextra",[94,4968,4956],{},[94,4970,4971],{},"activa un segundo grupo, más estricto",[76,4973,4974,4979,4981],{},[94,4975,4976],{},[28,4977,4978],{},"-Werror",[94,4980,4956],{},[94,4982,4983],{},"convierte cada warning en error",[76,4985,4986,4991,4994],{},[94,4987,4988],{},[28,4989,4990],{},"main.c ft_putchar.c rush00.c",[94,4992,4993],{},"entradas",[94,4995,4996],{},"los tres se compilan y se enlazan juntos",[76,4998,4999,5004,5007],{},[94,5000,5001],{},[28,5002,5003],{},"-o rush00",[94,5005,5006],{},"flag + valor",[94,5008,5009],{},"nombre del ejecutable de salida",[15,5011,5012,5013,5016,5017,5020],{},"Sin ",[28,5014,5015],{},"-o",", el ejecutable se llama ",[28,5018,5019],{},"a.out",". Funciona, pero no dice nada.",[58,5022,5024],{"id":5023},"los-flags-uno-por-uno","Los flags, uno por uno",[5026,5027,5029],"h4",{"id":5028},"wall",[28,5030,4953],{},[15,5032,5033,5034,231],{},"Activa un conjunto curado de warnings que ",[19,5035,5036],{},"casi siempre son bugs reales",[70,5038,5039,5049],{},[73,5040,5041],{},[76,5042,5043,5046],{},[79,5044,5045],{},"Warning",[79,5047,5048],{},"Qué detecta",[89,5050,5051,5061,5076,5092,5102],{},[76,5052,5053,5058],{},[94,5054,5055],{},[28,5056,5057],{},"-Wunused-variable",[94,5059,5060],{},"declaraste algo y nunca lo usaste",[76,5062,5063,5068],{},[94,5064,5065],{},[28,5066,5067],{},"-Wparentheses",[94,5069,5070,5073,5074],{},[28,5071,5072],{},"if (x = 0)"," en lugar de ",[28,5075,1588],{},[76,5077,5078,5083],{},[94,5079,5080],{},[28,5081,5082],{},"-Wreturn-type",[94,5084,5085,5086,5088,5089,5091],{},"una función ",[28,5087,119],{}," sin ",[28,5090,47],{}," en algún camino",[76,5093,5094,5099],{},[94,5095,5096],{},[28,5097,5098],{},"-Wuninitialized",[94,5100,5101],{},"usas una variable sin darle valor",[76,5103,5104,5109],{},[94,5105,5106],{},[28,5107,5108],{},"-Wimplicit-function-declaration",[94,5110,5111],{},"llamas a una función sin prototipo",[15,5113,5114,5115,5120],{},"El nombre engaña: ",[19,5116,5117,5119],{},[28,5118,4953],{}," no activa \"todos\" los warnings",", solo los que el\nequipo de GCC considera indiscutibles. Hay warnings que quedan afuera porque\nson ruidosos o discutibles.",[5026,5122,5124],{"id":5123},"wextra",[28,5125,4966],{},[15,5127,5128],{},"Activa warnings adicionales que son útiles pero más estrictos. Los más comunes\nen la piscina:",[70,5130,5131,5139],{},[73,5132,5133],{},[76,5134,5135,5137],{},[79,5136,5045],{},[79,5138,5048],{},[89,5140,5141,5151,5167,5180],{},[76,5142,5143,5148],{},[94,5144,5145],{},[28,5146,5147],{},"-Wunused-parameter",[94,5149,5150],{},"un parámetro que no usas dentro de la función",[76,5152,5153,5158],{},[94,5154,5155],{},[28,5156,5157],{},"-Wsign-compare",[94,5159,5160,5161,5163,5164],{},"comparas un ",[28,5162,119],{}," con un ",[28,5165,5166],{},"unsigned",[76,5168,5169,5174],{},[94,5170,5171],{},[28,5172,5173],{},"-Wtype-limits",[94,5175,5176,5177,542],{},"comparaciones que nunca pueden ser verdaderas (",[28,5178,5179],{},"char > 300",[76,5181,5182,5187],{},[94,5183,5184],{},[28,5185,5186],{},"-Wmissing-field-initializers",[94,5188,5189,5190,5193],{},"inicializas una ",[28,5191,5192],{},"struct"," a medias",[15,5195,5196,5197,5199,5200,5202,5203,5205,5206,5208,5209,5212],{},"Por eso en ",[28,5198,633],{}," usamos los dos parámetros: si ",[28,5201,580],{}," no se usara, ",[28,5204,4966],{},"\navisaría. Y por eso las funciones auxiliares reciben ",[28,5207,590],{}," aunque no lo\nmodifiquen: lo ",[19,5210,5211],{},"leen",", y eso cuenta como uso.",[5026,5214,5216],{"id":5215},"werror",[28,5217,4978],{},[15,5219,5220],{},"Convierte cada warning en un error: el compilador se niega a generar el\nejecutable. La diferencia práctica:",[139,5222,5224],{"className":4680,"code":5223,"language":4682,"meta":144,"style":144},"gcc -Wall archivo.c -o prog      # muestra el warning, exit code 0, genera prog\ngcc -Wall -Werror archivo.c -o prog   # muestra el error, exit code 1, NO genera prog\n",[28,5225,5226,5243],{"__ignoreMap":144},[148,5227,5228,5230,5232,5235,5237,5240],{"class":150,"line":151},[148,5229,4532],{"class":354},[148,5231,4900],{"class":174},[148,5233,5234],{"class":1348}," archivo.c",[148,5236,4697],{"class":174},[148,5238,5239],{"class":1348}," prog",[148,5241,5242],{"class":161},"      # muestra el warning, exit code 0, genera prog\n",[148,5244,5245,5247,5249,5251,5253,5255,5257],{"class":150,"line":165},[148,5246,4532],{"class":354},[148,5248,4900],{"class":174},[148,5250,4906],{"class":174},[148,5252,5234],{"class":1348},[148,5254,4697],{"class":174},[148,5256,5239],{"class":1348},[148,5258,5259],{"class":161},"   # muestra el error, exit code 1, NO genera prog\n",[15,5261,5262],{},"Y el detalle que confirma el pipeline: la última línea del error dice",[139,5264,5267],{"className":5265,"code":5266,"language":724},[722],"cc1: all warnings being treated as errors\n",[28,5268,5266],{"__ignoreMap":144},[15,5270,5271,5273],{},[28,5272,4614],{}," es el compilador propiamente dicho, no el driver. Ahí ves quién se queja.",[15,5275,5276,5279],{},[19,5277,5278],{},"¿Por qué 42 lo exige?"," Porque un warning es una sospecha de bug, y en un\nproyecto de 40 líneas puedes revisarlas todas. En un proyecto de 40.000 no. El\nhábito se instala desde el día uno. Además, el corrector de 42 compila con\nflags estrictos: si tu código \"andaba\" con warnings, puede que no compile ahí.",[15,5281,5282,5285],{},[19,5283,5284],{},"¿Cuándo desactivarlo?"," Solo mientras debuggeas, para ver si el programa\nllega a ejecutarse. Nunca en la entrega.",[5026,5287,5289],{"id":5288},"o-nombre",[28,5290,5291],{},"-o nombre",[15,5293,5294],{},"Define el nombre del archivo de salida. Dos reglas:",[478,5296,5297,5305],{},[481,5298,5299,5300,621,5303,330],{},"El nombre va ",[19,5301,5302],{},"inmediatamente después",[28,5304,5015],{},[481,5306,5307,5308,5310,5311,3347],{},"Si no lo pones, se llama ",[28,5309,5019],{}," (histórico: ",[35,5312,5313],{},"assembler output",[139,5315,5317],{"className":4680,"code":5316,"language":4682,"meta":144,"style":144},"gcc main.c -o rush00      # crea .\u002Frush00\ngcc main.c -o rushoo      # error de tipeo: crea .\u002Frushoo, y .\u002Frush00 no existe\n",[28,5318,5319,5333],{"__ignoreMap":144},[148,5320,5321,5323,5325,5327,5330],{"class":150,"line":151},[148,5322,4532],{"class":354},[148,5324,4694],{"class":1348},[148,5326,4697],{"class":174},[148,5328,5329],{"class":1348}," rush00",[148,5331,5332],{"class":161},"      # crea .\u002Frush00\n",[148,5334,5335,5337,5339,5341,5344],{"class":150,"line":165},[148,5336,4532],{"class":354},[148,5338,4694],{"class":1348},[148,5340,4697],{"class":174},[148,5342,5343],{"class":1348}," rushoo",[148,5345,5346],{"class":161},"      # error de tipeo: crea .\u002Frushoo, y .\u002Frush00 no existe\n",[5026,5348,5349],{"id":143},[28,5350,4646],{},[15,5352,5353,5354,5357],{},"Compila un archivo ",[19,5355,5356],{},"hasta objeto",", sin enlazar. Sirve para dos cosas:",[1437,5359,5360,5363],{},[481,5361,5362],{},"revisar rápido si un archivo tiene errores de sintaxis;",[481,5364,5365],{},"compilar por partes en proyectos grandes.",[139,5367,5369],{"className":4680,"code":5368,"language":4682,"meta":144,"style":144},"gcc -Wall -Wextra -Werror -c rush00.c -o rush00.o\n",[28,5370,5371],{"__ignoreMap":144},[148,5372,5373,5375,5377,5379,5381,5383,5385,5387],{"class":150,"line":151},[148,5374,4532],{"class":354},[148,5376,4900],{"class":174},[148,5378,4903],{"class":174},[148,5380,4906],{"class":174},[148,5382,4727],{"class":174},[148,5384,4914],{"class":1348},[148,5386,4697],{"class":174},[148,5388,5389],{"class":1348}," rush00.o\n",[15,5391,5392,5393,5395,5396,5398],{},"Si usas ",[28,5394,4646],{}," con los tres archivos, obtienes tres ",[28,5397,4651],{}," y ningún ejecutable. Es\nnormal: todavía falta la etapa 4.",[5026,5400,5402],{"id":5401},"g",[28,5403,5404],{},"-g",[15,5406,5407,5408,5411,5412,5415,5416,5419],{},"Agrega información de depuración (nombres de variables, números de línea) al\nejecutable. No cambia el comportamiento, solo hace el binario más grande y\npermite que ",[28,5409,5410],{},"gdb"," o ",[28,5413,5414],{},"valgrind"," te digan ",[19,5417,5418],{},"en qué línea"," falló.",[139,5421,5423],{"className":4680,"code":5422,"language":4682,"meta":144,"style":144},"gcc -Wall -Wextra -Werror -g main.c ft_putchar.c rush00.c -o rush00\ngdb .\u002Frush00\n",[28,5424,5425,5448],{"__ignoreMap":144},[148,5426,5427,5429,5431,5433,5435,5438,5440,5442,5444,5446],{"class":150,"line":151},[148,5428,4532],{"class":354},[148,5430,4900],{"class":174},[148,5432,4903],{"class":174},[148,5434,4906],{"class":174},[148,5436,5437],{"class":174}," -g",[148,5439,4694],{"class":1348},[148,5441,4911],{"class":1348},[148,5443,4914],{"class":1348},[148,5445,4697],{"class":174},[148,5447,4919],{"class":1348},[148,5449,5450,5452],{"class":150,"line":165},[148,5451,5410],{"class":354},[148,5453,5454],{"class":1348}," .\u002Frush00\n",[15,5456,5457],{},"En la piscina no se usa para entregar, pero sí para entender un crash.",[5026,5459,5461,5464],{"id":5460},"i-ruta-i-mayúscula",[28,5462,5463],{},"-I ruta"," (i mayúscula)",[15,5466,5467,5468,5470,5471,5474,5475,5478,5479,5482],{},"Agrega una carpeta a la búsqueda de ",[28,5469,3776],{},". Si tu header está en\n",[28,5472,5473],{},"includes\u002Fft.h",", escribes ",[28,5476,5477],{},"-I includes"," y después ",[28,5480,5481],{},"#include \"ft.h\"",". En el rush\nno hace falta porque no hay headers propios.",[5026,5484,5486,286,5489,3041],{"id":5485},"stdc99-stdc11-etc",[28,5487,5488],{},"-std=c99",[28,5490,5491],{},"-std=c11",[15,5493,5494],{},"Elige la versión del estándar de C. Cambia qué puedes escribir:",[70,5496,5497,5507],{},[73,5498,5499],{},[76,5500,5501,5504],{},[79,5502,5503],{},"Estándar",[79,5505,5506],{},"Permite",[89,5508,5509,5523,5536],{},[76,5510,5511,5520],{},[94,5512,5513,5516,5517],{},[28,5514,5515],{},"c89"," \u002F ",[28,5518,5519],{},"c90",[94,5521,5522],{},"declarar variables solo al principio del bloque",[76,5524,5525,5530],{},[94,5526,5527],{},[28,5528,5529],{},"c99",[94,5531,5532,5533],{},"declarar en medio del bloque, VLAs, ",[28,5534,5535],{},"\u002F\u002F",[76,5537,5538,5543],{},[94,5539,5540],{},[28,5541,5542],{},"c11",[94,5544,5545,5548],{},[28,5546,5547],{},"_Static_assert",", threads, alineación",[15,5550,5551,5552,5555,5556,5559,5560,5562,5563,5566],{},"La Norm de 42 es de estilo C89, por eso en este proyecto las variables se\ndeclaran arriba. Si compilas con ",[28,5553,5554],{},"-std=c89 -pedantic",", una declaración en medio\nde la función te marca ",[28,5557,5558],{},"ISO C90 forbids mixed declarations and code","; con\n",[28,5561,5488],{}," eso es válido y el warning desaparece. Sin ",[28,5564,5565],{},"-pedantic",", GCC acepta la\ndeclaración igual, como extensión.",[5026,5568,5570],{"id":5569},"fsanitizeaddressundefined",[28,5571,5572],{},"-fsanitize=address,undefined",[15,5574,5575,5576,5579],{},"Instrumenta el binario para ",[19,5577,5578],{},"detectar en ejecución"," lo que el compilador no\npuede ver en compilación: lecturas fuera de un array, uso de memoria liberada,\ndesbordamiento de enteros. Es la herramienta más útil para aprender, porque\nconvierte el \"mi programa imprime basura\" en un mensaje con línea exacta.",[139,5581,5583],{"className":4680,"code":5582,"language":4682,"meta":144,"style":144},"gcc -Wall -Wextra -Werror -g -fsanitize=address,undefined \\\n    main.c ft_putchar.c rush00.c -o rush00_debug\n",[28,5584,5585,5603],{"__ignoreMap":144},[148,5586,5587,5589,5591,5593,5595,5597,5600],{"class":150,"line":151},[148,5588,4532],{"class":354},[148,5590,4900],{"class":174},[148,5592,4903],{"class":174},[148,5594,4906],{"class":174},[148,5596,5437],{"class":174},[148,5598,5599],{"class":174}," -fsanitize=address,undefined",[148,5601,5602],{"class":174}," \\\n",[148,5604,5605,5608,5610,5612,5614],{"class":150,"line":165},[148,5606,5607],{"class":1348},"    main.c",[148,5609,4911],{"class":1348},[148,5611,4914],{"class":1348},[148,5613,4697],{"class":174},[148,5615,5616],{"class":1348}," rush00_debug\n",[15,5618,614,5619,5622],{},[19,5620,5621],{},"no se entrega con sanitizers"," (el binario es distinto y más lento).\nSe usa para investigar.",[5026,5624,5626,286,5629,286,5632],{"id":5625},"o0-o2-o3",[28,5627,5628],{},"-O0",[28,5630,5631],{},"-O2",[28,5633,5634],{},"-O3",[15,5636,5637,5638,5640,5641,5643],{},"Nivel de optimización. ",[28,5639,5628],{}," no optimiza: el binario se parece línea por línea\na tu código, ideal para depurar. ",[28,5642,5631],{}," reordena y elimina cosas para que corra\nmás rápido, y al depurar te marea porque el código ya no coincide con el fuente.",[15,5645,5646,5647,5649],{},"En la piscina: ",[28,5648,5628],{}," (el default) siempre.",[5026,5651,5653,5656],{"id":5652},"lm-y-compañía-para-más-adelante",[28,5654,5655],{},"-lm"," y compañía (para más adelante)",[15,5658,5659,5662,5663,5666,5667,621,5670,5673,5674,5676],{},[28,5660,5661],{},"-l"," enlaza una ",[19,5664,5665],{},"librería",". Ejemplo clásico: si usas ",[28,5668,5669],{},"sqrt",[28,5671,5672],{},"\u003Cmath.h>"," y\ncompilas sin ",[28,5675,5655],{},", el compilador no se queja (el prototipo existe) pero el\nenlazador sí:",[139,5678,5680],{"className":4680,"code":5679,"language":4682,"meta":144,"style":144},"gcc main.c -o prog            # undefined reference to `sqrt'\ngcc main.c -o prog -lm        # funciona\n",[28,5681,5682,5695],{"__ignoreMap":144},[148,5683,5684,5686,5688,5690,5692],{"class":150,"line":151},[148,5685,4532],{"class":354},[148,5687,4694],{"class":1348},[148,5689,4697],{"class":174},[148,5691,5239],{"class":1348},[148,5693,5694],{"class":161},"            # undefined reference to `sqrt'\n",[148,5696,5697,5699,5701,5703,5705,5708],{"class":150,"line":165},[148,5698,4532],{"class":354},[148,5700,4694],{"class":1348},[148,5702,4697],{"class":174},[148,5704,5239],{"class":1348},[148,5706,5707],{"class":174}," -lm",[148,5709,5710],{"class":161},"        # funciona\n",[15,5712,5713,5714,5717,5718,5721,5722,5724],{},"Ese error es la prueba viviente de la diferencia entre ",[19,5715,5716],{},"compilar"," y\n",[19,5719,5720],{},"enlazar",". En el rush no hace falta: ",[28,5723,1142],{}," está en la libc, que se enlaza\nsola.",[5026,5726,5728],{"id":5727},"d-nombrevalor",[28,5729,5730],{},"-D NOMBRE=valor",[15,5732,5733,5734,5737],{},"Define una macro desde la línea de comandos, como si hubieras escrito\n",[28,5735,5736],{},"#define NOMBRE valor"," al principio del archivo. Sirve para activar código de\nprueba sin editar el fuente:",[139,5739,5741],{"className":4680,"code":5740,"language":4682,"meta":144,"style":144},"gcc -DDEBUG=1 main.c -o prog\n",[28,5742,5743],{"__ignoreMap":144},[148,5744,5745,5747,5750,5752,5754],{"class":150,"line":151},[148,5746,4532],{"class":354},[148,5748,5749],{"class":174}," -DDEBUG=1",[148,5751,4694],{"class":1348},[148,5753,4697],{"class":174},[148,5755,5756],{"class":1348}," prog\n",[58,5758,5760],{"id":5759},"cómo-leer-un-mensaje-de-error","Cómo leer un mensaje de error",[139,5762,5765],{"className":5763,"code":5764,"language":724},[722],"rush00.c:23:14: error: 'row' undeclared (first use in this function)\n │        │  │\n │        │  └── columna\n │        └───── línea\n └────────────── archivo\n",[28,5766,5764],{"__ignoreMap":144},[15,5768,5769],{},"Cuatro reglas:",[478,5771,5772,5778,5796,5803],{},[481,5773,5774,5777],{},[19,5775,5776],{},"Lee el primero, no el último."," Un error de sintaxis genera errores en\ncascada: arreglas el primero y desaparecen diez.",[481,5779,5780,5781,5784,5785,5788,5789,5792,5793,5795],{},"La columna (",[28,5782,5783],{},"23:14",") te dice ",[19,5786,5787],{},"dónde","; muchas veces el problema está en la\nlínea ",[19,5790,5791],{},"anterior"," (un ",[28,5794,178],{}," olvidado).",[481,5797,5798,5799,5802],{},"El texto entre corchetes (",[28,5800,5801],{},"[-Wunused-variable]",") es el nombre del warning.\nCon ese nombre puedes buscarlo en la documentación de GCC.",[481,5804,5805,5808,5809,5812,5813,3347],{},[28,5806,5807],{},"error"," detiene la compilación; ",[28,5810,5811],{},"warning"," no (salvo con ",[28,5814,4978],{},[58,5816,5818],{"id":5817},"los-comandos-que-vas-a-usar-de-verdad","Los comandos que vas a usar de verdad",[70,5820,5821,5830],{},[73,5822,5823],{},[76,5824,5825,5827],{},[79,5826,2938],{},[79,5828,5829],{},"Comando",[89,5831,5832,5842,5852,5862],{},[76,5833,5834,5837],{},[94,5835,5836],{},"Compilar y ejecutar",[94,5838,5839],{},[28,5840,5841],{},"gcc -Wall -Wextra -Werror main.c ft_putchar.c rush00.c -o rush00 && .\u002Frush00",[76,5843,5844,5847],{},[94,5845,5846],{},"Solo verificar sintaxis de un archivo",[94,5848,5849],{},[28,5850,5851],{},"gcc -Wall -Wextra -Werror -c rush00.c -o \u002Ftmp\u002Frush00.o",[76,5853,5854,5857],{},[94,5855,5856],{},"Investigar un crash",[94,5858,5859],{},[28,5860,5861],{},"gcc -g -fsanitize=address,undefined main.c ft_putchar.c rush00.c -o debug && .\u002Fdebug",[76,5863,5864,5867],{},[94,5865,5866],{},"Ver el preprocesado",[94,5868,5869],{},[28,5870,5871],{},"gcc -E main.c | less",[15,5873,3139,5874,5877,5878,5881],{},[28,5875,5876],{},"&&"," significa \"si el anterior terminó bien, ejecuta el siguiente\". Si la\ncompilación falla, el programa ",[19,5879,5880],{},"no"," se ejecuta y ves los errores en vez de una\nsalida vieja. Ese detalle evita muchísima confusión: no estás mirando la salida\nde tu código nuevo, estás mirando la del binario anterior.",[58,5883,556],{"id":5884},"dónde-aparece-en-el-rush-6",[15,5886,5887,5888,5893,5894,5896,5897,286,5899,286,5902,5904],{},"En el comando de compilación del ",[24,5889,5891],{"href":5890},"\u002Frush00#compilar-y-ejecutar",[28,5892,30],{},".\nLos tres flags (",[28,5895,4803],{},") son los que usa la piscina; el resto\n(",[28,5898,5404],{},[28,5900,5901],{},"-fsanitize",[28,5903,4646],{},") son herramientas de diagnóstico que vas a necesitar\nen cuanto algo no salga como esperas.",[50,5906],{},[53,5908,5910],{"id":5909},"errores-de-concepto-frecuentes","Errores de concepto frecuentes",[70,5912,5913,5926],{},[73,5914,5915],{},[76,5916,5917,5920,5923],{},[79,5918,5919],{},"Error",[79,5921,5922],{},"Por qué está mal",[79,5924,5925],{},"Cómo se escribe",[89,5927,5928,5942,5958,5972,5986,6001,6016,6031,6042,6056,6073,6088],{},[76,5929,5930,5934,5937],{},[94,5931,5932],{},[28,5933,5072],{},[94,5935,5936],{},"asigna, no compara; y la condición da falso",[94,5938,5939],{},[28,5940,5941],{},"if (x == 0)",[76,5943,5944,5950,5953],{},[94,5945,5946,5949],{},[28,5947,5948],{},"int i;"," y usarla",[94,5951,5952],{},"contiene basura",[94,5954,5955],{},[28,5956,5957],{},"int i; i = 0;",[76,5959,5960,5963,5969],{},[94,5961,5962],{},"contar desde 1",[94,5964,5965,5966],{},"el último índice es ",[28,5967,5968],{},"n - 1",[94,5970,5971],{},"empezar en 0",[76,5973,5974,5979,5982],{},[94,5975,5976],{},[28,5977,5978],{},"while (i \u003C= n)",[94,5980,5981],{},"una vuelta de más",[94,5983,5984],{},[28,5985,4460],{},[76,5987,5988,5993,5995],{},[94,5989,5990,5991],{},"olvidar ",[28,5992,3029],{},[94,5994,2862],{},[94,5996,5997,6000],{},[28,5998,5999],{},"i++;"," en el cuerpo",[76,6002,6003,6008,6011],{},[94,6004,6005],{},[28,6006,6007],{},"char c = \"o\";",[94,6009,6010],{},"string en una caja de un carácter",[94,6012,6013],{},[28,6014,6015],{},"char c = 'o';",[76,6017,6018,6023,6026],{},[94,6019,6020],{},[28,6021,6022],{},"write(1, c, 1)",[94,6024,6025],{},"falta la dirección",[94,6027,6028],{},[28,6029,6030],{},"write(1, &c, 1)",[76,6032,6033,6036,6039],{},[94,6034,6035],{},"cambiar el parámetro y esperar que el original cambie",[94,6037,6038],{},"C pasa copias",[94,6040,6041],{},"devolver el valor o usar puntero",[76,6043,6044,6049,6052],{},[94,6045,6046],{},[28,6047,6048],{},"tablero[columna][fila]",[94,6050,6051],{},"índices invertidos",[94,6053,6054],{},[28,6055,3612],{},[76,6057,6058,6065,6068],{},[94,6059,6060,6061,6064],{},"declarar ",[28,6062,6063],{},"char m[x][y]"," con parámetros",[94,6066,6067],{},"el tamaño debe ser constante",[94,6069,6070,6071],{},"tamaño fijo, VLA o ",[28,6072,4223],{},[76,6074,6075,6081,6084],{},[94,6076,6077,6080],{},[28,6078,6079],{},"exit(0)"," dentro de una función",[94,6082,6083],{},"mata el programa entero",[94,6085,6086],{},[28,6087,1019],{},[76,6089,6090,6095,6098],{},[94,6091,6092,6093],{},"función de 60 líneas con 4 niveles de ",[28,6094,1926],{},[94,6096,6097],{},"no se puede explicar",[94,6099,6100],{},"guard clause + funciones chicas",[50,6102],{},[53,6104,6106],{"id":6105},"cómo-practicar","Cómo practicar",[15,6108,6109],{},"En orden de dificultad. Cada uno se resuelve con lo de arriba y nada más.",[70,6111,6112,6125],{},[73,6113,6114],{},[76,6115,6116,6119,6122],{},[79,6117,6118],{},"#",[79,6120,6121],{},"Ejercicio",[79,6123,6124],{},"Qué practica",[89,6126,6127,6141,6153,6165,6176,6186,6197,6215],{},[76,6128,6129,6131,6138],{},[94,6130,691],{},[94,6132,6133,6134,6137],{},"Imprimir ",[28,6135,6136],{},"#####"," (una fila, sin función auxiliar)",[94,6139,6140],{},"bucle simple",[76,6142,6143,6145,6150],{},[94,6144,972],{},[94,6146,6147,6148],{},"Imprimir 5 filas de ",[28,6149,6118],{},[94,6151,6152],{},"bucle anidado",[76,6154,6155,6157,6162],{},[94,6156,977],{},[94,6158,6159,6160],{},"Imprimir un cuadrado hueco de 5×5 con ",[28,6161,6118],{},[94,6163,6164],{},"condiciones dentro del bucle",[76,6166,6167,6170,6173],{},[94,6168,6169],{},"4",[94,6171,6172],{},"Lo mismo, pero con ancho y alto por parámetro",[94,6174,6175],{},"parámetros",[76,6177,6178,6180,6183],{},[94,6179,3534],{},[94,6181,6182],{},"Extraer el borde a una función propia",[94,6184,6185],{},"subdivisión",[76,6187,6188,6191,6194],{},[94,6189,6190],{},"6",[94,6192,6193],{},"Agregar guard clause para tamaños inválidos",[94,6195,6196],{},"early return",[76,6198,6199,6202,6212],{},[94,6200,6201],{},"7",[94,6203,6204,6205,6208,6209,6211],{},"Llenar una matriz 3×3 con ",[28,6206,6207],{},"X"," en la diagonal y ",[28,6210,330],{}," fuera, después imprimirla",[94,6213,6214],{},"matrices",[76,6216,6217,6220,6226],{},[94,6218,6219],{},"8",[94,6221,6222,6223,6225],{},"Contar cuántas ",[28,6224,4376],{}," tiene tu rectángulo, sin imprimirlo",[94,6227,6228],{},"acumulador + matriz",[15,6230,6231,6232,6235],{},"Del 7 sale un patrón que vas a repetir toda la piscina: ",[28,6233,6234],{},"if (fila == columna)","\nmarca la diagonal principal de cualquier matriz cuadrada. Guárdalo.",[50,6237],{},[53,6239,6241],{"id":6240},"siguiente-paso","Siguiente paso",[15,6243,6244,6245,6249,6250,6253,6254,6256],{},"Vuelve al ",[24,6246,6247],{"href":26},[28,6248,30],{}," y lee la traza de ",[28,6251,6252],{},"rush(5, 3)"," con estos\nconceptos en la cabeza. Si puedes explicar en voz alta por qué la columna 4\nimprime ",[28,6255,4376],{},", ya tienes el ejercicio.",[6258,6259,6260],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .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);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}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}",{"title":144,"searchDepth":165,"depth":165,"links":6262},[6263,6270,6282,6288,6297,6310,6318,6319,6320,6331,6332,6333],{"id":55,"depth":165,"text":56,"children":6264},[6265,6266,6267,6268,6269],{"id":60,"depth":382,"text":61},{"id":219,"depth":382,"text":220},{"id":333,"depth":382,"text":334},{"id":511,"depth":382,"text":512},{"id":555,"depth":382,"text":556},{"id":643,"depth":165,"text":638,"children":6271},[6272,6273,6274,6276,6277,6278,6279,6281],{"id":646,"depth":382,"text":61},{"id":729,"depth":382,"text":730},{"id":788,"depth":382,"text":6275},"void significa dos cosas distintas",{"id":865,"depth":382,"text":866},{"id":1023,"depth":382,"text":1024},{"id":1246,"depth":382,"text":1247},{"id":1398,"depth":382,"text":6280},"static: funciones privadas del archivo",{"id":1450,"depth":382,"text":556},{"id":1471,"depth":165,"text":1472,"children":6283},[6284,6285,6286,6287],{"id":1475,"depth":382,"text":1476},{"id":1892,"depth":382,"text":1893},{"id":1964,"depth":382,"text":1965},{"id":2055,"depth":382,"text":556},{"id":2071,"depth":165,"text":2072,"children":6289},[6290,6291,6292,6293,6295,6296],{"id":2075,"depth":382,"text":61},{"id":2159,"depth":382,"text":2160},{"id":2417,"depth":382,"text":2418},{"id":2481,"depth":382,"text":6294},"return no es exit",{"id":2570,"depth":382,"text":2571},{"id":2622,"depth":382,"text":556},{"id":2672,"depth":165,"text":2673,"children":6298},[6299,6300,6301,6303,6305,6306,6307,6309],{"id":2676,"depth":382,"text":61},{"id":2794,"depth":382,"text":2795},{"id":2870,"depth":382,"text":6302},"Cómo funciona while, paso a paso",{"id":3044,"depth":382,"text":6304},"while y for son lo mismo",{"id":3162,"depth":382,"text":3163},{"id":3305,"depth":382,"text":3306},{"id":3362,"depth":382,"text":6308},"break y continue",{"id":3416,"depth":382,"text":556},{"id":3504,"depth":165,"text":3505,"children":6311},[6312,6313,6314,6315,6316,6317],{"id":3508,"depth":382,"text":3509},{"id":3563,"depth":382,"text":3564},{"id":3654,"depth":382,"text":3655},{"id":3762,"depth":382,"text":3763},{"id":4153,"depth":382,"text":4154},{"id":4227,"depth":382,"text":556},{"id":4259,"depth":165,"text":4260},{"id":4393,"depth":165,"text":4394},{"id":4517,"depth":165,"text":4518,"children":6321},[6322,6323,6324,6326,6327,6328,6329,6330],{"id":4521,"depth":382,"text":4522},{"id":4750,"depth":382,"text":4751},{"id":4834,"depth":382,"text":6325},"Por qué cada .c se compila por separado",{"id":4887,"depth":382,"text":4888},{"id":5023,"depth":382,"text":5024},{"id":5759,"depth":382,"text":5760},{"id":5817,"depth":382,"text":5818},{"id":5884,"depth":382,"text":556},{"id":5909,"depth":165,"text":5910},{"id":6105,"depth":165,"text":6106},{"id":6240,"depth":165,"text":6241},"Variables, funciones, early return, bucles, matrices, char, índices y gcc explicados desde cero.","md",{},"\u002Fconceptos",{"title":5,"description":6334},"conceptos","_oeOh6HrF2efPtW03-UHEOcRJvHypL13Rep4YDcB7ao",1793539815755]