[TUTORIAL] Programando en C

15, 6, 7, 8, 9
Analiza el código XD

#include <stdio.h>

int main()
{
  float km, euros;
  float kmr; // kilometros recorridos
  float kmtR; // kilometros totales recorridos
  float kmT = 0, eurosT = 0; // contadores para los km y los euros

  while (km != -1)
  {
   printf("Introduce los kilometros [-1 para terminar] =>");
   scanf("%f", &km);
   getchar();
   kmT += km;
   
    if (km != -1)
        {
          printf("Introduce Precio en Euros del Gasoleo =>");
          scanf("%f", &euros);
          getchar();
          eurosT += euros; 

           kmr = km / euros;
   
           printf("Los kilometros recorridos por cada euro fue de = %.2fkm\n", kmr);
           
           kmtR =  kmT / eurosT;
          }// fin del if
    } //fin del while
   printf("Los Kilometros Totales recorridos  por el total de  depositos fue = %.2fkm\n", kmtR);
   return 0;
}
cltomas escribió:Analiza el código XD

#include <stdio.h>

int main()
{
  float km, euros;
  float kmr; // kilometros recorridos
  float kmtR; // kilometros totales recorridos
  float kmT = 0, eurosT = 0; // contadores para los km y los euros

  while (km != -1)
  {
   printf("Introduce los kilometros [-1 para terminar] =>");
   scanf("%f", &km);
   getchar();
   kmT += km;
   
    if (km != -1)
        {
          printf("Introduce Precio en Euros del Gasoleo =>");
          scanf("%f", &euros);
          getchar();
          eurosT += euros; 

           kmr = km / euros;
   
           printf("Los kilometros recorridos por cada euro fue de = %.2fkm\n", kmr);
           
           kmtR =  kmT / eurosT;
          }// fin del if
    } //fin del while
   printf("Los Kilometros Totales recorridos  por el total de  depositos fue = %.2fkm\n", kmtR);
   return 0;
}

muchisimas gracias :D lo unico una pequeña duda tonta... la linea getchar() la utilizas despues de cada scanf y eso? porque?¿
Estabas mezclando tipos diferentes, el getchar es para que se pare, también valdría un system("pause")
system("pause")

Eso es válido solo para Windows, yo en Debian utilizo getchar( ), para la pausa..saludos...
(mensaje borrado)
Nada blipi. Como te dije, abandoné mi proyecto de una shell pero a cambio he adquirido muchísimos mas conocimientos. Creo que ahora podría retomarlo y terminarlo. En cualquier caso ya he subido mi primera App a la App Store y está pendiente de aprobación. La segunda aún la estoy terminando. Tu ayuda y tus consejos me han servido de mucho a la hora de optimizar el código y estructurarlo. Si finalmente aceptan mi App me gustaría que la probaras. Es un reloj binario. La pondré gratis una semana para hacer promoción así que aprovecha esa semana jeje. Ya te daré detalles de como descargarla cuando sepa si es admitida o no. Un saludo gente!
jajaj avisame avisame, que quiero verla =P (sobretodo cuando sea gratis xd)
Me he leído el principio del primer post y tal. Me parece perfecto todo esto, pero tengo una absurda pregunta.... ¿que hace un tutorial de programación en C aquí en los foros de PS3? ¬_¬
Porque la PS3 se programa en C y C++. Y se pueden hacer programas en C y C++ compilando con ps3l1ght.
Pues ya esta blipi, he fijado la fecha de lanzamiento para mañana así que deberia aparecer en la store. De todos modos tendré que ponerla gratis cuando esté colgada así que te avisare entonces xD. Cuando te diga el nombre de mi empresa para que la busques igual te ries jajaja. Un saludo a todos!

Edit: blipi, ya está en la App Store, cuesta 0,79€ pero como me caes bien te mando un código de promo jeje. A ver que te parece, tengo pendiente algunas mejoras pero las criticas vienen bien [oki] . Te dejo el código por MP.
Gracias Blipi, por el estupendo tuto!
hoygan y en la ps3 como va el tratamiendo de ficheros? igual que en un ordenador? ahora estoy con el tema del hashing y menuda liada u.u
Muchas gracias tio yo stoy studiando ingeniera informatica i stoy viendo C ahora y este tutorial me ha sido de mucha ayuda :)
Muchas gracias tio, de lo mejorcito que he visto por ahí. A ver si me ayuda a aprobar FP de una puta vez XD
Muy buena iniciativa sé algo de C pero macho hay cosas que tela
[360º] Si os animáis hago uno de C++ orientado a objetos

Edito: Ya está disponible la introducción en hilo_tutorial-programacion-orientada-a-objetos-con-c_1617110
pos dale cañana siempre viene bien :)
Adelaiglesia escribió:[360º] Si os animáis hago uno de C++ orientado a objetos

Ok, gracias ;)
una cosa, que significa que vaya orientado a objetos y que tipos de "orientaciones" hay? XD
@Adelaiglesia
Pues iría perfecto que hicieras un tuto de C++ (OOP).

@Notakas
Dentro de las muchas clasificaciones de los lenguajes de programación, porque hay más de la típica objetos/estructuras, existe esta.
Sería muy difícil darte una definición exacta, y más sin recurrir a conceptos técnicos, pero vamos a intentarlo. La OOP (Objected Oriented Programming) viene dada justo por el uso de los objetos. Un objeto es un elemento que consta de una estructura, unos métodos (o funciones) y unas instancias (o variables). Tales objetos son la base de todo OOP. Que más se puede decir... así sin recurrir a mucha jerga técnica...
En C++ por ejemplo los objetos son las famosas "class" (clases). Otros conceptos que vienen implicitos en los OOP son la sobrecarga de operadores, las template, herencias, y más cosas un poco más difíciles de explicar.

Entonces, C, por ejemplo, que es. Hablar en terminos de "lenguaje orientado a estructuras" no es exactamente correcto, puesto que eso no existe. Quizás cuando se habla en estos terminos se refiere a que el lenguaje "no dispone de OOP", sino que el peso de su funcionamiento reside en llamadas a variables y funciones. También puede venir este nombre del hecho de que en C existen las llamadas "struct" (estructuras), que a groso modo son agrupaciones de variables en una misma región de memoria. El método de trabajo de una estructura es muy diferente al de un objeto, ya que para empezar las estructuras no aceptan métodos (aunque, sin entrar mucho en detalle en ello, si aceptan punteros a funciones).
Además de que todo lenguaje no OOP no dispone de las herramientas de sobrecarga de operadores, templates y demás.

A nivel de código... la mayoría de lenguajes OOP pueden trabajar como simples lenguajes no OOP (y digo la mayoría debido a que en algunos el propio módulo principal que se ejecuta es un objeto, ej.: Java). Un lenguaje no OOP no podrá nunca actuar como un OOP.

Si alguien sabe explicarlo mejor, por favor que lo haga, porqué yo, sin entrar en términos técnicos, no doy más ajaj


@TODOS
Se que hace mucho que no actualizo el tuto, pero he estado un mes enfermo, y ahora estoy de examenes globales, la siguiente semana de finales, y de aquí un par o 3 de semanas la selectividad. Así que no se hasta que punto podré tener actualizado el tuto durante este mes. Sry

Salu2!
Una cosa que se le puede añadir a la explicación de Blipi y que creo que puede aclarar un poco el concepto de OOP es lo siguiente:

En un lenguaje orientado a objetos podemos crear una objeto "PERSONA" que tenga métodos (parecidos a funciones en C) como por ejemplo "ponerNombre", "ponerEdad", "hacerLaCompra" y que estos métodos puedan interactuar con nuestro programa y con el usuario en sí.

Podemos crear objetos de lo que sea, como por ejemplo Perro, que tenga metodos de "ladrar", "caminar", "pasear".

Sin embargo, C, no dispone de esta manera de interactuar.

Espero haber aclarado un poquillo más el tema.
blipi escribió:@Adelaiglesia
Pues iría perfecto que hicieras un tuto de C++ (OOP).


Con tu permiso empiezo a ello!
No se podria hacer una referencia a este tema en la seccion de PC?
creo que a muchos les vendria bien ;)
Vaya currada de tutorial. Hace algún tiempo aprendí algo de C++ en la universidad, y aunque fue una cosa muy básica siempre me quedé con las ganas de aprender un poco mas. Con tu tutorial estoy recordando todo lo que sabía. Mu buen trabajo.
para programar para ps3 no ahce falta un nivelazo de c++ y cosas chungas?
es que para pc es muy "facil", pero para la xbox360 por ejemplo para cargar un ejecutable o un Hello World son 50 o 60 lineas de codigo... xD aqui es lo mismo?
JohnCrichton escribió:para programar para ps3 no ahce falta un nivelazo de c++ y cosas chungas?
es que para pc es muy "facil", pero para la xbox360 por ejemplo para cargar un ejecutable o un Hello World son 50 o 60 lineas de codigo... xD aqui es lo mismo?

Tendria que ser hasta mas complicado, Microsoft provee herramientas para programar en XBOX, como el framework XNA (Es practicamente lo mismo que programar en Windows).
[tadoramo] El mejor tutorial de C que he visto en mi vida.

Saludos!~
Se que hace tiempo que no actualizo el tuto, pero en unas semanitas tengo la selctividad, y bueno, digamos que no le puedo dedicar mucho tiempo a estas cosas.
De todas formas, siempre que puedo me paso, y si veo alguna duda la intento resolver.

Salu2!
Muy currado y muy bien explicado, asi da gusto :P
Felicidades! muy buen trabajo
Uno de los mejores tutos de C sin duda!
blipi escribió:Se que hace tiempo que no actualizo el tuto, pero en unas semanitas tengo la selctividad, y bueno, digamos que no le puedo dedicar mucho tiempo a estas cosas.
De todas formas, siempre que puedo me paso, y si veo alguna duda la intento resolver.

Salu2!



Suerte con tu selectividad, ¿que ya fue no? Espero que no tuvieras ejercicios de quimica ;)


Enhorabuena por el tutorial
No, aquí en catalunya (como en no se que otra comunidad) se hacen del 15 al 17. Es decir, acabo mañana.
Y química, por suerte, no me examino jaja, pero bueno, que tengo matemáticas y física xd

Salu2!
Felicidades por el tutorial, muy bien explicado todo. [beer]
hola buenas,

mi problema es el siguiente, y es que despues de descargarlo todo, me sale un cuadro de error en que dice que no me ha instalado nada.

alguién puede ayudarme¿?
gracias saludos!!
Muchos te han felicitado, yo no. Este tutorial es una pérdida de tiempo. Enseñas a utilizar una instrucción de memoria dinámica con todos los problemas que puede acarrear. Deberías añadir el uso de los frees.
También te falta la definición de structs, y porqué no, los problemas de alineación en la memoria que por otro lado en Windows y Linux los datos están alineados en diferentes posiciones.

Esto así de buenas a primeras y el primer vistazo que le he hecho. Programar no es saber la sintaxis de un lenguaje de programación.

A los que se quieran iniciar en el mundo de la programación les recomiendo lenguajes más sencillos que no necesiten tener muy en mente la arquitectura sobre la que se trabaja o si queréis empezar con C olvidad este tutorial. Cualquier tutorial introductorio que trate temas como memoria dinámica o punteros simple y llanamente está mal, eso sin contar que faltan explicaciones de estilos y formatos de escribir código según diversos estándares (tabuladores, espacios, 2, 4 u 8, etcétera) por lo que esto es pasto para crear malas prácticas y código no espaghetti pero igualmente ilegible.
No te voy a negar que no tengas parte de razón. Pero, comprenderás que en ningún momento se ha dicho que aquí se vayan a formar expertos en programación. Si a alguien le gusta la programación, aprenderá esto y mucho más.

Hoy en día, en ordenador modernos, la posibilidad de que usando memoria dinámicas toques algo fuera de normal Y ocurra un error grave, son bastante pequeñas. Supongo que conocerás de las existencia de los VEH y SEH, que funcionan a más de nivel y previenen de lecturas/escrituras en out of range. Si realmente alguien, usando este tutorial, consigue cargarse su ordenador por mal uso de la memoria, le doy un premio.
El uso de free, sí, es verdad, es un fallo mio no haberlo comentado. Pero bien sabrás que a menos que vayas a hacer un programa muy grande y lo hagas muy mal, no te vas a quedar sin memoria. Como bien he comentado en el tutorial, las declaraciones dinámicas de memoria no deben usarse en exceso, y en todo caso se debe usar memset para resetear memoria que ya no están en uso.

También sabrás que el tutorial no está acabado, y las struct siquiera he llegado a ellas, normal que no estén definidas =)

Alineación de memoria... Un buen tema, que, sin embargo, no considero que esté al alcance de nadie que fuera a leer este tutorial. Del mismo modo, a no ser que hagas un gran proyecto, no te preocuparás por ello.

Yo no me preocuparía mucho por los estánderes, un compilador decente no tendrá ningún problema hoy en día. Lo mismo va con las tabulaciones y espacios.
En el tutorial ya se comenta, y a cada persona que postea código para revisar se lo recuerdo, el uso de las tabulaciones para una buena lectura. A menos que se dediquen a ignorar el tutorial por completo, muchas malas costumbres no se pueden coger.

El punto en que quizás más de acuerdo estoy contigo es en el hecho de enseñar "uso de memoria". Pero, como comento en el tutorial, solo hace falta saber que es un puntero para poder progresar (en TODOS y cada uno de los tutoriales para aprender C, eso es un paso obligatorio). La información adicional que doy sobre memoria no es, evidentemente, obligatoria para progresar en un aprendizaje normal. Pero, yo, por ejemplo, si estuviera siguiendo un tutorial, querría que me dieran cuanta más información posible.

Finalmente, tal y como empieza el tutorial "C, como cualquier otro lenguaje de programación no requiere más que tiempo, una cabeza y mucha paciencia", y "Empezar a programar en C puede ser algo muy bueno o muy malo. C es un lenguaje que, si no te lo tomas con calma y te lo relees todo hasta entenderlo, no puedes continuar avanzado, este tutorial está pensado para ir progresando poco a poco", y para acabar "Es decir, empezar con este tutorial sin ánimos, a desganas, o con la creencia de que no aprenderéis nada, será contraproducente".
Dicho esto, yo aprendí a programar en VB, luego PHP y luego C. Sin embargo, VB ya no lo utilizo para nada, es más, en VB (que es mucho pero que mucho más fácil que C) es donde se cogen muchas más malas costumbres. En proporción con C, en VB se cogen muchísimas más malas costumbres.


En fin, muchas gracias por la opinión, pero espero comprendas que el estilo y "programa" del tutorial no va a variar.
Salu2!
blipi escribió:No te voy a negar que no tengas parte de razón. Pero, comprenderás que en ningún momento se ha dicho que aquí se vayan a formar expertos en programación. Si a alguien le gusta la programación, aprenderá esto y mucho más.

Pero mejor empezar aprendiendo bien que mal, y precisamente como se va a aprender más lo aquí explicado se puede obviar completamente y buscas algo donde se expliquen las cosas correctamente.

Hoy en día, en ordenador modernos, la posibilidad de que usando memoria dinámicas toques algo fuera de normal Y ocurra un error grave, son bastante pequeñas. Supongo que conocerás de las existencia de los VEH y SEH, que funcionan a más de nivel y previenen de lecturas/escrituras en out of range. Si realmente alguien, usando este tutorial, consigue cargarse su ordenador por mal uso de la memoria, le doy un premio.

No es por tocar algo que haga peligrar el sistema, es por poner cosas que no tocan. Por otro lado VEH y SEH es algo exclusivo de Microsoft y su Windows. Ese es otro punto, alientas al C de Windows como por ejemplo con las macros BYTE, WORD y DWORD (te faltaría la QWORD).

El uso de free, sí, es verdad, es un fallo mio no haberlo comentado. Pero bien sabrás que a menos que vayas a hacer un programa muy grande y lo hagas muy mal, no te vas a quedar sin memoria. Como bien he comentado en el tutorial, las declaraciones dinámicas de memoria no deben usarse en exceso, y en todo caso se debe usar memset para resetear memoria que ya no están en uso.

Explicación corta y básica: Memset inicializa una región de memoria al valor que uno quiera, pero eso no significa que libere del heap esa memoria reservada previamente con un malloc. Para liberar realmente el heap y deje de contar esa memoria como ocupada hay que utilizar free dado que C/C++ no tienen recolección de basura. Si no utilizas free lo único que haces es ir llenando el área de heap y perdiendo las referencias a la memoria ocupada y por tanto terminas con pérdida de memoria. Todo esto evidentemente es si no estás implementando tu propia función free, para lo cual tienes que encargarte tú mismo del punto, su referencia, etcétera y para ello entre otras cosas utilizas memset.

Teniendo en cuenta el supuesto nivel introductorio de este tutorial, pues creo que es un fallo bastante gordo, si es que de verdad se pretende enseñar algo útil y no lo primero que se le viene a uno a la cabeza.

También sabrás que el tutorial no está acabado, y las struct siquiera he llegado a ellas, normal que no estén definidas =)

Las structs son tipos básicos y deberían estar explicados al principio junto con los enum y demás.

Alineación de memoria... Un buen tema, que, sin embargo, no considero que esté al alcance de nadie que fuera a leer este tutorial. Del mismo modo, a no ser que hagas un gran proyecto, no te preocuparás por ello.

¿La alineación de memoria no está al alcance del público al que va dirigido el tutorial pero sí lo está la memoria dinámica (mal explicada)?
Aquí no hablamos de pequeños o grandes proyectos. Aquí hablamos de dar buenas directrices de aprendizaje. Hacer una mezcla de aquí y allá no es útil y termina siendo una pérdida de tiempo.

Yo no me preocuparía mucho por los estánderes, un compilador decente no tendrá ningún problema hoy en día. Lo mismo va con las tabulaciones y espacios.
En el tutorial ya se comenta, y a cada persona que postea código para revisar se lo recuerdo, el uso de las tabulaciones para una buena lectura. A menos que se dediquen a ignorar el tutorial por completo, muchas malas costumbres no se pueden coger.

Hombre, está claro, puedes escribir como te dé la gana. Siempre que pongas un punto y coma después de cada instrucción el compilador no tendrá problemas. Pero hay un estándar ISO que se debe respetar y unos estilos de escritura que también deben ser respetados.

El punto en que quizás más de acuerdo estoy contigo es en el hecho de enseñar "uso de memoria". Pero, como comento en el tutorial, solo hace falta saber que es un puntero para poder progresar (en TODOS y cada uno de los tutoriales para aprender C, eso es un paso obligatorio). La información adicional que doy sobre memoria no es, evidentemente, obligatoria para progresar en un aprendizaje normal. Pero, yo, por ejemplo, si estuviera siguiendo un tutorial, querría que me dieran cuanta más información posible.

Sí, en todos y cada uno de los tutoriales siempre aparecen los punteros, pero en los buenos no aparecen de este modo. Si tratas de dar toda la información posible entonces ya no es un tutorial introductorio, y como tal, deberías reescribirlo entero de arriba a abajo.

Finalmente, tal y como empieza el tutorial "C, como cualquier otro lenguaje de programación no requiere más que tiempo, una cabeza y mucha paciencia", y "Empezar a programar en C puede ser algo muy bueno o muy malo. C es un lenguaje que, si no te lo tomas con calma y te lo relees todo hasta entenderlo, no puedes continuar avanzado, este tutorial está pensado para ir progresando poco a poco", y para acabar "Es decir, empezar con este tutorial sin ánimos, a desganas, o con la creencia de que no aprenderéis nada, será contraproducente".

Efectivamente, se puede aprender C como primer lenguaje pero lo que no se puede hacer es lo descrito aquí.
Dicho esto, yo aprendí a programar en VB, luego PHP y luego C. Sin embargo, VB ya no lo utilizo para nada, es más, en VB (que es mucho pero que mucho más fácil que C) es donde se cogen muchas más malas costumbres. En proporción con C, en VB se cogen muchísimas más malas costumbres.

Aquí estás en lo cierto, con VB se cogen muy malas costumbres y lo recomendable suele ser olvidarlo bien, exactamente igual que éste tutorial.

En fin, muchas gracias por la opinión, pero espero comprendas que el estilo y "programa" del tutorial no va a variar.
Salu2!

No es mi opinión. Simple y llanamente el tutorial que has escrito no es buena idea seguirlo.

Un saludo.
Filiprino escribió:
blipi escribió:No te voy a negar que no tengas parte de razón. Pero, comprenderás que en ningún momento se ha dicho que aquí se vayan a formar expertos en programación. Si a alguien le gusta la programación, aprenderá esto y mucho más.

Pero mejor empezar aprendiendo bien que mal, y precisamente como se va a aprender más lo aquí explicado se puede obviar completamente y buscas algo donde se expliquen las cosas correctamente.

Hoy en día, en ordenador modernos, la posibilidad de que usando memoria dinámicas toques algo fuera de normal Y ocurra un error grave, son bastante pequeñas. Supongo que conocerás de las existencia de los VEH y SEH, que funcionan a más de nivel y previenen de lecturas/escrituras en out of range. Si realmente alguien, usando este tutorial, consigue cargarse su ordenador por mal uso de la memoria, le doy un premio.

No es por tocar algo que haga peligrar el sistema, es por poner cosas que no tocan. Por otro lado VEH y SEH es algo exclusivo de Microsoft y su Windows. Ese es otro punto, alientas al C de Windows como por ejemplo con las macros BYTE, WORD y DWORD (te faltaría la QWORD).

El uso de free, sí, es verdad, es un fallo mio no haberlo comentado. Pero bien sabrás que a menos que vayas a hacer un programa muy grande y lo hagas muy mal, no te vas a quedar sin memoria. Como bien he comentado en el tutorial, las declaraciones dinámicas de memoria no deben usarse en exceso, y en todo caso se debe usar memset para resetear memoria que ya no están en uso.

Explicación corta y básica: Memset inicializa una región de memoria al valor que uno quiera, pero eso no significa que libere del heap esa memoria reservada previamente con un malloc. Para liberar realmente el heap y deje de contar esa memoria como ocupada hay que utilizar free dado que C/C++ no tienen recolección de basura. Si no utilizas free lo único que haces es ir llenando el área de heap y perdiendo las referencias a la memoria ocupada y por tanto terminas con pérdida de memoria. Todo esto evidentemente es si no estás implementando tu propia función free, para lo cual tienes que encargarte tú mismo del punto, su referencia, etcétera y para ello entre otras cosas utilizas memset.

Teniendo en cuenta el supuesto nivel introductorio de este tutorial, pues creo que es un fallo bastante gordo, si es que de verdad se pretende enseñar algo útil y no lo primero que se le viene a uno a la cabeza.

También sabrás que el tutorial no está acabado, y las struct siquiera he llegado a ellas, normal que no estén definidas =)

Las structs son tipos básicos y deberían estar explicados al principio junto con los enum y demás.

Alineación de memoria... Un buen tema, que, sin embargo, no considero que esté al alcance de nadie que fuera a leer este tutorial. Del mismo modo, a no ser que hagas un gran proyecto, no te preocuparás por ello.

¿La alineación de memoria no está al alcance del público al que va dirigido el tutorial pero sí lo está la memoria dinámica (mal explicada)?
Aquí no hablamos de pequeños o grandes proyectos. Aquí hablamos de dar buenas directrices de aprendizaje. Hacer una mezcla de aquí y allá no es útil y termina siendo una pérdida de tiempo.

Yo no me preocuparía mucho por los estánderes, un compilador decente no tendrá ningún problema hoy en día. Lo mismo va con las tabulaciones y espacios.
En el tutorial ya se comenta, y a cada persona que postea código para revisar se lo recuerdo, el uso de las tabulaciones para una buena lectura. A menos que se dediquen a ignorar el tutorial por completo, muchas malas costumbres no se pueden coger.

Hombre, está claro, puedes escribir como te dé la gana. Siempre que pongas un punto y coma después de cada instrucción el compilador no tendrá problemas. Pero hay un estándar ISO que se debe respetar y unos estilos de escritura que también deben ser respetados.

El punto en que quizás más de acuerdo estoy contigo es en el hecho de enseñar "uso de memoria". Pero, como comento en el tutorial, solo hace falta saber que es un puntero para poder progresar (en TODOS y cada uno de los tutoriales para aprender C, eso es un paso obligatorio). La información adicional que doy sobre memoria no es, evidentemente, obligatoria para progresar en un aprendizaje normal. Pero, yo, por ejemplo, si estuviera siguiendo un tutorial, querría que me dieran cuanta más información posible.

Sí, en todos y cada uno de los tutoriales siempre aparecen los punteros, pero en los buenos no aparecen de este modo. Si tratas de dar toda la información posible entonces ya no es un tutorial introductorio, y como tal, deberías reescribirlo entero de arriba a abajo.

Finalmente, tal y como empieza el tutorial "C, como cualquier otro lenguaje de programación no requiere más que tiempo, una cabeza y mucha paciencia", y "Empezar a programar en C puede ser algo muy bueno o muy malo. C es un lenguaje que, si no te lo tomas con calma y te lo relees todo hasta entenderlo, no puedes continuar avanzado, este tutorial está pensado para ir progresando poco a poco", y para acabar "Es decir, empezar con este tutorial sin ánimos, a desganas, o con la creencia de que no aprenderéis nada, será contraproducente".

Efectivamente, se puede aprender C como primer lenguaje pero lo que no se puede hacer es lo descrito aquí.
Dicho esto, yo aprendí a programar en VB, luego PHP y luego C. Sin embargo, VB ya no lo utilizo para nada, es más, en VB (que es mucho pero que mucho más fácil que C) es donde se cogen muchas más malas costumbres. En proporción con C, en VB se cogen muchísimas más malas costumbres.

Aquí estás en lo cierto, con VB se cogen muy malas costumbres y lo recomendable suele ser olvidarlo bien, exactamente igual que éste tutorial.

En fin, muchas gracias por la opinión, pero espero comprendas que el estilo y "programa" del tutorial no va a variar.
Salu2!

No es mi opinión. Simple y llanamente el tutorial que has escrito no es buena idea seguirlo.

Un saludo.



hola yo no tengo nada que ver con el tema, simplemente estaba echando un vistazo al tuto y lo he visto muy bueno y explicado de manera que el pueblo lo entienda te doy un diez tio.

Filiprino se nota que sabes uno monton sobre programacion y me encantaria te lo digo de corazon que ayudaras a mejorar el tutorial con tus conocimientos... pero tio no seas asin de criticon, tu sabes la cantidad de horas que habra tardado blipi en hacer el tutorial?? yo creo que nada mas que por eso se merece un respeto ( y no digo ni mucho menos que tu lo estes faltando)

Por que no dejais la discusion y unis vuestras fuerzas para hacer un tutorial de la "ostia" ;)

si el fin de este tutorial realmente es enseñar y unicamente enseñar de verdad, os deberiais unir

os habla un fan de la programacion y un compañero un saludo y ojala os unieseis seria muy bueno para todos nosotros


pd: blipi no hay que ser orgulloso y si te dan un consejo sobre el tuto sobre algun detalle incompleto o sugerencia tienes que estar dispuesto a modificarlo para que siempre el fin del tuto sea que se enseñe de manera correcta, eso deberia ser el objetivo numero 1, todo dicho desde la humildad, un saludo amigo
@_d0n_
Creo que se malentendió lo de que no voy a modificarlo jaja Solo me refería que el tema de la memoria lo iba a dejar igual. Evidentemente, cualquier opinión, ajuste, información, aclaración, lo que sea, será bienvenida y la añadiré con toda tranquilidad =P

Solo una cosa pido, cuando deis opiniones, se puede hacer de forma constructiva, hasta ahí de maravilla Filiprino, pero luego se pueden hacer sugerencias y no soltar sin más ni menos que el tutorial simplemente es un perdida de tiempo.

Pero mejor empezar aprendiendo bien que mal, y precisamente como se va a aprender más lo aquí explicado se puede obviar completamente y buscas algo donde se expliquen las cosas correctamente.

Sí, si ya te digo, es mucho mejor aprender bien de buenas a primeras. Pero, este tutorial ha sido escrito a partir de mi experiencia, y como tal, es imperfecto. Ahora bien, las explicaciones no son del tipo teóricas tostón, lo hago de forma entretenida (o lo intento al menos), clara y concisa.
También ten en cuanta que esto lo escribo sobre la marcha, es decir, no me preparo el texto y luego voy a escribirlo.
Pero bueno, creo que para aprender sin malas costumbres da mucho de sí.

No es por tocar algo que haga peligrar el sistema, es por poner cosas que no tocan. Por otro lado VEH y SEH es algo exclusivo de Microsoft y su Windows. Ese es otro punto, alientas al C de Windows como por ejemplo con las macros BYTE, WORD y DWORD (te faltaría la QWORD).

Pero poner cosas que no tocan, como mucho obtendrás un error, así que tampoco lo veo tan mal.
En lo del SEH y VEH me has pillado =P Pero bueno, siempre tienes los try, catch (en C++), y en unix/linux, sinceramente, no lo se.
Bueno, el tema BYTE y tal, si que es verdad que es propio de windows. Pero habrás visto que defino bien de donde sale, así que en principio, no debería causar muchos problemas.
QWORD no viene definido por defecto en la mayoría de cabeceras de win, por lo que sería necesario un typedef. (typedef unsigned long long QWORD, o si lo prefieres "orientado" a unix, typedef unsigned __int64 QWORD)

Explicación corta y básica: Memset inicializa una región de memoria al valor que uno quiera, pero eso no significa que libere del heap esa memoria reservada previamente con un malloc. Para liberar realmente el heap y deje de contar esa memoria como ocupada hay que utilizar free dado que C/C++ no tienen recolección de basura. Si no utilizas free lo único que haces es ir llenando el área de heap y perdiendo las referencias a la memoria ocupada y por tanto terminas con pérdida de memoria. Todo esto evidentemente es si no estás implementando tu propia función free, para lo cual tienes que encargarte tú mismo del punto, su referencia, etcétera y para ello entre otras cosas utilizas memset.

Error mio, me explique mal. Me refería a usar memset para evitar reservar más memoria y reutilizar la que ya no tenga uso. Evidentemente, es necesario un free para liberar la heap cuando terminas de usarla.

Temas punteros, creo que es necesario profundizar más.
Temas struct, aun y declrarse como una variable más, no le encuentro sentido a explicarlo junto a los tipos de datos. Lo veo más lógico y simple explicarlo aparte, igual que enums y unions.


No es mi opinión. Simple y llanamente el tutorial que has escrito no es buena idea seguirlo.

Perdón por escribir este tutorial. (Entiende por favor que frases radicales como estas (la tuya y mi respuesta) no tienen mucho sentido).

Salu2!
blipi escribió:Sí, si ya te digo, es mucho mejor aprender bien de buenas a primeras. Pero, este tutorial ha sido escrito a partir de mi experiencia, y como tal, es imperfecto. Ahora bien, las explicaciones no son del tipo teóricas tostón, lo hago de forma entretenida (o lo intento al menos), clara y concisa.

Tampoco estoy pidiendo explicaciones teóricas, pero sinceramente, tragarse esto así por las buenas tampoco es. Como entretenimiento vale, pero nada más. Si entiendes que aprender bien equivale únicamente a explicaciones del tipo teórico (que ni tienen porqué ser un tostón y además son algo necesario sin tener que llegar a amplios detalles) entonces mal vamos.

También ten en cuanta que esto lo escribo sobre la marcha, es decir, no me preparo el texto y luego voy a escribirlo.

Pues menudo favor estás haciendo a la gente que quiere aprender algo. Escribes un tutorial sobre la marcha sin verificar correctamente lo que escribes.

Pero poner cosas que no tocan, como mucho obtendrás un error, así que tampoco lo veo tan mal.

El problema es que estás enseñando a poner tornillos sin saber como sacarlos, sin saber que a veces es necesario poner una arandela o tuerca por el otro lado o que no se debe aplicar un par de apriete fuerte al principio del enroscado, son cosas básicas pero importantes, no son conceptos súper teóricos y tostones. Estas constantemente restando gravedad a cosas que son graves y si se trata de enseñar hay que evitar las cosas que parecen inofensivas cuando no lo son. Supongo no queremos que un hola mundo nos llene los 8GB de memoria RAM del ordenador o que al pulsar un botón el programa se quede colgado o simple y llanamente se cierre por una excepción no controlada.

En lo del SEH y VEH me has pillado =P Pero bueno, siempre tienes los try, catch (en C++), y en unix/linux, sinceramente, no lo se.

Try y catch forman parte del estándar C++. Ya sabemos que el compilador de Visual Studio es un poco rarito (y lento), pero el tratamiento de excepciones es algo común en todos los sitios y muy básico para la memoria dinámica. Respecto al SEH y VEH no es más que un control del propio sistema operativo, exclusivo del compilador del Visual Studio, para evitar cagadas gordas (sí, aunque te parezca mentira, son graves) y que tampoco es automático según he podido leer. En Linux/Unix si existe algo así es a base de librerías adicionales no incluidas en el estándar C. Recordemos que se trata de enseñar C.

Bueno, el tema BYTE y tal, si que es verdad que es propio de windows. Pero habrás visto que defino bien de donde sale, así que en principio, no debería causar muchos problemas.
QWORD no viene definido por defecto en la mayoría de cabeceras de win, por lo que sería necesario un typedef. (typedef unsigned long long QWORD, o si lo prefieres "orientado" a unix, typedef unsigned __int64 QWORD)

Si programas para AMD64 vendrá definido el QWORD. Por otro lado únicamente dices que BYTE "equivale" a char. No es que equivalga a un char, BYTE es una macro del Visual Studio, de nuevo enseñas C-Windows. Estaría muy bien que cambiaras el título del hilo por el de "tutorial para programadores C-Windows". Está claro que es un tutorial basado en tu experiencia, se nota.

Error mio, me explique mal. Me refería a usar memset para evitar reservar más memoria y reutilizar la que ya no tenga uso. Evidentemente, es necesario un free para liberar la heap cuando terminas de usarla.

Corrección gramatical y puntillosa: "el" heap. Heap == montículo. Otra cosa es que los heaps se utilicen para la memoria dinámica de un programa.
Utilizar el memset medio a ciegas sobre memoria dinámica no es buena idea. Cualquier cambio en cualquier otro sitio puede ser un problema. Muchos agujeros de seguridad vienen dados por cosas así.

Temas struct, aun y declrarse como una variable más, no le encuentro sentido a explicarlo junto a los tipos de datos. Lo veo más lógico y simple explicarlo aparte, igual que enums y unions.


Struct es una estructura de datos simple, y como tal debiera explicarse con los tipos de datos normales. Otra cosa es que te refieras a estructuras de datos algo más complejas como las listas, árboles, pilas, mapas, etcétera.

Perdón por escribir este tutorial. (Entiende por favor que frases radicales como estas (la tuya y mi respuesta) no tienen mucho sentido).

Si te lo tomas como una idea radical, qué se le va a hacer.

Un saludo.
De todas maneras esta clase de tutoriales que hay por internet es para la gente en verano que quiere aprender a hacer alguna cosilla por diversión.
Si quieres aprender de verdad a programar necesitas unos buenos cuantos libros y empollar bastante.
@Filiprino
Dudo que esto nos lleve mucho más lejos ya. Tendré en cuenta tus consejos y opiniones para las próximas ampliaciones del tutorial, y revisaré la actual.
Salu2!
Siempre es un placer.
Un saludo.
hola
muy bueno el tuto.

consulta, pero esto es para pic 16f.

bueno, lo que pasa es que necesito un ejemplo o de como podria yo hacer en C lo sig.

deseo tener un pic con un boton de entrada y que este boton sea capas de hacer lo sig.
apretar una vez = encender led rb0 y apagar led rb1
apretar dos veces = encender led rb1 y apagar led rb0

mantener 2 segundos apretado = encender led rb3 y apagar led rb4
mantener por 4 o mas = encender led rb4 y apagar led rb3..

bueno eso es la idea que me tiene sin dormir, no se si se me entiende.

si ya se que podria hacerlo con varios botones en la puertas a, pero yo quiero hacerlo con un solo boton, mas que nada para aprender como es la cosa.. aunque sea un ejemplo me detecte al mantener los segundos.

saludos.
filiprino lei en tu comentario que puedo llenar la memoria ram con por ejemplo hola mundo y tambien que puede joder la pc , es tan asi? pregunto porque voya empezar con c y no quiero joder la pc
@demianxldc
Lo siento mis conocimientos sobre microcontroladores son bastante pobres, te seria mas un estorbo que una ayuda.

@panthera189
Las probabilidades de que en pc normal haciendo un simple Hello World llenes toda la RAM son tan altas como que un cerdo mute y le salgan alas. Y si nunca llegase a ocurrir, las probabilidades de que esto causara algún tipo de daño al PC se elevan a que ese cerdo con alas llegara nunca a levantar el vuelo.
Espero que la ironía y el sarcasmo hayan sido entendidos xdd no te lo tomes a mal eh jaja era para hacerlo mas entretenido =P

Realmente, el comentario de filiprino considero que, sin querer quitarle parte de razón ni menospreciarlo ya que es totalmente respetable y en muchas cosas, incluido conocimiento, me supera, es exageradamente alarmista.

Llenar la RAM solo provocaría que el PC fuera lento, y en el peor de los casos que tardara tanto en responder que tuvieras que apagarlo manualmente. La probabilidad de que mientras apagues el ordenador provoques un error o mal funcionamiento en un OS moderno son muy bajas.
El mayor riesgo (que existía en un pasado, prácticamente los antecesores a los sistemas NT, he incluso tengo mis dudas sobre los win 95/98) es que modifiques algún proceso interno del OS con una violación de memoria. Hoy en día, para poder acceder a la memoria de otro proceso son necesarios permisos, y en muchos casos acceder a un proceso critico no es posible de formas convencionales. Es decir, provocar el mal funcionamiento de un proceso del sistema y por aun mas casualidad que este proceso provoque algún error permanente (es decir, fuera de RAM) es muy bajo. Lo peor que llegaras a ver en OS Windows es la famosa BSOD, que simplemente previene de errores mas graves.

Y evidentemente, a niveles de principiante, cagarla tanto como para conseguir cualquier de las cosas anteriores (en OS moderno) se merecería un buen premio. Claro que si te pones a trastear con la memoria sin ton ni son e ignoras por completo el tutorial (incluso llendo mas allá) puedes llegar a conseguir unos buenos resultados.

Espero que la respuesta te valga (su intención es meramente informativa, perdoname si en algunos puntos suena demasiada directa, es muy tarde y justo venia de fiesta, sry)


De paso aprovecho para comentar que estoy haciendo una versión revisada del tutorial en PDF y que depende de como posteare o no. Mas que nada porque la actitud de cierta gente en este foro (y no hablo de este hilo en concreto, por suerte) esta siendo deplorable y nefasta. Se respira demasiado aire de superioridad. En fin, si veo que hay interés seguiré revisando el tutorial y reescribiendolo en un PDF.


Salu2,
Blipi

PD: Sorry si hay incoherencias, a veces el corrector del iPod salta solo y no lo veo.
Bien, tengo una duda, ¿como puedo hacer que en un bucle (for o while) cada ejecución se retrase, por ejemplo, un segundo?

Por ejemplo:

int main() {
     int i;
     for (i=0; i<10; i++) {
          printf("%i", i);
     }
     return 0;
}

¿Como hacer para que ese bucle for muestre cada incremento de i en intervalos de un segundo?

Esa es mi duda y no consigo solucionarla por mas que leo.

Edit: Ya lo aclaré aunque no lo entiendo. ¿Alguien me lo explica?. La solución es:

int main() {
     int i;
     for (i=0; i<10; i++) {
          printf("%i", i);
          fflush(stdout);
          sleep(1); // En segundos
     }
     return 0;
}
xXDraklordXx escribió:Bien, tengo una duda, ¿como puedo hacer que en un bucle (for o while) cada ejecución se retrase, por ejemplo, un segundo?

Por ejemplo:

int main() {
     int i;
     for (i=0; i<10; i++) {
          printf("%i", i);
     }
     return 0;
}

¿Como hacer para que ese bucle for muestre cada incremento de i en intervalos de un segundo?

Esa es mi duda y no consigo solucionarla por mas que leo.

Edit: Ya lo aclaré aunque no lo entiendo. ¿Alguien me lo explica?. La solución es:

int main() {
     int i;
     for (i=0; i<10; i++) {
          printf("%i", i);
          fflush(stdout);
          sleep(1); // En segundos
     }
     return 0;
}


sabes como funciona el for no?¿
tu ejemplo :
1.es un bucle que mientras i sea menor que 10 ;la i se incrementa en uno
2.se imprime i en pantalla
3. aquí entra la espera - Sleep(1000); // include windows.h 1000 = 1 segundo O usleep(20000); //include unistd.h 200000 = 2 segundos
4. de vuelta al punto 1 hasta que i sea mayor que 10

blipi donde estas que pasa con shell
Si, se como funciona, por eso mi duda. Con un simple sleep(1) no reacciona, es necesario limpiar el buffer de salida - fflush(stdout) - para que funciona y eso es lo que no entiendo.
xXDraklordXx escribió:Si, se como funciona, por eso mi duda. Con un simple sleep(1) no reacciona, es necesario limpiar el buffer de salida - fflush(stdout) - para que funciona y eso es lo que no entiendo.


lo he probado asi
#include <stdio.h>
#include <windows.h>

int main() {
     int i;
     for (i=0; i<=10; i++) {
          printf("%i", i);
          //fflush(stdout);
          Sleep(1000); // En mili segundos 
     }
     return 0;
}


funciona bien prueba y me cuentas
448 respuestas
15, 6, 7, 8, 9