edición general
128 meneos
7043 clics

Los diez mandamientos para programadores en C (edición anotada) [ENG]

Una forma de vida para no sufrir más de lo necesario como programador en C.

| etiquetas: c , mandamientos
  1. Aaaaaaaa la saaaca de favoritos.  media
  2. El acento es importante. No se debe cecear.
  3. 11. Aprende Rust
  4. #3 Buena idea!. Para ir empezando a aprender, ¿me podrías enseñar como implementar una lista doblemente enlazada en Rust? Gracias de antebrazo {0x1f61c}.

    Ps: Es una simple coña/puya.
  5. "Un lenguaje noble, para tiempos más civilizados."
  6. #3 ... no se... pero lo he estado mirando y ahora no tengo tiempo, pero me da la impresion que lo que hace es lo hacia JAVA: no te dejo tener punteros nulos, pero de strangis.

    Pero esto solo digo porque C es mi amor de adolescencia... cuando creci me econie con C++, ... y termine casado con JAVA.
  7. #4 Iba a decir una gilipollecez, pero no la voy a decir... .. que conio, ...RUST no tiene punteros?
  8. #3 Supongo que Carbon en todo caso
    CC #4
  9. #6 ¿Soy el único que hablando de C y viéndote escribir sin la ñ piensa que ncurses molaba más que conio? {0x1f602}
  10. #4
    use std::cell::RefCell;
    use std::rc::Rc;
    type Link<T> = Option<Rc<RefCell<Node<T>>>>;

    struct Node<T> {
    value: T,
    prev: Link<T>,
    next: Link<T>,
    }

    struct DoublyLinkedList<T> {
    head: Link<T>,
    tail: Link<T>,
    }

    impl<T> DoublyLinkedList<T> {
    fn new() -> Self {
    DoublyLinkedList { head: None, tail: None }
    }

    fn append(&mut self, value: T) {
    let new_node = Node {
    value: value,
    prev: None,
    next: None,
    };
    let new_node = Rc::new(RefCell::new(new_node));
    match self.tail.take() {
    Some(old_tail) => {
    old_tail.borrow_mut().next = Some(new_node.clone());
    new_node.borrow_mut().prev = Some(old_tail);
    self.tail = Some(new_node);
    },
    None => {
    self.head = Some(new_node.clone());
    self.tail = Some(new_node);
    }
    }
    }

    fn pop_front(&mut self) -> Option<T> {
    self.head.take().map(|old_head| {
    match old_head.borrow_mut().next.take() {
    Some(new_head) => {
    new_head.borrow_mut().prev.take();
    self.head = Some(new_head);
    },
    None => {
    self.tail.take();
    }
    }
    Rc::try_unwrap(old_head).ok().unwrap().into_inner().value
    })
    }
    }

    :-P
  11. #10 Perdona #4 . No había leído el mandamiento 7:
    Uso de Bibliotecas: Debes estudiar y utilizar las bibliotecas existentes en lugar de reinventarlas sin motivo.

    En rust sería así:

    use std::collections::LinkedList;
    fn main() {
    let mut lista = LinkedList::new();
  12. #11 ¿Seguro que es doblemente enlazada?
  13. #9 dime que has usado Turbo C sin decirme que has usado Turbo C :-)
  14. #9 #13 Y Turbo Pascal. xD

    Borland C++ es "moderno" para mi.
  15. #10 Hola ChatGPT
  16. C es el lenguaje de los machotes. Todo lo demas son mariconadas
  17. #16 eso no se lo dices a Ensamblador en la calle :troll:
  18. #12 Sí:
    doc.rust-lang.org/std/collections/struct.LinkedList.html
    A doubly-linked list with owned nodes.
  19. #7 habla con propiedad, sería "qué conio.h dices" :-D
  20. #6 Lo mismo, yo por el boom de Android.
  21. #6 y el divorcio para cuando?? :troll: :troll:
  22. #11 A esto venia, hay que leer más :-D
  23. #4 Y tu me puedes decir como cambiar una bañera por un plato de ducha? xD
    Mandamiento numero 1. Ves haciendo un curso de fontaneria. :troll:
    El futuro esta en ser fontanero, aun veo muy lejos que un terminator suba a tu casa a cambiarte la cisterna, pero programacion, sysadmin y demas hierbas, vamos a quedar cuatro gatos con la IA, donde antes habian 10, quedaran uno o dos.
  24. #3 Rust es un bluff
  25. #11 Con la ventaja de que la LinkedList de la librería estándar no usa reference counting en vano. Mandamiento 7, hay que seguirlo más.
  26. #4 Por lo que veo es algo imgosible de implementar en Rust.
  27. #6 Java te deja tener punteros nulos, simplemente da error al acceder a uno en tiempo de ejecución.
  28. #10 el resurgir de lisp

    Option<Rc<RefCell<Node<T>>>>
    Option(Rc(RefCell(Node(T)))))))))))))))))))
  29. #23 cualquier informatico puede aprender a cambiar un plato de ducha pero muy pocos fontaneros pueden aprender a programar. Tranquilo, estais muy a salvo.
  30. #17 porque le compila a hostias

    Los hombres de verdad usan tarjetas de cartón, aguja y pulso firme.
  31. #14 Hoy en día sería más bien Electric Pascal o eHybrid Pascal xD
  32. #32 Los hombres de verdad usan mariposas. Las liberan y dejan que éstas aleteen delicadamente, creando perturbaciones que acaban modificando los flujos de aire de la atmósfera superior, creando bolsas momentáneas de aire a alta presión, que actúan como lentes que deflectan los rayos cósmicos y los enfocan hacia un disco duro magnético para cambiar los bits deseados.
  33. #30 Tengo astigmatismo. Lisp es ilegible para mí.
    ...y para tí también :)
  34. #31 Se ve que no frecuentas a muchos informáticos.
  35. #26 Y cuál sí usa reference counting en vano y pa qué?
  36. #23 "Vamos a quedar cuatro gatos" :troll:
  37. Como la vida misma :troll:  media
  38. #24 Entonces me puedo ahorrar el aprendérmelo? Casi parecía como si ahora estar en C++ y no perder el culo en aprender Rust es como uh, adiós trabajo como cuando te lo quita la IA.
  39. #34 Al final eso que dices no deja de ser un lenguaje de alto nivel, aunque sea con mariposas y elementos físicos. Así que ese método está por encima de C.

    cc #32
  40. #36 de hecho trabajo codo a codo con ellos todos los días y alguna vez he tenido que escribir algo en Python con su consecuente review destructora xD
  41. #42 ¿Y en serio crees que cualquier informático podría cambiar un plato de ducha? No es esa la experiencia que yo tengo con mis compañeros de carrera y de trabajo. Ha llegado un punto en que la mayoría ni cambiar un disco duro.
  42. #40 Rust no sirve para sustituir a C++.

    No es más que un C para acojonaos.
  43. #43 "cualquier informatico puede aprender a cambiar un plato de ducha"

    Los profesionales de la informatica tienen que lidiar con aprender cosas que no saben hacer todos los putos dias de su vida.
  44. #34 bits? pero aún con programación digital? pasate a la computación analógica!
  45. #45 Lo sé, soy uno de esos profesionales. Y sigo creyendo que no funcionaría. Cuando una persona lleva años haciendo trabajo de oficina es muy complicado que se pueda adaptar a hacer trabajos "sucios". Además con una importante rebaja de sueldo y empezando por abajo. Eso y que el perfil del informático medio es más bien introvertido... No lo veo.
    Ni siquiera en mi caso me atrevería a hacer una excepción, y eso que me pasé toda la adolescencia ayudando a mi padre en la obra. Pienso en volver a trabajar asado en verano, helado en invierno, con la piel cuarteada del frio, el calor y el polvo de cemento, rodeado de compañeros prácticamente analfabetos que solo hablan de mujeres y fútbol y me entra ansiedad. Antes solicito un IMV y me pongo a pan y agua.
  46. #6 Java "parece que no tiene punteros" precisamente porque todo son punteros.... xD xD xD xD xD
  47. #30 a mi es que me da risa
  48. Intente volverme bueno en C, pero despues de leer código en C decidí esperar a los ordenadores cuánticos.
  49. #37 El ejemplo del meneante, usa Rc para que el compilador no se queje de que los nodos puedan quedar huérfanos al modificar la lista.
  50. #50 Pues el código C es fácil de leer a no ser que lo hagas difícil queriendo. La sintaxis de la mayoría de lenguajes está cogida de C y desde luego la obligación de declarar variables justo después de inicio de bloque es un acierto.
  51. #48 En Java todo son variables por referencia aka punteros?

    Así que es como Python, que también las variables son por referencia/punteros. Y si no lo sabes, la puedes liar parda y tener comportamientos raros. Es lo que me he encontrado con novatos de programación y al manejar listas les pasaban "cosas raras".
  52. #53 En Java todo son variables por referencia aka punteros?

    Si, salvo los tipos primitivos que son completamente innecesarios y existen solo por eficiencia.
  53. #52 Depende a mi siempre se me hace duro leer el código basado en C. Lo entiendo, pero no sé, tiene algo que no me gusta y hace que me cueste mucho acabar de cogerle el punto y que pueda hacer lo mismo que hago con otros lenguajes de programación.
  54. #55 Pues salvo los punteros (que son importantísimos por otra parte) el resto no se diferencia demasiado de un programa en PHP o Java....

    El aspecto, me refiero.
  55. #54 Pero supongo que ocurrirá lo mismo que en Python, y por ejemplo una variable inmutable, tipo entero, si haces algo así:
    A=8
    B=A
    A=10

    Resultado:
    A=10
    B=8

    Per suponiendo que pudieras hacer algo así con arrays (obviamos las declaraciones necesarias)
    A= ["a","d"]
    B=A
    A=["a","C"]

    Resultado:
    A=["a","C"]
    B=["a","C"]

    ¿verdad? O no podrías hacer esas operaciones en Java de manera tan fácil?
  56. #56 Ya, yo hablaba en general. Java, PHP o Javascript tampoco me acaban de entrar. Sobre todo Java. PHP lo acabé usando y dominando más o menos.

    Supongo que si me pusiera lo podría entender y hacer cosillas. Pero, me cuesta. Y hoy en día no tengo nada que me lleve a aprenderlos.

    Y si tuviera que aprender algo relacionado con C, sería C++ que podría tener cierta utilidad práctica para mi en el trabajo.

    O si hiciera bibliotecas Python y tuviera que crear código en C para Python. Pero no creo que nunca me haga falta llegar a ese nivel. Y no tengo nivel para hacerlo.
  57. #57 Claro. Pero a lo que tu te refieres es a objetos inmutables, no a variables inmutables.

    En tu caso, ni A ni B son inmutables. El objeto 10 y el objeto 8, en cambio, si lo son.
    Cuando haces A=10 lo que estás haciendo es cambiar la referencia que había en A (que apuntaba al objeto 8-D al objeto 10.

    Todo eso suponiendo que el entero 8 y el entero 10 son objetos. Normalmente por eficiencia no es así.

    El segundo caso que expones es similar y tu suposición sobre el resultado es errónea. Cuando haces A=[.... estás cambiando la referencia que hay en A, y ya no es la misma referencia que B.

    Otra cosa es que cambies el objeto referenciado por A y B.

    Espero que se entienda la chapa...xD xD

    En Java, es igual. Solo cambia el modo de expresarlo ligeramente (java no tiene las listas integradas en el lenguaje)
  58. #43 Cualquiera puede aprender a cambiar un plato de ducha si realmente necesita hacerlo. Pero los que se dedican a cambiar platos de ducha no creo que puedan aprender a programar en condiciones.

    Tus compañeros de carrera y trabajo no saben un disco duro porque no lo necesitan y porque pueden pagar a alguien para hacerlo. Tu pagas para que alguien te haga el pan, esso no significa que no puedas aprender a hacerlo en 1 dia.
  59. Creo que los que os debatís por aquí estáis más cercanos de la jubilación que de ser juniors en algún sitio :-D xD :troll:
  60. #60 Cuanto desprecio por el saber hacer ajeno. ¿De verdad crees que mi primer pan saldría igual de rico que el de un panadero que lleva toda la vida haciendo pan? ¿Que mi primer plato de ducha no estaría torcido ni tendría fugas? Y por otra parte, a programar puede aprender cualquiera con un CI por encima de 85 en un par de semanas. A programar bien... Eso es otra historia.

    Y aquí no hablamos de poner un plato de ducha como hobby, sino como empleo. Poner un par de docenas de platos de ducha cada semana si uno quiere comer. ¿En serio piensas que los oficinistas que llevamos trabajando sentados toda la vida aguantaríamos ese ritmo? Mucho wishful thinking veo yo ahí.
  61. #6 null pointer assignment
  62. #62 si es muy facil. Con practica y con un mindset de ingeniero no es que puedas, es que seguro que lo vas a hacer mejor y mas eficientemente que el que lleva toda la vida. En unas semanas puedes estar vendiendo pan y poniendo platos de ducha sin problema (spoiler: los obreros profesionales hacen chapuzas y ponen platos de obra torcidos y con fugas)

    Pero ningun albañil o panadero podria escribir un codigo que vaya a producion en semanas. Es totalmente imposible. Solo un pequeño porcentaje podria despues de años de estudio y practica pero para la mayoria seria algo imposible.
  63. #64 La prepotencia es fuerte en tí.

    En fin, creo que no nos vamos a poner de acuerdo. Que tengas buena tarde.
  64. #0 Ese panfletillo hereje no vale un duro. Las verdaderas Sagradas Escrituras del C son estas:

    gustedt.gitlabpages.inria.fr/modern-c/
  65. #39: Tienes Python 3, copiaste el código a Menéame y perdiste la indentación, así que ya no tienes código. :-D #Python_no_gracias
  66. #14 lo puntero ahora es visual COBOL...hace cuánto no oía/leía borland c++...remember en toda regla
  67. #32 Yo he usado tarjetas de cartón y una aguja para perforarlas, pero no para programar, solo para duplicar alguna estropeada. Y no soy un hombre de verdad, solo un yayo mirando meneame.
  68. #69 yayo no te sulfures, que solo es un meme de informaticos.  media
  69. 1. Amarás a C sobre todas las cosas.
    2. No tomarás el nombre de una variable en vano.
    3. Santificarás las listas.
    4. Honrarás a Dennis Ritchie.
    5. No matarás procesos zombis.
    6. No cometerás actos impuros (violación del segmento).
    7. No robarás código sin licencia.
    8. No harás falsas declaraciones de variables.
    9. No consentirás pensamientos ni deseos impuros. (Programar en otro lenguaje)
    10. No codiciarás el código ajeno.
  70. #68 Pues... mas MFC... que eran mejor que programar windos a lo cafre con la API, y mirarte lo de lo de llamar a funciones en win32 a base de poner segmentos de memoria y todo eso....DIOS!!! como difrute esa clase, pero que mal lo pase para hace un puto notepad. Ese bucle de eventos con 50 case dependiento de si habian movido el raton o le habian dado con la poila al teclado!!!! :-D
  71. #48 #53 Pero hace 30 anios nos lo vendieron con que "no habia punteros ya"... habia referencias que eran lo mismo, pero no podias modificarles (sumar cosas a punteros o asignarlas).
  72. #28 Es que JAVA nos lo vendieron hace 30 anios con "no hay punteros"... pero luego si los habia.

    Igual que lo de es multiplataforma... si, pero no multiversion. La de ostias que habia en los 1999-2005 por esos errores de que no existia le metodo porque lo habian quitado de una version a otra.

    Y luego el noclassdeffound de los cojones... que todo el mundo se quedaba a cuadros y es un error del linker. Pero la gente que no habia linkado codigo no sabian de que estabas hablando. A partir de ... alrededor del 2007, habia gente que no sabia que era linkar el codigo y se quedaban anodado/as cuando les explicabas que habia fallado el linker: la definicion estaba ahi, pero la biblioteca no la tenia. En C o C++ era normal, en JAVA no es tan normal, pero cuando pasa es un: " EIHN!!?!?!?!?!?"
  73. #21 Pues JAVA se me ha divorciado hace 2 anios y quiere su distancia (ahora soy SRE) y yo tamben, pero Python y Data Science es mi nuevo amor de senectud. Aunque RUST me esta haciendo morritos, pero su padre es un puto mafioso (Microsoft) que no me da nada de confianza.
  74. #20 Yo aprendi android, ... y ... no se ... a ver que que los moviles son ordenadores muy pequenios... . Estaba muy bien eso de aprender esas gilipolleces, esos frameworks, ... pero ... cualquier persona que quiere que un puto cahcarro que le cabe en la mano, vaya a hacer lo mismo que mi desktop que tiene un huevo de poder, es que es gilipollas.
  75. #19 ... he he... has dicho conio.h... he he... :-D

    El dia que le tuve que decir a un angloparlante lo que significaba... el tio casi se mea de la risa.
  76. #73 ¿?
    Un puntero y una referencia son exactamente lo mismo. Y claro que puedes modificar tanto la referencia que almacena la variable como el contenido de la información referenciada (salvo las "constantes", claro)
  77. #72 Ese bucle de eventos con 50 case

    Joer, casi vómito. No me recuerdes eso
  78. #76 Un móvil de hoy con Android es mucho más potente que un Desktop de hace 15 años.
  79. #74 Te cuento un secreto: Todos los lenguajes tienen punteros. Son imprescindibles, sin ellos por ejemplo no habría llamadas por referencia.
  80. #74 Es que JAVA nos lo vendieron hace 30 anios con "no hay punteros"

    Pero si en Java todo son punteros. Salvo los tipos básicos todo lo demás, hasta los arrays, son punteros. No es posible pasar argumentos por valor, y no existen los punteros siempre válidos como las referencias en C++ o Pascal. El problema llega hasta tal punto que existen métodos en la librería estándar para validar argumentos en los constructores[1] de lo habitual que es ese boilerplate, porque no hay forma de indicar al lenguaje que no acepte argumentos nulos.

    [1] docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Objects
  81. #56 Ya, luego coges un código C lleno de macros y directivas de preprocesador y no dirás lo mismo.
  82. #80 solo si compras un móvil caro, los normales no tanto...
    Y como bien dices, un móvil (caro) es como tener un ordenador viejo de cojones.

    De todas formas, l la limitación de un móvil no es el hardware desde mi punto de vista, es el software. No puedes meter sistemas operativos a tu antojo, no puedes tener sistemas virtualizados, el control de red es una mierda, la interfaz usuario máquina es incomodísima para crear contenido...

    Cómo herramienta de consumo de información y cámara de fotos/video. Genial, eso sí. Yo no podría vivir ya con un móvil tonto sin echar de menos todo lo que puedo consultar y consumir con uno inteligente. Pero a los que nos gusta crear, un móvil se nos queda muy manco sin un sobremesa o portátil de compañero inseparable
  83. #84 Si entiendes 200€ por "móvil caro", si.

    En el resto tienes razón. El problema es el software.

    La.UE debería legislar de modo que asegure que nuestros móviles son realmente nuestros.
  84. #85 el mío es de 200€ y no es tan potente :-( (tampoco es nuevo xD)
    Me puedes dar alguna recomendación de ese precio?
  85. #82 Nooooo... el marketing en el 95-97 era que "no habia punteros" ... cuando nos vimos el "null pointer" entonces nos dimos cuenta que que era todo marketing.

    Los llamaban "referencias".
  86. #81 :-S Really?

    :-D Me acuerdo de mi profesor de lenguaje Ensamblador y Fortran:
    -Ensamblador de la 370: "no la cagauies, cuando corrais incluso un programa de los de ejercicio de la clase, teneis que poner las instrucciones de cambio de rutina al principio, porque si no el sistema no sabra desde donde os ha llamado y os habeis cargado el maiframe de la universidad." Basicamente guardar el puntero desde donde te iban a llamar a tu programa.
    -Fortran: "El ejercicio 7 es sacar la direccion del programa, a partir de una funcion.". Basicamente ire para atras en la pila.

    Eso eran los punteros a funciones y programas.
  87. #79 Yo tambien tengo pesadillas.... :-D No se ni donde tengo el codigo de ese clase: Windows Programming... lo que si se es que en el 90-91 por alguna razon, empezaron a traer al kiosco de mi barrio la revista "Microsoft Programmer Journal" que te contaba todo eso, y me sirvio para mi clase de Windows Programming en el 96.

    Pero ... Motif... eso si que es para superheroes... Motif es ... para "Real Programmers don't quiche".... . La madre que los pario.
  88. #78 Joder... son y no son, el putero puedes asignarlo y hacer tu +1, pero una referencia no puedes cambiarla. Eso es lo que nos vendieron con JAVA.
  89. #90 Claro que puedes cambiarla. Por ejemplo:

    Object x=null;
    x=new ArrayList();
    x=new Ladrillo()

    Lo que no puedes hacer es poner "un número" en una referencia. Cosas del tipado fuerte.
  90. #89 Si. La "programación dura" en X es otra cosa... xD xD xD

    Es el assembler de.los GUI
  91. #88 Je, que tiempos.

    512M de RAM para 20 tíos y una potencia de proceso menor a la de un Pentium (que no existía)
  92. #92 Joder, ... yo iba a hacer un compilador para un sistema en tiempo real de un profesor, ... y despues de 20 semanas, mi colega y yo lo dejamos.

    Vaya cipostio. Menos mal que luego con GNome y KDE la cosa no estaba tan mal.
  93. #25 ME-LA-PE-LA xD xD xD
comentarios cerrados

menéame