Rincón Matemático

Revista, Técnicas, Cursos, Problemas => Cursos del Rincón => Consultas - comentarios - ejercitación de los cursos => Mensaje iniciado por: argentinator en 03 Enero, 2013, 05:14 pm

Título: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 03 Enero, 2013, 05:14 pm
Proyecto de Curso (Comentarios): Programación en C

3/Enero/2013



Organización (http://rinconmatematico.com/foros/index.php?topic=64834.msg260247#msg260247)

Dictado (Notas teóricas y problemas propuestos) (http://rinconmatematico.com/foros/index.php?topic=64835.msg260248#msg260248)

Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: pierrot en 03 Enero, 2013, 07:02 pm
¡Excelente iniciativa!

Esto lo digo porque hay personas que parece no interesarles que un programa es algo que en algún momento tiene que "aterrizar" en una computadora concreta.

¡Uf! Podría hacer una lista cuasi infinita con tales personas...  :D
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 03 Enero, 2013, 08:52 pm
Jejeje... Viste que yo no hablo sólo por hablar.  ;)
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 03 Enero, 2013, 09:16 pm
Ah, pues lo seguiré, porque nunca he jugado a programar en C. De hecho ya lo he empezado a seguir, me lo he descargado y he probado el "Hola mundo".

 Yo tengo Linux, pero hace un mes o así instale una cosa que se llama VirtualBox y con ello abro el Windows en una ventana del Linux; se puede hacer también al contrario y tener Linux dentro de Windows. Es muy fácil de instalar y funciona bien.

 Saludos.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 03 Enero, 2013, 09:21 pm
No conozco el VirtualBox.
Pero si se pudiera correr Linux dentro de VirtualBox bajo Windows, podría intentar llevar adelante el curso también para Linux.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 03 Enero, 2013, 09:24 pm
No conozco el VirtualBox.
Pero si se pudiera correr Linux dentro de VirtualBox bajo Windows, podría intentar llevar adelante el curso también para Linux.


Hola, Argentinator. Si no me equivoco de enlace me parece que éste es para ponerlo en Windows y a través de él utilizar otros sistemas operativos (Linux, versiones antiguas de Windows, etc).

http://virtualbox.softonic.com/

 Saludos.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 03 Enero, 2013, 09:33 pm
Argentinator, si finalmente lo instalas, y una vez que hallas instalado el sistema operativo, y con él abierto, aparece una pestaña que pone "dispositivos"; despliégala y pincha en instalar "guest adittions", para maximizar la pantalla si quieres y, sobre todo, para que el ratón pase de un sistema a otro sin tener que usar la tecla "control", que es muy pesado.




(https://foro.rinconmatematico.com/index.php?action=dlattach;topic=64837.0;attach=11480)
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: Phicar en 03 Enero, 2013, 10:38 pm
Hola, hay otra alternativa...Hay un programa llamado CygWin, emula las aplicaciones posix ahí en Windows..así que no toca instalar todo el sistema operativo y puedes usar el gcc o g++ sin tener que correr todo el linux en la VM.

Lo solía usar y, en ese entonces, parecía buenísimo.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 03 Enero, 2013, 10:55 pm
Bueno muchachos, voy a tratar de ir comprobando todas estas opciones para Linux, a ver qué conviene más.

Por ahora lo que me preocupa es que los programitas que habrá en el curso son para la línea de comandos de Windows, o sea que carga la ventanita fea de CMD.

Estoy buscando alguna alternativa.

También se puede hacer algún programita con los mínimos requerimientos para generar una ventana básica en Windows, pero quisiera evitar esto en lo posible.



Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 04 Enero, 2013, 01:31 am
Bueno muchachos, voy a tratar de ir comprobando todas estas opciones para Linux, a ver qué conviene más.

Por ahora lo que me preocupa es que los programitas que habrá en el curso son para la línea de comandos de Windows, o sea que carga la ventanita fea de CMD.

Estoy buscando alguna alternativa.

También se puede hacer algún programita con los mínimos requerimientos para generar una ventana básica en Windows, pero quisiera evitar esto en lo posible.





 Pero si es por el color negro, el tamaño de letra, etc., eso se puede cambiar en esa ventana pinchando en la esquina izquierda de arriba (o con le botón derecho del ratón en cualquier parte de la barra de arriba) se abre una lista en la cual una de las opciones es "propiedades", y ahí puedes redimensionarla a gusto, cambiar el color de fondo, el de letra, el tamaño de la fuente...

Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 04 Enero, 2013, 03:36 am
Bueno muchachos, voy a tratar de ir comprobando todas estas opciones para Linux, a ver qué conviene más.

Por ahora lo que me preocupa es que los programitas que habrá en el curso son para la línea de comandos de Windows, o sea que carga la ventanita fea de CMD.

Estoy buscando alguna alternativa.

También se puede hacer algún programita con los mínimos requerimientos para generar una ventana básica en Windows, pero quisiera evitar esto en lo posible.





 Pero si es por el color negro, el tamaño de letra, etc., eso se puede cambiar en esa ventana pinchando en la esquina izquierda de arriba (o con le botón derecho del ratón en cualquier parte de la barra de arriba) se abre una lista en la cual una de las opciones es "propiedades", y ahí puedes redimensionarla a gusto, cambiar el color de fondo, el de letra, el tamaño de la fuente...



Es verdad. Nunca me había fijado en esa opción de Propiedades.  :o

Gracias  ;D , ya hice las modificaciones.
Texto negro sobre fondo blanco y ventana más ancha.

Aún así, sigue siendo molesto el modo de "línea de comandos", ya que me gustaría que aparezca una ventanita de Windows, donde sólo esté la información o interacción con el programa.

Igual no importa, por ahora me conformo con el cambio de configuración del CMD.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 04 Enero, 2013, 03:40 am
Hummm. Tu consejo no sirve, porque cuando ejecuto el programa compilado en DevC++ se pierde la configuración hecha al CMD en "Propiedades".

 :'( :'( :'( :'(
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 04 Enero, 2013, 04:03 am
Voy a usar la función MessageBox de la biblioteca windows.h.

Es antinatural, pero es una solución simple.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: pierrot en 04 Enero, 2013, 04:18 am
Hummm. Tu consejo no sirve, porque cuando ejecuto el programa compilado en DevC++ se pierde la configuración hecha al CMD en "Propiedades".

Una posibilidad es llamar al ejecutable desde la consola. No soy muy partidario de ejecutar los programas con el IDE. Además se evita tener que generar pausas innecesariamente con system("pause") o getchar() o cosas por el estilo.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 04 Enero, 2013, 05:21 am
Fijate que ya incluí una alternativa con MessageBox, que es muy práctica.

A ver cuánto aguantamos con eso.

De paso aproveché para explicar el uso de la compilación condicional en C, aprovechando que tenemos esta disyuntiva de cómo mostrar la salida del "Hola Mundo".

 ;)
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 04 Enero, 2013, 12:51 pm
Hummm. Tu consejo no sirve, porque cuando ejecuto el programa compilado en DevC++ se pierde la configuración hecha al CMD en "Propiedades".

 :'( :'( :'( :'(

 Pero ¿si lo guardas con el mismo nombre, también? En la consola del XP -que es el que tengo yo en la VirtualBox para que ocupe menos- tiene la opción de guardar los cambios de tal manera que, si se conserva el nombre del archivo, conserva las propiedades de la pantalla; por lo menos ejecutando el programa desde la carpeta, que es como yo lo probé.
 También estuve mirando programas para abrir ejecutables exe, hay uno que abre prácticamente todo tipo de archivo, una especie de llave maestra de abrir programas, que se llama "Open Freely", pero no acabé de instalarlo  porque tardaba y hacía falta no sé cuál programa de Microsoft que no tenía instalado; así que lo dejé de momento.

Sí, si se conserva el nombre de archivo si se ha marcado previamente la casilla "Guardar propiedades para todas las ventanas con el mismo título" antes de "Aceptar" propiedades; aunque lo modifiques y lo recompiles. Ahora bien, cada vez que haces un ejecutable con otro nombre, entonces, sí, hay que configurar, la primera vez al ejecutarlo, las propiedades

Saludos.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 04 Enero, 2013, 03:22 pm

Sí, si se conserva el nombre de archivo si se ha marcado previamente la casilla "Guardar propiedades para todas las ventanas con el mismo título" antes de "Aceptar" propiedades; aunque lo modifiques y lo recompiles. Ahora bien, cada vez que haces un ejecutable con otro nombre, entonces, sí, hay que configurar, la primera vez al ejecutarlo, las propiedades

Saludos.

Sí, esa opción la ví y la usé, pero la idea es que vamos a estar haciendo una multitud de ejecutables distintos, y no que vamos a ejecutar siempre el mismo programa.

Igual no importa, porque gracias a esto me estuve divirtiendo con las directivas del compilador:

http://rinconmatematico.com/foros/index.php?topic=64835.msg260354#msg260354 (http://rinconmatematico.com/foros/index.php?topic=64835.msg260354#msg260354)
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 04 Enero, 2013, 04:44 pm


Igual no importa, porque gracias a esto me estuve divirtiendo con las directivas del compilador:

http://rinconmatematico.com/foros/index.php?topic=64835.msg260354#msg260354 (http://rinconmatematico.com/foros/index.php?topic=64835.msg260354#msg260354)

Lo he estado leyendo, ahora voy a probar las cosas... :)
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 04 Enero, 2013, 05:30 pm
Una pregunta: por qué defines esto así  #define Creo_que Me_Conformo_con_CMD

 Yo creo entender que la variable es "Creo-que", la cual puede adquirir el valor que tiene "Me_Conformo_con_CMD", por ejemplo, puesto que después se define una variable de comparación (yo  diría que es más de asignación que de comparación) la cual se verificará mediante un condicional if, que es está.

 #define CMD_OK (Creo_que == Me_Conformo_con_CMD)

 Eso me confunde un poco  ???
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 04 Enero, 2013, 06:03 pm
Bueno, el identificador "Creo_que" no es una variable, sino una constante del preprocesador.

El preprocesador y/o el compilador sólo tienen permitido evaluar operaciones o expresiones con constantes directamente especificadas a mano, así: 0, 1, 11.9, "Hello", etc.

Con #define uno puede crear una macro a nivel de preprocesador,
lo cual simplemente permite sustituir una porción de texto por otra.

Cuando declaramos:

#define Creo_que Me_Conformo_con_CMD

lo que estamos haciendo es indicarle al preprocesador que, antes de compilar el programa (y entonces mucho antes de ejecutarlo), reemplace todas las ocurrencias que encuentre de la macro "Creo_que" por la macro "Me_Conformo_con_CMD".

Como "Me_Conformo_con_CMD" también es una macro, este proceso se repetirá reemplazando todas las ocurrencias de "Me_Conformo_con_CMD" con el valor constante que le hemos adjudicado, que en este caso fue simplemente un 0.

Asimismo CMD_OK no es una "variable de comparación", sino una macro, lo cual hace que cada vez que aparezca en el código el identificador CMD_OK será reemplazado automáticamente por la expresión que está a la derecha: (Creo_que == Me_Conformo_con_CMD).

Los identificadores "Creo_que" y "Me_Conformo_con_CMD", tras hacer todos los reemplazos del preprocesador, se terminan reduciendo a constantes.
Nos va a quedar reducido a algo como (0 == 0) o (1 == 0), según lo que hayamos elegido.

En el caso de tener (0 == 0), lo que estamos haciendo es comparar dos constantes.
Esta comparación no la hace en ningún momento nuestro programa ejecutable HolaMundo2bisbis.exe.

El ejecutable no se entera, sino que antes del proceso mismo de compilación la comparación (0 == 0) ya fue realizada, y dio como resultado el valor 1 (VERDADERO, pues 0 es igual a 0).

____________

Lo que estamos haciendo es jugar con las directivas del preprocesador,
para condicionar lo que va a hacer el compilador,
no lo que va a hacer el programa.

En el programa ejecutable no hay ningún IF.

_______________

En cuando a la declaración:

#define CMD_OK (Creo_que == Me_Conformo_con_CMD)

no es una declaración IF.

En realidad el #if se posterga para más adelante.

Ahí lo que hacemos es dejar guardado en una macro el valor de la comparación de las dos constantes.

Así, la macro "CMD_OK" tendrá guardado el valor 1 (VERDADERO) o 0 (FALSO),
y luego la cláusula #if simplemente pregunta por este resultado, que ya ha sido evaluado previamente.

El sentido de usar CMD_OK es sólo una abreviatura, ya que poner en todos los #if la comparación explícitamente "(Creo_que == Me_Conformo_con_CMD)"
sería mucho más engorroso de leer.

Sin embargo, por lo que veo por tus dudas, es menos intuitivo, ya que la comparación no se hace IN SITU, sino antes, y no se ve claramente que estamos interesados en el resultado de dicha comparación.

Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 04 Enero, 2013, 06:37 pm

Sin embargo, por lo que veo por tus dudas, es menos intuitivo, ya que la comparación no se hace IN SITU, sino antes, y no se ve claramente que estamos interesados en el resultado de dicha comparación.



No, no es por eso, eso lo entiendo, entiendo todo menos el funcionamiento de esa constante; de hecho he variado el programa así para que aparezca la ventana Windows (y me funciona bien):


#define Me_Conformo_con_CMD  1
#define Me_Gusta_mas_Windows 0

#define Creo_que Me_Conformo_con_CMD

#define Creo_que Me_Gusta_mas_Windows

#define CMD_OK (Creo_que == Me_Conformo_con_CMD)
#define WIN_OK (Creo_que == Me_Gusta_mas_Windows)

#if CMD_OK
   #include <stdio.h>
   #define Mostrar_INFO_CMD(S) ( printf(S), getchar(), 0)   
#elif WIN_OK
   #include <windows.h>
   #define Mostrar_INFO_WIN(S) ( MessageBox(NULL,S,"Info",0), 0)
#else
   /* Nada */
#endif

#define Mostrar_INFO(S) \
   (CMD_OK? Mostrar_INFO_CMD(S): \
      (WIN_OK? Mostrar_INFO_WIN(S): (0)) )

void main(void) {   
   Mostrar_INFO("Hola Mundo!!\n\n") ;
}


Pero me sigue extrañando la sintaxis, y también me extraña que el microprocesador sepa que es una constante y no una variable; ¿debo entender que #define es una instrucción para definir constantes exclusivamente y existe otra distinta para definir variables?  No obstante, no pasa nada, si es así como  entiende este comando el microprocesador, es así y ya está; queda visto y asimilado.

 




Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 04 Enero, 2013, 06:49 pm
Ahhh, si es que no le has puesto paréntesis, por eso no le entendía :D

Es esto #define (Creo_que) (Me_Gusta_mas_Windows) Es decir, carga el valor de

Me_Gusta_mas_Windows (o la opción que sea) en Creo-que.

 Parecía todo una sola cosa, no lo veía, ahora sí.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 04 Enero, 2013, 06:57 pm
La cláusula #define no sabe nada de constantes o variables.

En realidad lo que único que hace es definir reglas de sustitución de porciones de texto.

Lo que hace es intentar hacer las distintas sustituciones, hasta que ha revisado todas las macros declaradas con #define.

Eso es lo que hace el preprocesador.

A continuación, el compilador toma el código resultante que le dejó el preprocesador y se fija si hay constantes, y trata de evaluarlas.

La cuestión es que todos los valores que uno escribe a mano, como 5.14, "piribim", "Hello World", 0.0, etc., son constantes, y el compilador sí que reconoce que son constantes y no variables.

Las variables son identificadores que han de declararse en alguna parte como tales, y el compilador también es capaz de reconocer esto, claro.

Pero más aún, si en una expresión en la que hay operadores de C, los operandos son sólo constantes, el resultado es calculado y evaluado directamente por el compilador, y entonces ese resultado es lo único que realmente queda.

El efecto es que queda un código equivalente a que si nosotros hubiéramos escrito el resultado del cálculo a mano, en nuestro propio programa fuente.

Esto tiene sentido, porque es un valor que no va a cambiar durante la ejecución del programa, y entonces no hay inconveniente en que el compilador se tome el atrevimiento de precalcular todo, antes de realizar la compilación "definitiva" del programa.

____________


Lo que hay que entender es que el proceso de compilación se hace en realidad en varias etapas,
y en cada etapa se hace alguna que otra operación de traducción.

Todas esas traducciones consisten en convertir nuestro código fuente en otros programas equivalentes en C, pero que "no se ven".
Si pudiéramos ver el resultado de estos procesos, veríamos programas en C parecidos a los nuestros, salvo que con algunos cambios debido a que ya se han cumplido algunos preprocesos.

____________

En cuanto a tus cambios de números:

#define Me_Conformo_con_CMD  1
#define Me_Gusta_mas_Windows 0

no tienen importancia.

Justamente el código está pensado para que uno pueda poner ahí los números que se le antojen, y todo funcione al final como se espera que tiene que funcionar.

El único requisito es que ambas constantes tengan un valor numérico y distinto.

Esto no lo hemos verificado, pero puede hacerse, e incluso hacer saltar el compilador informando de un mensaje de error en caso de que no se cumpla...

______-

Otra cosa que veo en tu código son las 3er y 4ta líneas:

#define Creo_que Me_Conformo_con_CMD

#define Creo_que Me_Gusta_mas_Windows

Si realmente tenés esas dos líneas escritas, está mal, porque estarías anulando con la segunda la definición que hiciste con la primera.

Entonces siempre te quedará el efecto de la ventanita en Windows como resultado.

Sólo se puede dejar una sola de esas dos líneas.


Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 04 Enero, 2013, 06:58 pm

Es esto #define (Creo_que) (Me_Gusta_mas_Windows) Es decir, carga el valor de


Eso así está mal, no se le pone un paréntesis al primer identificador "Creo_que".

En cambio está bien, y es aconsejable hacerlo, con el segundo, así:

#define Creo_que (Me_Gusta_mas_Windows)

Y sí, es lo que vos decís.
No me dí cuenta que se podía ver todo muy "pegoteado".

Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 04 Enero, 2013, 07:20 pm

Es esto #define (Creo_que) (Me_Gusta_mas_Windows) Es decir, carga el valor de


Eso así está mal, no se le pone un paréntesis al primer identificador "Creo_que".

En cambio está bien, y es aconsejable hacerlo, con el segundo, así:

#define Creo_que (Me_Gusta_mas_Windows)

Y sí, es lo que vos decís.
No me dí cuenta que se podía ver todo muy "pegoteado".



Todo entendido; todos los errores eran por la sintaxis.

 O sea, para ver si lo he entendido de verdad, el lenguaje C interpreta #define variable (argumento) siempre que se deje un espacio aunque no se pongan los paréntesis, y de ahí que utilices guiones bajos para no separar el nombre de las variables (cuando digo variable, sí, me refiero a "variable a mano" o "constante elegible", claro).

Saludos.   
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 04 Enero, 2013, 07:23 pm
Claro, la función del los guiones bajos es esa.

Hay gente que ni los usa, y pone mayúsculas para indicar nueva palabra, así:

CreoQue

En cuanto a la terminología adecuada... no es ni variables, ni constante a mano, jejeje.

Yo diría que hay que usar el término "identificador".

Las "constantes a mano" no son identificadores, porque no son nombres de nada,
sino que son valores explícitos de algún tipo, ya sea números, caracteres, cadenas de caracteres, etc.


Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 04 Enero, 2013, 07:29 pm
Claro, la función del los guiones bajos es esa.

Hay gente que ni los usa, y pone mayúsculas para indicar nueva palabra, así:

CreoQue

En cuanto a la terminología adecuada... no es ni variables, ni constante a mano, jejeje.

Yo diría que hay que usar el término "identificador".

Las "constantes a mano" no son identificadores, porque no son nombres de nada,
sino que son valores explícitos de algún tipo, ya sea números, caracteres, cadenas de caracteres, etc.




Comprendo, #define viene a ser parecida a al comando "def fn" del antiguo Basic.

Gracias, Argentinator.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 04 Enero, 2013, 07:46 pm

Comprendo, #define viene a ser parecida a al comando "def fn" del antiguo Basic.


Es posible, no me acuerdo muy bien de Basic.

Pero el olfato me dice que no son análogas del todo.

Lo importante acá es recordar que las directivas del compilador, que empiezan con el signo #,
efectúan transformaciones a nuestro programa antes de crear el ejecutable.

Todo lo que hace el #define, lo hace en etapas de compilación, dejando todo precalculado,
y así esas operaciones, asignaciones y transformaciones no tienen lugar cuando ejecutamos la versión ejecutable del programa, que no se entera de nada.

Es decir, hay aspectos de los programas en C que no inciden en el programa ejecutable definitivo, sino que se resuelven antes, una única vez, durante el proceso de compilación.

Estas tareas de gestión es necesario comprenderlas, aunque sea de a poco.
He puesto estos ejercicios a propósito para aprender estas cosas.

Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 04 Enero, 2013, 10:04 pm


Estas tareas de gestión es necesario comprenderlas, aunque sea de a poco.
He puesto estos ejercicios a propósito para aprender estas cosas.



Ya, me doy cuenta de ello, las sentencias que no cumplen los condicionales no son compiladas, ¿es eso lo que quieres decir?
 
 Ahora bien, supongamos que pusieras una sentencia tipo "input" asociada a los "if", que esperase que el usuario introdujese un valor para tomar un camino u otro; en ese caso habrá que añadir un bucle que vuelva al "input" constantemente en espera de nuestra entrada, pero a la vez tendrá que dejar de compilar, imagino, para seguir compilando a partir de nuestra orden un trozo de programa u otro, ¿no?
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 04 Enero, 2013, 10:17 pm
[

Ya, me doy cuenta de ello, las sentencias que no cumplen los condicionales no son compiladas, ¿es eso lo que quieres decir?



Sí.

Citar
Ahora bien, supongamos que pusieras una sentencia tipo "input" asociada a los "if", que esperase que el usuario introdujese un valor para tomar un camino u otro; en ese caso habrá que añadir un bucle que vuelva al "input" constantemente en espera de nuestra entrada, pero a la vez tendrá que dejar de compilar, imagino, para seguir compilando a partir de nuestra orden un trozo de programa u otro, ¿no?

No.

El "input" del lenguaje C es la función scanf().

Ese tipo de cosas no pasan, porque scanf() asigna valores a variables.
Digamos que le has asignado un valor a la variable x.
El identificador x no es una "constante".
Por lo tanto, una expresión como

(x == 1)? hago_tal_cosa() :  hago_tal_otra();

no se evalúa en la fase de compilación, porque el operando (x == 1) contiene a x, que no es una constante.

Lo mismo pasa con el uso de las directivas #if.
No se puede poner expresiones que contengan "algo" variable.

Al escribir algo como :

#if (EXPRESION)
   /* Blah, blah, ... */
#endif

La "EXPRESION" no puede contener a x, ni a nada "variable".

No puede haber interacción con el usuario, porque no se mezclan las etapas de compilación con las del programa ya ejecutable.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 04 Enero, 2013, 10:31 pm


No puede haber interacción con el usuario, porque no se mezclan las etapas de compilación con las del programa ya ejecutable.


Ah, luego lo que hace el compilador, sospecho, es traducir todo el lenguaje de alto nivel que hemos escrito a código máquina, y con eso es con lo que se trabaja cuando uno está manejando el programa; o sea, que corre enteramente en código máquina.
La verdad es que, aunque haya dicho eso, me extrañaba que su pudiera salir de un lenguaje de bajo nivel así cómo así para después volver como si nada, pero como se ha avanzado tanto en esto de la informática... pues no sabía.   

Una pregunta, ¿existe el comando stop() aquí?
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 05 Enero, 2013, 12:15 am
No sé si entiendo que estás diciendo.

No se vuelve del código máquina...

Lo que ocurre es un proceso de traducción sucesiva en varias etapas.

He intentado explicar este proceso acá:

Etapas del preprocesador (http://rinconmatematico.com/foros/index.php?topic=64835.msg260430#msg260430)

El compilador hace varias traducciones que transforman el código fuente en C a otro código fuente TAMBIÉN en C, no a código de máquina.
Hace varias veces eso.

Después que termina de hacer esas traducciones, es que recién se dispone a traducir finalmente al código de máquina definitivo.
Esto último se hace una sola vez, y no hay modo de volver (de forma sana) al código original.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 05 Enero, 2013, 12:23 am
MMmmm... No sé.

Creo que estoy complicando demasiado el asunto con tan sólo el "Hola Mundo" y sus amigos.

 >:D

El preprocesador es un tema complicado, y tan sólo estoy poniendo ejemplos básicos.

Creo que lo voy a terminar ahí, aunque haya muchas más opciones interesantes para explorar.

Además, debo intentar hacer algún programa que haga algo interesante.
Pero también me gusta aprovechar para discutir las vicisitudes (¿delirios?) del lenguaje C, que son muchas, y se complican enseguida.

Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 05 Enero, 2013, 12:45 am
MMmmm... No sé.

Creo que estoy complicando demasiado el asunto con tan sólo el "Hola Mundo" y sus amigos.

 >:D



No te preocupes, no lo complicas, es complicado, :D que es distinto.

 Según he consultado en Internet por ahí, parece ser que durante la compilación sí se pasa a código en números binarios y después  se ensambla inmediatamente; ahora bien, no he podido enterarme si eso de "ensamblar" ser refiere al código código ensamblador de antes, del que yo sí conocía un poco básicamente, o es otra cosa.
 De todas formas, tú ve a tu aire, que yo te sigo como pueda y ya con la práctica me iré enterando. Además, parece que tiene cosas bastante parecidas al Javascript en cuanto a declaración de variables locales y algunas cosas así que conozco también de forma básica (de hacer tonterías con el Flash Macromedia).

Saludos y gracias.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 05 Enero, 2013, 06:59 am
Una curiosidad que yo no sabía, fíjate lo que dice aquí:

(es un fragmento de lo que viene en este enlace) http://es.wikipedia.org/wiki/Lenguaje_ensamblador

"Los programas hechos por un programador experto en lenguaje ensamblador son generalmente mucho más rápidos y consumen menos recursos del sistema (memoria RAM y ROM) que el programa equivalente compilado desde un lenguaje de alto nivel. Al programar cuidadosamente en lenguaje ensamblador se pueden crear programas que se ejecutan más rápidamente y ocupan menos espacio que con lenguajes de alto nivel."

Es decir, que los compiladores son menos perfectos que los seres humanos a la hora de ahorrar espacio y hacer que un programa funcione más deprisa  :o
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 05 Enero, 2013, 09:42 am
MMmmm... No sé.

Creo que estoy complicando demasiado el asunto con tan sólo el "Hola Mundo" y sus amigos.

 >:D



No te preocupes, no lo complicas, es complicado, :D que es distinto.

 Según he consultado en Internet por ahí, parece ser que durante la compilación sí se pasa a código en números binarios y después  se ensambla inmediatamente; ahora bien, no he podido enterarme si eso de "ensamblar" ser refiere al código código ensamblador de antes, del que yo sí conocía un poco básicamente, o es otra cosa.
 De todas formas, tú ve a tu aire, que yo te sigo como pueda y ya con la práctica me iré enterando. Además, parece que tiene cosas bastante parecidas al Javascript en cuanto a declaración de variables locales y algunas cosas así que conozco también de forma básica (de hacer tonterías con el Flash Macromedia).

Saludos y gracias.


Lo que pasa es que me estás mezclando cosas.

Estábamos hablando del preprocesador.
El preprocesador nunca transforma a lenguaje de máquina, sino que solamente transforma un programa en C, con algunas directivas (o sea cláusulas con #), en otro programa escrito también en C, pero sin directivas #.

Es que las directivas del preprocesador son sólo declaraciones de tipo "abreviatura".
El preprocesador "desenrolla" esas abreviaturas y las muestra explícitamente.
En la entrada que escribí de mis notas: Etapas del preprocesador (http://rinconmatematico.com/foros/index.php?topic=64835.msg260430#msg260430)
hay un ejemplo de cómo trabaja el preprocesador, yendo en varias etapas de traducción que van quitando las cláusulas #.

_________________

Luego, el ciclo de compilación es algo complejo que contiene varias etapas, que yo he simplificado para que se entienda.

Yo dije esto:

Programa-que-uno-escribe-en-C ---------> Preprocesador-traduce-a-programa-en-C-equivalente-pero-sin-directivas ---------> Compilador-traduce-esto-a-código-de-máquina-del-programa-ejecutable.

Bien, obviamente me he saltado algo en el medio en el último paso.
Es lo que vos mencionás sobre el ensamble.

El "ensamble" no tiene nada que ver con el lenguaje "ensamblador".

Lo que hace el compilador es traducir los diferentes archivos involucrados en un programa (que en general son muchos en un proyecto serio), que todavía no son el ejecutable definitivo.
Esos archivos "compilados" contienen las librerías ".h" y otros archivos que andan por ahí, junto con los enlaces y relaciones que el programados ha elegido entre todos los archivos del proyecto.

El "ensamble" consiste en tomar nota de todas esas relaciones, y "enlazar" todos esos archivos (que es un trabajo hecho por un programa llamado "enlazador" o "linker"), que es lo que finalmente "fabrica" definitivamente el programa ejecutable ".exe".

El compilador, en teoría, no se encarga de hacer el enlazado, sino el programa "enlazador".
El "ensamble" es esta unión o enlazamiento de archivos para formar uno definitivo ejecutable.

Cuando en el IDE wxDevC++ seleccionamos la opción "Compilar", resulta que hace todo junto: el preproceso, luego la "compilación" propiamente dicha, y finalmente el enlazado (o ensamble)..

Un compilador bien hecho tiene que permitir que el programador tenga control sobre esas etapas, porque en proyectos grandes conviene compilar algunos trozos o archivos una sola vez, y así modificar sólo unos pocos archivos cada vez, que serían los únicos que hay que compilar "de verdad", mientras que la única tarea que habría que hacer siempre sería la del enlazado, que es más sencilla y consume menos recursos.

Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 05 Enero, 2013, 09:59 am
Una curiosidad que yo no sabía, fíjate lo que dice aquí:

(es un fragmento de lo que viene en este enlace) http://es.wikipedia.org/wiki/Lenguaje_ensamblador

"Los programas hechos por un programador experto en lenguaje ensamblador son generalmente mucho más rápidos y consumen menos recursos del sistema (memoria RAM y ROM) que el programa equivalente compilado desde un lenguaje de alto nivel. Al programar cuidadosamente en lenguaje ensamblador se pueden crear programas que se ejecutan más rápidamente y ocupan menos espacio que con lenguajes de alto nivel."

Es decir, que los compiladores son menos perfectos que los seres humanos a la hora de ahorrar espacio y hacer que un programa funcione más deprisa  :o

Bueno, el compilador lo hizo también un ser humano.

El "lenguaje ensamblador" o "assembly" es una cosa, y el "programa ensamblador" o "assembler" es otra, salvo que ambas se traducen con la misma palabra "ensamblador" al castellano.

El assembler hace tareas de "ensamble" similares a las que expliqué para los compiladores en C.
Fijate en la sección Assembly del artículo en inglés de Wikipedia, que me parece más preciso:

Cita de: http://en.wikipedia.org/wiki/Assembly_language
Assembly language

A program written in assembly language consists of a series of (mnemonic) processor instructions and meta-statements (known variously as directives, pseudo-instructions and pseudo-ops), comments and data. Assembly language instructions usually consist of an opcode mnemonic followed by a list of data, arguments or parameters.[4] These are translated by an assembler into machine language instructions that can be loaded into memory and executed.



El hecho de que un programador experto en lenguaje ensamblador pueda hacer programas más eficientes que uno hecho en C y luego compilado a código máquina, no es algo sorprendente, ya que un compilador está hecho para realizar traducciones en un estilo sistemático, que además "se defienda" de toda una serie de posibles diferencias y problemas en las máquinas o sistemas donde tiene que correr.

El compilador procura crear un código máquina "seguro", que funcione en todos los sistemas, y eso sólo se puede hacer si se agregan muchas instrucciones de máquina extra, dando un código máquina más engorroso.

Además, el compilador no es capaz de detectar redundancias.

Otro problema son las funciones de las bibliotecas, que el programador tiene que aceptar como vienen, y no puede cambiarlas. Ellas pueden estar deficientemente programadas, sin que el programador tenga opción de poder mejorarlas.

Habrá otras razones por las cuales un código "compilado" es menos eficiente, pero no tengo ganas de pensar en eso...

Una razón para esa falta de eficiencia es que el programador de alto nivel ignora los recursos de la máquina que están involucrados en algunas tareas.
Por ejemplo, es de esperar que las funciones de entrada/salida consuman muchos recursos, así que hay que ingeniárselas para disminuir los accesos a disco o a pantalla.

Además, los lenguajes de alto nivel realizan tareas de gestión, a fin de simplificarle la vida al programador, y que no tenga que renegar siempre con los mismos problemas del lenguaje máquina.
Estas gestiones automáticas seguramente que exageran las precauciones, y hacen programas más ineficientes.

Pero no veo cuál sea el problema.

Si uno realmente está preocupado por lo que hace la máquina, los recursos y los tiempos, bien puede aprender a programar en ensamblador, y listo.

Aquí estamos estudiando el lenguaje C, que es cercano a la máquina, pero sigue siendo de alto nivel.

Compilar en C da programas más eficientes y rápidos que con otros lenguajes.

Aunque igual algo podemos llegar a hacer...  ::)
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 05 Enero, 2013, 05:04 pm


Compilar en C da programas más eficientes y rápidos que con otros lenguajes.

Aunque igual algo podemos llegar a hacer...  ::)

 El C está muy bien :) no hace falta aprender el engorro ése que requiere aprenderse un montón de números o tener siempre una lista al lado.

(voy a ver lo que has puesto nuevo)
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 05 Enero, 2013, 07:22 pm
Ayer estuve haciendo fabricando algunas rutinas y, en unas de ellas, de operaciones de números con "int" y con scanf, etc., no me devolvía el control y  la ventana del cdm se cerraba casi antes de abrirse.
 Depuré y el depurador me regañó por poner el getchar() cuando estaba trabajando sólo con int. Pero el caso es que vi un vídeo en el que, en un IDE Turbo no sé cuántos, sí funcionaba, y sin orden ninguna aparente que devolviera el control. Lo demás estaba todo bien, tenía su librería, su "main" y todo, sólo que no le metí ninguna cosa de texto asociada al char, eran números int.

 ¿Qué se hace en ese caso, qué comando hay? Yo he visto que en tu programa del macro, en el que defines una función para las variables (A,B), al usar el comando de identificadores #define no ocurre eso y sí devuelve el control, pero si se declaran variables en plan normal, digamos, entonces no, al menos en esta IDE.

 Otra cosa, después de utilizar el debug, no sé que pasó que cada vez que abro el Windows, y la IDE después, me aparecen un montón de ventanas flotantes con especificaciones, estado de registros y demás; las cierro ya ya está, puedo trabajar, pero es un rollo y no sé dónde ha que dar para que no salgan más.

Saludos.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 05 Enero, 2013, 08:51 pm
Bueno, no sé qué decirte porque no entiendo qué es lo que hiciste en tu programa.

En cuando al debug, no lo he probado, así que no sé qué efectos produce el debugger del IDE que estamos usando.

Si uno empieza a hacer muchas cosas de golpe, sin orden, se pierde el control de las cosas.

Hay que introducir cambios de a poco, ya sea en los programas como en nuestra rutina de trabajo con el IDE, para irse familiarizando. Si no, no se entiende nada.

Tendrías que colgar acá tu programa, si querés que entienda el problema.

Creería que con los programas que yo hice hasta ahora, todo tiene que funcionar sin problemas, ya que me he ajustado al estándar, lo cual quiere decir que tiene que funcionar en cualquier sistema, bajo cualquier circunstancia.

(En realidad nuestro compilador GCC no se ajusta del todo al estándar C99, pero en lo hecho hasta ahora no hay problemas).

Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 05 Enero, 2013, 09:24 pm


Tendrías que colgar acá tu programa, si querés que entienda el problema.


Por ejemplo, copié el programa de este vídeo http://www.youtube.com/watch?v=ZQrfL1jruSU y no iba; puede, quizá que yo interprete mal un símbolo que hay dentro del "scanf", delante de la "a" parece que hay un "&", pero a lo mejor es que es otra cosa y por eso no va.
 Míralo a ver qué puede ser, es un programa muy corto, se copia enseguida.

Gracias.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 06 Enero, 2013, 12:37 am
No sirve de nada que copie un programa de ese video de Youtube, porque el programa que tiene errores es el tuyo.

Por eso tengo que ver tu programa.

Además, aunque el programa del video es corto, no lo pienso copiar a mano, porque encima lo va cambiando durante todo el video, y tengo que comerme toda la explicación hasta ver qué diablos es lo que hace.

No voy a mirar videos...
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: pierrot en 06 Enero, 2013, 01:11 am
El tipo de datos básico asociado en C a las strings es char*.
Otro día les explico qué es ese asterisco: *.  ::)

Estoy ansioso de que llegue ese día  :laugh:.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 06 Enero, 2013, 01:27 am
El tipo de datos básico asociado en C a las strings es char*.
Otro día les explico qué es ese asterisco: *.  ::)

Estoy ansioso de que llegue ese día  :laugh:.

Ese día me huele a lejano...

Me acuerdo del asterisco maldito que la pantera rosa no podía sacarse de encima:

*

Y encima vino el papá asterisco y se enojó:

*


Me estoy divirtiendo con el asunto de cómo se especifican las constantes en C, ya sea char o int, y cuáles son todas las vicisitudes en torno a la asignación de tipos de datos a esas constantes.

Es algo terriblemente complicado, pero me dí el gusto de hallar toda la información, sacar las conclusiones, y analizar todos los detalles.  >:(

Esto hay que hacerlo alguna vez, porque si no, después vienen las sorpresas, y nadie entiende por qué el programa puso un número donde uno esperaba que ponga otro...
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 06 Enero, 2013, 01:52 am
No sirve de nada que copie un programa de ese video de Youtube, porque el programa que tiene errores es el tuyo.

Por eso tengo que ver tu programa.

Además, aunque el programa del video es corto, no lo pienso copiar a mano, porque encima lo va cambiando durante todo el video, y tengo que comerme toda la explicación hasta ver qué diablos es lo que hace.

No voy a mirar videos...

Bueno, hombre, no te pongas así  :laugh:  :laugh: Decía sólo la primera parte hasta que ejecuta; lo he mirado y remirado, repasado puntos y comas, etc., pero introduzco el número y ahí se queda, el condicional que le sigue no corre. Pero da igual, ya lo repaso más veces, a ver...
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 06 Enero, 2013, 01:55 am
¿Sabían que el número 10 trillones es un desastre de constante?

Según las reglas de asignación automática de tipos enteros, el 10 trillones intenta asignarse a un long long int, pero este tipo le queda chico, así que el estándar no le asigna nada.

Mi compilador me avisa de la situación esta del estándar, pero sin embargo el valor lo toma igual, y parece que lo reconoce como un unsigned long long int.

O sea que la situación es altamente impredecible, si uno no conoce su compilador.

Por un lado, el compilador reconoce que 10 trillones es un número entero positivo (podría no reconocerle como tal).
A la vez, reconoce cuánto vale realmente (podría no hacerlo), porque puede decir que es más grande que lo que acepta el long long int.
Pero dice que no le gusta el número ese, porque no cabe en ningún tipo entero, según el estándar (el estándar podría ser otra cosa).
Aunque igual lo asigna a un tipo entero, el unsigned long long int (podría no asignarlo a nada).
Y también se trata de una constante factible de ser guardada en memoria como un dato de tipo long long int (podría darse el caso de un valor que no pertenezca a ningún tipo válido).

Así que una constante puede considerarse desde varios puntos de vista, que pueden ser todos incompatibles, si no se procede con cuidado.

Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 06 Enero, 2013, 01:56 am
No sirve de nada que copie un programa de ese video de Youtube, porque el programa que tiene errores es el tuyo.

Por eso tengo que ver tu programa.

Además, aunque el programa del video es corto, no lo pienso copiar a mano, porque encima lo va cambiando durante todo el video, y tengo que comerme toda la explicación hasta ver qué diablos es lo que hace.

No voy a mirar videos...

Bueno, hombre, no te pongas así  :laugh:  :laugh: Decía sólo la primera parte hasta que ejecuta; lo he mirado y remirado, repasado puntos y comas, etc., pero introduzco el número y ahí se queda, el condicional que le sigue no corre. Pero da igual, ya lo repaso más veces, a ver...

Me puse celoso, me andás engañando con el tipo ese de youtube.  :'(
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 06 Enero, 2013, 02:04 am

Me puse celoso, me andás engañando con el tipo ese de youtube.  :'(

De eso nada, tiene voz de robot, no es mi tipo :D

 Bueno, te ponga la rutinita, a ver qué hago mal; cuando meto el número no sigue, y si doy a enter desaparece la ventana:

#include <stdio.h>

main()

{
    int a;
       
    printf("Escriba un numero: ");
   
    scanf(" %d", &a);
 
    if(a>0)
 
printf("Es positivo");
   
 
    }

Ya mañana me levanto pronto para ver los Reyes, a ver si lo han arreglado :D

Hasta mañana y buenas noches.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 06 Enero, 2013, 02:37 am
Bueno, a mí el programa me funciona.

Veamos, al poner el número que pide scanf, funciona bien.

Pero desaparece la ventana.
Esto es porque no hay nada que frene el programa antes de que termine.

Lo que tendrías que hacer es abrir una ventana de comandos de Windows:

Menú Inicio, "Ejecutar" y luego CMD.exe, ENTER.

Ahí vas a la carpeta donde tengas guardados tus proyectos, y tratar de ejecutar tu programa desde la línea de comandos directamente.

Ahí vas a ver que no se te cierra la ventana, y que muestra el resultado correcto.

__________

Intenté ponerle un freno, como hacíamos antes, colocando una sentencia getchar(); al final del programa.

Pero no funcionó.

La cuestión es que parece que hay cierta incompatibilidad en los métodos de lectura de datos desde el teclado, al usar scanf, y luego más tarde un getchar().

El tema está en que con scanf("%d", &a); leíste un número, es cierto, pero también tuviste que apretar la tecla ENTER para que terminara el proceso de entrada de datos del teclado.

Sin embargo, esta tecla ENTER no es parte del número que ingresaste, y por lo tanto queda guardado, en cierto modo, en el buffer del archivo estándar (la consola o teclado).
Así, cuando intentás hacer una nueva lectura de datos del teclado, lo primero que aparece en escena es esa "tecla ENTER" que presionaste antes,
lo cual es un caracter, el famoso avance de línea '\n' (o ASCII 10).

Entonces cuando le llega el turno al getchar(), ya lee ese ENTER que habías presionado anteriormente, y sigue con el fin de programa, con lo cual no te da tiempo a presionar ENTER de nuevo.

Una solución horrenda, podría ser poner dos getchar() juntos... pero eso es un asco, no lo hagas.
Otro intento de solución podría ser poner un nuevo scanf(), lo cual te obligará a presionar ENTER, al igual que getchar();

Pero pueden suceder situaciones parecidas a las del getchar(), o bien habrá una forma no clara de salir del embrollo.

Me parece que en este caso lo más adecuado sería hacer una pausa con una llamada al sistema, así:

system("PAUSE");

previamente adosando la librería stdlib.h

______________




#include <stdlib.h>
#include <stdio.h>

void main(void)

{
   int a;

    printf("Escriba un numero: ");
   
    scanf(" %d", &a);

    if(a>0)
        printf("Es positivo\n\n");
   
   system("PAUSE");

 }

Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: pierrot en 06 Enero, 2013, 05:55 am
Me estoy divirtiendo con el asunto de cómo se especifican las constantes en C, ya sea char o int, y cuáles son todas las vicisitudes en torno a la asignación de tipos de datos a esas constantes.

Es algo terriblemente complicado, pero me dí el gusto de hallar toda la información, sacar las conclusiones, y analizar todos los detalles.  >:(

Me gusta el estilo con el que estás redactando las notas; te está quedando muy bien.

Esto hay que hacerlo alguna vez, porque si no, después vienen las sorpresas, y nadie entiende por qué el programa puso un número donde uno esperaba que ponga otro...

Sí, cuando dije que estaba ansioso por ver como tratarías todo el tema de los punteros y la memoria dinámica no lo dije como si toda esta introducción me aburriera; por el contrario estoy aprendiendo cantidad de cosas. En la facultad se le da muy poca importancia al lenguaje de programación en sí; en seguida se pasa a analizar las distintas estructuras de datos y sus implementaciones; también se estudian una cantidad de algoritmos relacionados a esas estructuras de datos. Pero de C en sí es muy poco lo que se enseña (al igual que sobre Pascal y Modula-2 que fueron los lenguajes que utilizamos anteriormente). Sólo lo básico para empezar a programar. Lo demás se aprende sobre la marcha y a los golpes, como es de suponer. Este año pareciera que vamos a hacer lo mismo con Java en Programación 4 y Taller.

Ya que estás con la representación interna de los distintos tipos de datos, como sugerencia nada más, podrías explicar algo sobre las máscaras de bits en C y en general sobre los operadores bit a bit. Además de esa forma se puede investigar sobre cómo representa C cada tipo de datos. Por ejemplo, para un variable de tipo int se usan 32 bits, pero al menos yo desconocía exactamente cuál era la representación interna que empleaba C para el tipo de datos entero con signo. Para descubrirlo, hice este programa

#include <stdio.h>

int main(){
   int k,n;
   n=-2;
   for(k=31; k>=0; k=k-1)
      printf("%d",(n & (1 << k)) >> k);
return 0;
}


y muestra:

-11111111111111111111111111111110

Es claro que usa complemento a dos  :P. Lo que sí no sé es por qué imprime un signo de menos, pero imagino que debe estar asociado a la implementación de la función printf. Si se cambia la línea n=-2 por n=2, despliega, obviamente:

00000000000000000000000000000010

Investigar este tipo de cosas puede estar interesante  :laugh:.

Saludos
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 06 Enero, 2013, 11:28 am
Citar
Sí, cuando dije que estaba ansioso por ver como tratarías todo el tema de los punteros y la memoria dinámica no lo dije como si toda esta introducción me aburriera;

Ya lo sé, no te hagás problema.

Citar
Además de esa forma se puede investigar sobre cómo representa C cada tipo de datos.

Esto puede depender enormemente del (1) compilador usado, (2) las opciones de compilación elegidas, (3) la versión del sistema operativo en que corre, (4) la máquina en que se está ejecutando, etc. ( ¿"etc." == "\emptyset"?  :P ).

O sea que puede haber un error al creer que vamos a descubrir lo que hace C al llevar a cabo operaciones de bajo nivel.

Me refiero a que "C" es algo abstracto, definido por un comité de personas sobre papel, firmado y sellado.
Es lo que llamamos el "estándar".
Si el estándar decide que las operaciones de bits, por ejemplo, tienen determinada representación, entonces se supone que todos los compiladores que respetan el estándar tienen que hacer lo mismo.
Lo que podemos esperar ya está definido de antemano en este caso, y no hace falta programar nada... en teoría.
Hacer el programa nos ayudaría a entender si nuestro compilador respeta el estándar o no, o si está correctamente configurado o no, entre otras cuestiones.

Si el estándar no dice nada al respecto, y lo deja indefinido, entonces investigar la representación interna de los bits de datos no puede darnos información certera de lo que podemos esperar de C, porque esto depende de todos los factores que hemos mencionado arriba, y queda abierta la posibilidad de que cada persona obtenga distintos resultados (probablemente) en sus respectivos sistemas.

Sobre este punto estoy teniendo el cuidado de diferenciar hasta dónde el estándar asegura tal o cual cosa, y a partir de dónde es que ya no asegura nada, y las decisiones las toma el compilador que nosotros usamos.

En tu frase:

Citar
se puede investigar sobre cómo representa C cada tipo de datos.

Lo correcto sería decir "se puede investigar sobre cómo representa el compilador GCC cada tipo de datos".  ;) ;) ;)



En la universidad lo que enseñan es a razonar algoritmos, y el lenguaje es tema secundario, lo cual está bien, porque uno tiene que aprender a pensar los problemas informáticos en forma independiente al lenguaje que está usando.

Estudiar un lenguaje por sí mismo es un gustito que uno puede darse en su casa.  :P
Está permitido con lenguajes importantes como el C.
No sé si vale la pena hacer el mismo análisis con la mayoría de otros lenguajes.

El análisis técnico de un lenguaje es para entender las limitaciones que tiene, y hacer una programación más profesional, en la que los errores de ejecución no nos agarren por sorpresa, como les pasa todo el tiempo a los programadores del Windows.  :P

Citar
Ya que estás con la representación interna de los distintos tipos de datos, como sugerencia nada más, podrías explicar algo sobre las máscaras de bits en C y en general sobre los operadores bit a bit.

Ahora estoy con los tipos de datos, sin analizar los operadores, que son muchos.
Pero me parece muy bien la sugerencia, seguramente le dedicaré sus buenos capítulos.



En cuanto a tu programa:

Citar
#include <stdio.h>

int main(){
   int k,n;
   n=-2;
   for(k=31; k>=0; k=k-1)
      printf("%d",(n & (1 << k)) >> k);
return 0;
}

y muestra:

-11111111111111111111111111111110



Cambié la línea del printf así:

printf("%d  ",(n & (1u << k)) >> k);

(Agregué un espacio en blanco para que se vean mejor los supuestos "bits", y agregué un sufijo "u" al 1).
Con eso parece funcionar bien. Lo que hago es forzar a que la constante 1 sea de tipo unsigned int, y así los corrimientos de bits "conservan el signo".

Creo que el problema podía estar en el tipo de datos que automáticamente se asigna a los números enteros.

Según las reglas de asignación de tipos, el 1 "intenta" ser un signed int, si es que cabe ahí.
Como cabe, lo pone de ese tipo.
Después, la operación (1 << k) conserva el tipo de datos, porque es sólo un corrimiento de bits.
El resultado será un entero positivo para k < 31 porque el bit de signo sigue siendo 0.
Mientras que para k = 31, el "1" ya ha llegado al bit de signo, el primero de todos: 1000000000...
En ese caso, como se trata de un signed int, el valor que toma es el de un número negativo, el más negativo de todos, digamos.

El código siguiente:

for(k=0; k<=31; k=k+1)
      printf("k==%d: (1 << k) == %d\n  ",k, (1 << k));

Genera esta salida:

  k==0: (1 << k) == 1
  k==1: (1 << k) == 2
  k==2: (1 << k) == 4
  k==3: (1 << k) == 8
  k==4: (1 << k) == 16
  k==5: (1 << k) == 32
  k==6: (1 << k) == 64
  k==7: (1 << k) == 128
  k==8: (1 << k) == 256
  k==9: (1 << k) == 512
  k==10: (1 << k) == 1024
  k==11: (1 << k) == 2048
  k==12: (1 << k) == 4096
  k==13: (1 << k) == 8192
  k==14: (1 << k) == 16384
  k==15: (1 << k) == 32768
  k==16: (1 << k) == 65536
  k==17: (1 << k) == 131072
  k==18: (1 << k) == 262144
  k==19: (1 << k) == 524288
  k==20: (1 << k) == 1048576
  k==21: (1 << k) == 2097152
  k==22: (1 << k) == 4194304
  k==23: (1 << k) == 8388608
  k==24: (1 << k) == 16777216
  k==25: (1 << k) == 33554432
  k==26: (1 << k) == 67108864
  k==27: (1 << k) == 134217728
  k==28: (1 << k) == 268435456
  k==29: (1 << k) == 536870912
  k==30: (1 << k) == 1073741824
  k==31: (1 << k) == -2147483648



Podría ser alguna cuestión de la función printf (pero no, porque printf imprime correctamente datos de tipo signed int), así que podemos verificar el signo. Basta depurar con algo como:

   printf("%d\n", (1 << 31) < 0);

que dio salida "1" (verdadero).

Por otra parte, al hacer la máscara de bits con n = -2, que aparentemente, como vos decís, tiene representación complemento a dos,
el resultado de (n & (1 << 31)) tiene que dar esto: 1000000000000000.....

De nuevo, eso como signed int es el número -2147483648.

Cuando lo volvés a correr hacia la derecha con >> k, ¡va agregando 1's a la izquierda!  :o
El resultado de (n & (1 << k)) >> k, con k = 31, es 1111111111111.....  >:(

Pareciera que el corrimiento a derecha no funciona bien.

Al parecer esto no está bien definido en el estándar cuando se trata de números negativos.
Así que depende de la implementación.
Nuestro compilador lo que hace con el corrimiento a la derecha es conservar el bit de signo.

Si el número es positivo, hace lo que esperabas que hiciera, agrega 0's a la izquierda.
Pero si es negativo, agrega 1's por la izquierda, porque en cada corrimiento de los 31 que hace, va agregando un 1 por la izquierda...

Como 111111111111.... es la representación binaria de -1, eso explica el -1 al principio de la salida de tu programa.



Conclusión: El problema no es la representación binaria del -2, sino cómo se implementa en forma local (en el compilador) la operación de corrimiento a derecha.

Buscando seguro se puede encontrar datos sobre esto.
Por ahora sólo encontré algo de C++, que igual se aplica a nosotros, seguramente:

Citar
>> Corrimiento a derecha:

El patrón de bits de expr-desplazada sufre un desplazamiento derecho del valor indicado por la expr-desplazamiento. Como en el caso anterior, ambos operandos deben ser números enteros o enumeraciones. En caso contrario, el compilador realiza una conversión automática de tipo. El resultado es del tipo del primer operando.

Una vez promovida a entero, expr-desplazamiento debe ser un entero positivo y menor que la longitud del primer operando. En caso contrario, el resultado es indefinido (depende de la implementación).

Nota: en C++Builder y GNU-C++, el signo se mantiene, lo que significa que el desplazamiento se realiza contando con el signo, el nuevo bit más significativo será 0 si se trata de un número positivo y 1 si el número es negativo ( 2.2.4a).

Fuente: http://www.zator.com/Cpp/E4_9_3.htm (http://www.zator.com/Cpp/E4_9_3.htm)
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 06 Enero, 2013, 12:03 pm
Una cosa que no te expliqué es por qué diablos mi cambio de 1 a 1u arregló todo.
La razón es muy oscura.

Tiene que ver con la promoción automática de tipos de datos enteros en una operación aritmética.
Fijate que, aunque (1u << k) ahora es un unsigned int, gracias al sufijo u, resulta que n = -2 sigue siendo negativo.

Así que, ¿qué es lo que ocurre cuando hacemos (n & (algo-unsigned-int))?

Además, debemos recordar que estamos en la situación en que el "algo" tiene un bit izquierdo igual a 1.

Ahí hay que estudiar las complicadas reglas de promoción de tipos.
La verdad es que no me quedan muy claras estas reglas (están en la sección 7.4 del libro de King).
Pero es posible que ambos operandos hayan promocionado a unsigned int antes de llevar a cabo la operación &, y entonces el resultado se consideraría de tipo unsigned int.
En ese caso, el posterior corrimiento a la derecha con >> k, k = 31, provocaría que se agreguen 0's por la izquierda...

 :banghead: :banghead: :banghead:
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 06 Enero, 2013, 12:24 pm


Me parece que en este caso lo más adecuado sería hacer una pausa con una llamada al sistema, así:

system("PAUSE");

previamente adosando la librería stdlib.h



 Muchas Gracias, Argentinator, eso es lo que buscaba, un comando tipo el stop() como el del Java u otros lenguajes así; sabía que tenía que tenerlo, porque el "C" es el padre de todos estos lenguajes.

 Yo recuerdo cuando apareció el "C" en el mercado allá por los años ochentaitantos, leí un artículo en una de aquellas revistas (No sé si era Micromanía, Microhoby, o Microsoft, que también entonces tenía su revista para usuarios de Spectrum, Comodore y MSX). Se decía que incorporaba una serie de características revolucionarias respecto de los lenguajes más usados en aquella época, como Pascal, Cobol o Basic. Y una de esas cosas era que se compilaba más fácilmente y que corría como un lenguaje de bajo nivel. Por entonces existían compiladores para el Basic, y muchos "videojuegos" (llamémosles así aunque haya una gran diferencia con los de hoy)  se escribían en ese lenguaje y después se compilaban (aunque había quien escribía juegos y programas pokeando binarios directamente en memoria, o sea, no ya en ensamblador, sino en el más puro código máquina; también leí un artículo, en una de esas revistas, sobre un estudiante de colegio que programó así un juego comercial para "Dinamic", una firma famosa de entonces de juegos para ordenador).
 Y es que el Basic de la primera época tenían comando llamado Poket con el que se podía hacer eso, meter los bytes a mano directamente en una dirección de memoria de la pila de máquina; así, por ejemplo, podías cambiar de golpe el color de la pantalla, la dirección del cursor, las mayúsculas... o introducir una orden "stop" que bloqueaba el Basic y tenias que apagarlo.

 Bueno, que me he enrollado :D voy a leer lo que habéis escrito.

 Saludos.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 06 Enero, 2013, 01:57 pm
Una cosa que no te expliqué es por qué diablos mi cambio de 1 a 1u arregló todo.
La razón es muy oscura.

Tiene que ver con la promoción automática de tipos de datos enteros en una operación aritmética.
Fijate que, aunque (1u << k) ahora es un unsigned int, gracias al sufijo u, resulta que n = -2 sigue siendo negativo.

Así que, ¿qué es lo que ocurre cuando hacemos (n & (algo-unsigned-int))?

Además, debemos recordar que estamos en la situación en que el "algo" tiene un bit izquierdo igual a 1.

Ahí hay que estudiar las complicadas reglas de promoción de tipos.
La verdad es que no me quedan muy claras estas reglas (están en la sección 7.4 del libro de King).
Pero es posible que ambos operandos hayan promocionado a unsigned int antes de llevar a cabo la operación &, y entonces el resultado se consideraría de tipo unsigned int.
En ese caso, el posterior corrimiento a la derecha con >> k, k = 31, provocaría que se agreguen 0's por la izquierda...

 :banghead: :banghead: :banghead:


En el libro "The new C Standard", en la regla 714 (que requiere tener en cuenta algunas otras reglas previas), especifica esto:

Citar

Otherwise, if the operand that has unsigned integer type has rank greater or equal to the rank of the type signed integer
converted
to unsigned
of the other operand, then the operand with signed integer type is converted to the type of the operand with
unsigned integer type.

El "rank" o rango, se refiere a una definición que da en la regla 661, que básicamente considera que los tipos enteros long long (con o sin signo) tienen estrictamente mayor que los tipos long, y estos mayor rango que los int, y estos mayor ranto que los short, y estos mayor que _Bool.

Es sólo una definición matemática, un orden parcial.

Además, ambos long long (con o sin signo) se consideran del mismo rango, así como ambos long, etc.

_________

La consecuencia es que (signed int) & (unsigned-int) obliga a promocionar a ambos operandos a (unsigned int).
En particular, si tu lado izquierdo era el negativo n = -2, ahora se convirtió en un número positivo, vaya uno a saber cuál.

Esta regla puede tener muchos resultados indeseados.

Fijate lo que pasa cuando ejecutamos estas dos líneas:

   printf("Es positivo? %d\n\n", (-1 + 0u) > 0);
   printf("Es positivo? %d\n\n", (-1 + 0) > 0);

En el primer caso, el resultado es 1,
y en el segundo es 0.
 ??? ??? :o :o :o :o

Y eso que son números muy sencillos: estoy comparando el -1 contra el 0, a ver cuál es mayor.
En el primer caso, como 0u es de tipo (unsigned int) y el -1 es de tipo (signed int), la regla 714 nos dice que, en la operación binaria (de suma en este caso) (-1 + 0u): el -1 se convierte a (unsigned int). Luego sumamos, y el resultado es un (unsigned int).
Como es distinto de 0, y no tiene signo, al compararlo con 0 nos da que es mayor.

En el segundo casi, tanto el -1 como el 0 en la suma -1+0 son de tipo (signed int), y así no hay promoción. La suma me da -1, como debe ser, y al comparar con 0 me da que es negativo.

__________

Cuando intentamos visualizar el valor de (-1 +0u), obtenemos con printf el valor -1.
O sea que "pareciera" que está todo bien.

En realidad, el printf, con el modificador %d, lo que hace es asumir que "lo que le tiramos ahí" es un "signed int".

Así que, aunque (-1 + 0u) es un unsigned (positivo), el printf lee la versión binaria de un "signed", que coincide con -1.

Si no me creés que esto realmente funciona mal, lo que podemos hacer es dividir por 2.
Si el "-1" es legítimo, la división entera por 2 tiene que dar resultado 0: (-1 / 2) en C da 0.
Pero si yo tengo razón, y el (-1 + 0u) es "trucho", entonces lo que hacemos al dividir por 2 es tomar el número 1111.......... en tipo unsigned int ( que sería el \( 2^{32}-1) \)), y al dividirlo por 2 nos da un número entero positivo grande, que el printf es capaz de mostrar:

   printf("(-1 + 0)/2 = %d\n\n", (-1 + 0) / 2);
   printf("(-1 + 0u)/2 = %d\n\n", (-1 + 0u) / 2);

Cuando corro el programa con esas dos líneas, me da esta salida:

(-1 + 0)/2 = 0

(-1 +0u)/2 = 2147483647

Lo cual muestra que ando en lo cierto.  >:D >:D >:D

Pero fijate que no hay solución a este desperfecto, porque viene así definido ya desde las reglas del estándar (la regla 714).  :banghead: :banghead: :banghead:
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 06 Enero, 2013, 02:04 pm


Me parece que en este caso lo más adecuado sería hacer una pausa con una llamada al sistema, así:

system("PAUSE");

previamente adosando la librería stdlib.h



 Muchas Gracias, Argentinator, eso es lo que buscaba, un comando tipo el stop() como el del Java u otros lenguajes así; sabía que tenía que tenerlo, porque el "C" es el padre de todos estos lenguajes.

 Yo recuerdo cuando apareció el "C" en el mercado allá por los años ochentaitantos, leí un artículo en una de aquellas revistas (No sé si era Micromanía, Microhoby, o Microsoft, que también entonces tenía su revista para usuarios de Spectrum, Comodore y MSX). Se decía que incorporaba una serie de características revolucionarias respecto de los lenguajes más usados en aquella época, como Pascal, Cobol o Basic. Y una de esas cosas era que se compilaba más fácilmente y que corría como un lenguaje de bajo nivel. Por entonces existían compiladores para el Basic, y muchos "videojuegos" (llamémosles así aunque haya una gran diferencia con los de hoy)  se escribían en ese lenguaje y después se compilaban (aunque había quien escribía juegos y programas pokeando binarios directamente en memoria, o sea, no ya en ensamblador, sino en el más puro código máquina; también leí un artículo, en una de esas revistas, sobre un estudiante de colegio que programó así un juego comercial para "Dinamic", una firma famosa de entonces de juegos para ordenador).
 Y es que el Basic de la primera época tenían comando llamado Poket con el que se podía hacer eso, meter los bytes a mano directamente en una dirección de memoria de la pila de máquina; así, por ejemplo, podías cambiar de golpe el color de la pantalla, la dirección del cursor, las mayúsculas... o introducir una orden "stop" que bloqueaba el Basic y tenias que apagarlo.

 Bueno, que me he enrollado :D voy a leer lo que habéis escrito.

 Saludos.

En el no muy famoso sistema operativo DR-DOS 6.0, alguna vez fui capaz de meter "bits en bruto" en la línea de comandos, logrando borrar la pantalla.

Otra cosa que uno puede hacer, si quiere jugar con bits en bruto, es mandar bytes diseñados a mano a una impresora matricial, anteponiendo un comando de la impresora que admite "modo gráfico" por así decirlo, y uno puede controlar el dibujo de lo que quiera ahí...

Son cosas de frikis todas estas cuestiones...

La cuestión es que en las viejas épocas es común que se haya elogiado al C por encima de otros lenguajes.

Aún así, el C en esas épocas no estaba tan pulido ni era tan bueno como lo fue años después.

Hoy día el C tiene que competir con lenguajes que tienen paradigmas más modernos, y que encima son sólidos.

Creo que una de las cosas que permiten sobrevivir al C es que  uno puede aprender lo básico de él fácilmente, como para largarse a programar. Es simple, dentro de todo.

____________-

Ahora, fijate lo que le contesté a PabloN: escribí un par de líneas que comparan -1 con 0, y en un caso me da que -1 es mayor y en otro que es menor.  >:D
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 06 Enero, 2013, 02:11 pm
Bien. Una cosa: Pensad (me dirijo también a Pablo como profesor adjunto, si no te pones celoso :D ) que yo en esto soy un hombre de Crogmanon; que en sus tiempos sólo fue hombre de Crogmanon aficionado y además un hombre de Crogmanon con menos memoria de la que tenían los primeros ordenadores personales.
  Por tanto, si vas a explicar estas cosas que dice Pablo, tendrás que ir pasito a pasito y despacio porque si no me va a costar muchísimo seguirte.

 El primer ordenador que tuve (con 27 años, ya no era un niño) tenía 48 kb de memoria RAM (incluida la reservada para el sistema) no tenía disco duro y su microprocesador era un Z80 (así que daos cuenta). Muchos años después tuve ya un PC que me regalaron y en el cual todavía se incluía el Basic como lenguaje de programación que venía de fábrica.
Aprendí muy por encima algunos comandos de MS2 y leí y puse en practica sólo lo básico. En cuanto al código máquina y la programación del micro (cómo opera el microprocesador mediante la alteración del séptimo bite para considerar números negativos -o sea, lo del complemento a dos- y después el comando ADD, carga de registros en el acumulador "A", los saltos JUMP y todas esas cosas) también leí un par de libros sobre el Z80 y el 486, pero como curioso nada más, no como estudiante.
 
 Lógicamente, tengo mejor grabadas en mi memoria, y tampoco demasiado, las cosas antiguas, y las nuevas, por las que me he interesado más tarde o muy recientemente, me cuestan más.
 El Basic era un lenguaje de un nivel muy alto donde todo era muy intuitivo, aprendías a programar sólo con analizar rutinas someramente, porque eran literales ("for a=1 to 6; next a" y cosas así).
 Aunque después he leído y he hecho algunas cosillas de vez en cuando sobre programación tipo lenguajes Java y PHP, no termino de acostumbrarme a pensar con soltura en ellos, tengo que ir despacio, por la sintaxis.

 Otra cosa más por último. Ya que Pablo habla de Java, sí que me parecía interesante, más adelante en el curso, introducir conceptos y rutinas de los lenguajes que yo llamo de la familia Java (que son todos el mismo, prácticamente, salvo dos o tres cosas) o bien montar un curso especial para estos lenguajes. No creo que sean, hoy en día, menos importantes que el "C" ( :o ) las webs de todo tipo están repletas de programación Java y PHP, son los lenguajes imprescindibles para la programación en Internet; fíjate por ejemplo en el CSM que utiliza el foro, está hecho en PHP (y supongo que también llevará Javascript) lo mismo que todos, todos, los gestores de contenidos que existen, Simple Machines Forum, Joomla, Oscomerce, los Wikis de todo tipo...

 Así que yo creo que, más adelante, sería estupendo un curso de lenguajes Java; o bien bifurcar este mismo curso, ya que tienen comandos y cosas en común con C. Existen cursos gratis de éstos en la red, pero no con tutor; los que llevan tutorías incluidas son de pago.

 Saludos.
  
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 06 Enero, 2013, 02:17 pm
Bueno feriva, esta es la sección de comentarios, y da para hablar de cualquier cosa.

Me he adelantado bastante con temas complicados como el de la promoción de tipos de datos enteros, porque tiene que ver con el programita que hizo PabloN.

Pero, en lo que se refiere al curso que voy llevando, basta conque se entienda lo que he escrito hasta ahora en las notas teóricas.

Así que no te preocupes si no se entiende alguna cosa que discutamos acá en los comentarios, porque pueden estar muy salidas de la teoría.

En las notas teóricas he analizado sólo la primer parte de la discusión sobre la promoción de tipos de datos enteros.
No he llegado aún allí al tema de la promoción de tipos, en presencia de operadores, sino sólo la adjudicación de tipos según cómo se escriban las constantes numéricas en un programa fuente.

Lo que le expliqué a PabloN está en un terreno mucho más resbaladizo todavía.

Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 06 Enero, 2013, 02:19 pm


Ahora, fijate lo que le contesté a PabloN: escribí un par de líneas que comparan -1 con 0, y en un caso me da que -1 es mayor y en otro que es menor.  >:D

Estaba escribiendo la respuesta anterior y no había ésta visto aún. Luego lo miro despacito; como ya decía ahí, soy un Cromagnon, hago fuego con dos palos y poco más, vosotros sabéis un montón y lo tenéis bien aprendido como profesionales, pero yo...  :P programo más "intuitivamente", a base de probaturas, método prueba-error-fallo-desastre (anoche día reinstale la IDE, porque la dejé para la rastre de tocar cosas. Así es como aprendo yo, equivocándome; vamos, quiero decir más bien que espero aprender algún día :D )

Saludos
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 06 Enero, 2013, 02:29 pm
Bueno feriva, pero lo que pasa es que todo depende de qué cosa estemos haciendo.

Si se trata de programar cosas más o menos normales, seguro que ya sabés de qué va el tema, y no vas a tener dificultades.

Pero yo lo que me he puesto a discutir es sobre las especificaciones técnicas más intrincadas del lenguaje C.
Ese tipo de cosas yo las estoy aprendiendo ahora, y me sorprende descubrir algunos detalles inesperados.

Meterse en los detalles técnicos de la definición del lenguaje C es costoso, porque no requiere programas complicados, sino mucho esfuerzo mental, jejeje.

Fijate que el programita que demuestra que el C anda para el diablo, tiene dos líneas:

#include <stdio.h>

int main(){
   
   printf("(-1 + 0)/2 = %d\n\n", (-1 + 0) / 2);
   printf("(-1 + 0u)/2 = %d\n\n", (-1 + 0u) / 2);
   getchar();
}

En ambas líneas se muestra el resultado, supuestamente, de dividir -1 por 2.
Como la barra / hace división entera, toma la parte entera, y descarta los decimales.
El resultado esperado de -1/2 es, entonces, igual a 0.

La primer línea muestra ese resultado correctamente cuando se ejecuta el programa.
Pero la 2da línea muestra de resultado 2 mil millones y pico, que es un disparate total.

La razón de fondo es que hay un problema con la conversión de varios tipos distintos de enteros en las sumas, lo cual trae aparejado resultados impredecibles a nivel de bits, y el programa termina interpretando cualquier cosa.

No hace las operaciones en forma correcta matemáticamente.

Este ejemplo es muy sencillo, y aunque sea algo arduo entender cómo se genera ese error, lo importante es entender cómo evitar que se produzca, porque fijate que se trata de operaciones muy sencillas (-1 más cero dividido por 2), que nos dan un desastre inaceptable.

La moraleja de esto es que hay que llevar el control cuidadosamente de los tipos de datos que estamos usando.
Y en lo posible, ser uno quien obligue a que todos los operandos de nuestros cálculos pertenezcan uniformemente a un mismo tipo de datos.

Esto se logra de varias maneras, que otro día explicaré.

_______________

En cuanto a explicar Java, no será parte de este curso...  :'(

Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 06 Enero, 2013, 03:51 pm


Meterse en los detalles técnicos de la definición del lenguaje C es costoso, porque no requiere programas complicados, sino mucho esfuerzo mental, jejeje.


Claro, mi problema es que, por culpa de mi memoria y falta de práctica, cada vez que tengo que acordarme de cuántos bits, en decimal, tiene un byte o cosas así (de esto sí me acuerdo, creo que eran 256) pues se me olvida y tengo que buscar en libros o en Internet; y por culpa de no tener memorizados esos datos básicos que habitualmente cualquier profesional tiene en su cabeza, me cuesta esfuerzo y voy despacio; por eso y por la vista  8^) también, pero ésa es una "despaciéz" aparte, de etiología distinta a la que estamos hablando.
 No suelo tener dificultad en cuanto a comprensión, si una cosa es lógica y está bien explicada, la suelo entender; puedo tardar más o menos, según lo largo y abstruso del argumento, pero si me pongo, acabo entendiendo. Mi cruz son las muchas nomenclaturas, numeritos, símbolos y sus significados, que o no me los sé o se me olvidan fácilmente; esto se soluciona consultando a don Google cada dos por tres, pero, claro, se resiente la "dinámica", es lento.

Citar

Fijate que el programita que demuestra que el C anda para el diablo, tiene dos líneas:

#include <stdio.h>

int main(){
   
   printf("(-1 + 0)/2 = %d\n\n", (-1 + 0) / 2);
   printf("(-1 + 0u)/2 = %d\n\n", (-1 + 0u) / 2);
   getchar();
}


 ¿Cómo entiende "0u" la maquina, qué es para ella la u, un indicador de estado de algún bit de cierto byte relacionada con alguna dirección importante de memoria; una orden...? Quizá lo supe, pero si lo supe no me acuerdo; ¿ves?, es lo que me pasa. 

Citar

En cuanto a explicar Java, no será parte de este curso...  :'(



Bueno, no te preocupes, comprendo que das muchos cursos a la vez y tiene que ser un lío; pero quizá algún moderador experto en informática podría...   ::)

Saludos.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 06 Enero, 2013, 04:08 pm
Citar
¿Cómo entiende "0u" la maquina, qué es para ella la u, un indicador de estado de algún bit de cierto byte relacionada con alguna dirección importante de memoria; una orden...? Quizá lo supe, pero si lo supe no me acuerdo; ¿ves?, es lo que me pasa. 

Eso lo expliqué en la teoría de las constantes de tipo entero: http://rinconmatematico.com/foros/index.php?topic=64835.msg260467#msg260467 (http://rinconmatematico.com/foros/index.php?topic=64835.msg260467#msg260467)

Cuando se escribe un número entero seguido de u: 3449u,
el lenguaje C lo interpreta matemáticamente como lo que se ve ahí: el número 3449.
Pero internamente considera que el tipo de datos al que pertenece ese número es un unsigned int. (Un entero sin signo).

Acá el inconveniente es que hay muchos tipos de datos diferentes, pero que tienen significados muy parecidos, e incluso trabajan juntos, se mezclan, y hasta se convierten automáticamente unos en otros, según se le antoje al compilador.

Eso es muy complicado de entender en todo detalle.  >:(

Hice el esfuerzo de explicar, al menos, qué pasa con las constantes.

La constante 3449 matemáticamente es la misma para C que 3449u.
Pero el 3449 lo considera, automáticamente, como un dato de tipo signed int.
Mientras que 3449u es un unsigned int.

Hasta ahí sólo hay una asignación de "tipos de datos" que es interna, y no tiene por qué afectarnos.

Pero ahora viene el problema de que tenemos que sacar cuentas con esos datos.
¿Qué pasa si queremos sumar datos que son de distintos tipos?
¿Cómo los toma el compilador?

Si tomo el dato 20 (que es de tipo signed int) y le sumo 20u (que es de tipo unsigned int), ¿qué hace el compilador cuando quiero sumar 20 + 20u?

El resultado matemático en cualquier caso va a ser, por suerte, 40.
Pero lo que no sabemos es de qué tipo es ese 40.
Para especificar eso hay que consultar las reglas de "promoción de tipos".
Sin entrar en demasiados detalles, en este caso el compilador va a transformar el 20 en un 20u, o sea que 20 + 20u se convierte en un primer paso a 20u + 20u, luego se suma, lo cual da 40u (quiero decir, un 40, pero de tipo unsigned int).

El problema está cuando el compilador convierte automáticamente números negativos a tipos "que no tienen signo".
Ahí le cambia no sólo el tipo de datos al número, sino que trastoca el significado que tenían los bits internos del dato guardado en memoria.

El resultado de esto se torna impredecible.
Así, un (-1) convertido a (unsigned int) nos dejará un número positivo sin sentido para nosotros.

A partir de ahí, cualquier serie de cálculos que hagamos, tendrán errores.

Si no nos damos cuenta de que el compilador está haciendo estas conversiones automáticas de tipos, en el aire, y sin avisar, no tendremos control sobre errores imprevistos en ciertos cálculos.
Es un tema peligroso.

________________________________

Citar
cuántos bits, en decimal, tiene un byte

Un byte tiene 8 bits, lo cual permite representar 256 números enteros, que van del 0 al 255 si son sin signo, y de -128 a 127 si son "con" signo.

Es el caso de los tipos unsigned char y signed char, por ejemplo.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 06 Enero, 2013, 04:11 pm
La u es un sufijo, que se puede aplicar a constantes numéricas enteros, para forzar al compilador a que considere ese número como perteneciente a uno de los tipos "unsigned" (sin signo).

Igual esto de la u no hace falta para entender el problema.

Este otro programa creo que es más claro, y tiene la misma dificultad con los tipos de datos y el compilador:


#include <stdio.h>

int main(){
    unsigned int cero = 0;

    printf("(-1 + cero)/2 = %d\n\n",  (-1 + cero) / 2 );

    getchar();
}

Al correr ese programa, muestra como resultado 2 mil millones y pico, que no es lo esperado.

El problema está en que el operador de suma: +
hace una conversión de tipos de datos desastrosa,
al convertir el -1 a un entero sin signo, dejando la representación interna de bits a su suerte.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 06 Enero, 2013, 06:06 pm


El problema está en que el operador de suma: +
hace una conversión de tipos de datos desastrosa,
al convertir el -1 a un entero sin signo, dejando la representación interna de bits a su suerte.


Veámos, voy a intentar interpretarlo a ver si estoy en lo cierto:


#include <stdio.h>

// Incluye una librería con una serie funciones prefijadas entre la las cuales, imagino, está definido el significado de “int”, “ unsigned”, etc.

int main()

// Supongo que quiere decir que en el área local, o zona de la memoria principal donde se guardan las rutinas del programa, todas las variables o constantes que se definan serán entendidas por la máquina como valores enteros.


{
    unsigned int cero = 0;

// Esto no sé del todo cómo entenderlo, parece que define una constante llamada “cero” la cual es definida a su vez como entera, sin signo y de valor 0. Los entresijos del comando unsigned -en cuanto al funcionamiento de la máquina- se me escapa; yo sé que hasta el 127 decimal los entiende positivos , así, el -1 se expresa como 256-1, el -2 como 256-2...  y cuando llega al 127 es positivo; esto depende en binario del séptimo bit, que pasa a valer 0 de 127 para abajo... Dado esto, no sé cómo la hace para considerar un número sin signo, pues el séptimo bit será cero ó 1; creo que nunca lo estudié o nunca leí sobre ello. 

    printf("(-1 + cero)/2 = %d\n\n",  (-1 + cero) / 2 );

// Aquí se imprime un par de números separados por una coma. Creo, por lo que he ido viendo, que la instrucción %d llama a un tipo de variables o cosntantes (alfanuméricas, numéricas enteras, etc., según la letra que va detrás del %); en este caso parece que guarda el resultado  de  (-1 + cero)/2, pero no estoy seguro del todo de cómo funciona, es una instrucción muy nueva para mí que no recuerdo haber manejado mucho; leí que cuando es %c se refiere a variables tipo char o algo así pero poco más. El otro número detrás de la coma no va entre comillas, por tanto no es un valor “alfanumérico” (que digo yo en plan antiguo, no sé si se usa así todavía) con lo que la cuestión puede estar también relacionada con este tema del tipo de variables que resultan incompatibles según las instrucciones

   

De todas formas, no te pares mucho por mí, porque este curso puede estar siendo seguido por gente más al día que yo en estas cosas y que se puede aburrir de ir despacio; yo te sigo como pueda, si me entero, bien, y, si no me entero, ya me iré enterando poco a poco.

Saludos  y gracias.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 06 Enero, 2013, 07:18 pm

Veámos, voy a intentar interpretarlo a ver si estoy en lo cierto:


#include <stdio.h>

// Incluye una librería con una serie funciones prefijadas entre la las cuales, imagino, está definido el significado de “int”, “ unsigned”, etc.


No.
El significado de "int", "unsigned", etc., viene establecido directamente en el compilador, no en las librerías.

La librería "stdio.h" sólo define funciones de entrada y salida de datos, como la función printf() y la función scanf(). También getchar(), el tipo de datos FILE* para manejar archivos, etc.

Citar
int main()

// Supongo que quiere decir que en el área local, o zona de la memoria principal donde se guardan las rutinas del programa, todas las variables o constantes que se definan serán entendidas por la máquina como valores enteros.

NO.

Lo que rodea al "main" para nosotros es irrelevante.
Ese "int" está ahí porque lo puso PabloN.

Lo único que hace eso es enviar un número con código de error al sistema operativo, una vez que el programa terminó.

Citar
{
    unsigned int cero = 0;

// Esto no sé del todo cómo entenderlo, parece que define una constante llamada “cero” la cual es definida a su vez como entera, sin signo y de valor 0. Los entresijos del comando unsigned -en cuanto al funcionamiento de la máquina- se me escapa; yo sé que hasta el 127 decimal los entiende positivos , así, el -1 se expresa como 256-1, el -2 como 256-2...  y cuando llega al 127 es positivo; esto depende en binario del séptimo bit, que pasa a valer 0 de 127 para abajo... Dado esto, no sé cómo la hace para considerar un número sin signo, pues el séptimo bit será cero ó 1; creo que nunca lo estudié o nunca leí sobre ello. 

Bueno, no te compliques con eso, porque la representación binaria interna de los números no es algo que nos importe del todo.
Te explico por qué. El lenguaje C no es lenguaje de máquina, y entonces la manera en que se representan internamente los datos depende de cada compilador.
No es algo que te puedas aprender, porque no está fijado por las reglas del lenguaje C.

Un programador en C no tiene por qué saber o supone cómo se representan los números (o cualquier dato) internamente.

La declaración:

unsigned int cero = 0;

lo que hace es definir una variable, llamada cero, de tipo unsigned int.
Esto quiere decir que lo que fuere que hayamos guardado en esa variable, siempre se va a interpretar como un número entero positivo (o 0).
Eso quiere decir "sin signo".

____________

No se trata de si el -1 es un número positivo o negativo para el C.
De lo que se trata es de cómo lo interpreta, según el tipo de datos de la variable en que fue almacenado.

No es lo mismo el 0 de un "unsigned int" que el 0 de un "signed int".
Ambos se representan igual internamente, así: 00000000.......
Es muy fácil representar el 0.
Y aunque se representan de la misma forma, son datos de distinto tipo.

La distinción de tipos de datos es una convención "de alto nivel", no es algo que puedas ver en los bits de la máquina, sino que es una convención del lenguaje.

Un ejemplo más práctico quizá te lo muestre mejor.
El caracter '@' se representa en binario internamente: 01000000.
Eso también es el código binario del número decimal 64.

Ambos se escriben en memoria como 01000000, pero el '@' representa un dato de tipo "char", mientras que 64 representa un dato de tipo "int".

¿Cómo sabe el C que son datos de distinto tipo?
Bueno, lo que hace el C es armarse una tablita con todas las variables y las constantes, y memoriza el tipo de datos de cada dato.

Cuando declaramos una variable

int x;

el compilador de C no sólo reserva una posición de memoria para la x,
sino que además memoriza en alguna parte que esa posición de memoria es de cierto tipo, en esta caso "int".

Se trata de un atributo adicional de la variable, que suele ser invisible para nosotros.

Citar
printf("(-1 + cero)/2 = %d\n\n",  (-1 + cero) / 2 );

// Aquí se imprime un par de números separados por una coma. Creo, por lo que he ido viendo, que la instrucción %d llama a un tipo de variables o cosntantes (alfanuméricas, numéricas enteras, etc., según la letra que va detrás del %); en este caso parece que guarda el resultado  de  (-1 + cero)/2, pero no estoy seguro del todo de cómo funciona, es una instrucción muy nueva para mí que no recuerdo haber manejado mucho; leí que cuando es %c se refiere a variables tipo char o algo así pero poco más. El otro número detrás de la coma no va entre comillas, por tanto no es un valor “alfanumérico” (que digo yo en plan antiguo, no sé si se usa así todavía) con lo que la cuestión puede estar también relacionada con este tema del tipo de variables que resultan incompatibles según las instrucciones

En una futura ocasión voy a explicar mejor cómo funciona el printf().

Pero en esencia, la opción %d dice que en ese lugar se va poner un número, que es el primer dato o expresión que aparece después de la coma.

Algo más fácil de entender sería poner esto:

printf("Resultado: %d   ", (-1 + cero) /2);

Qué hace el printf acá no importa mucho.

Lo que importa es qué hace la simple y tonta suma.

El problema está en la cuenta (-1 + cero).
Eso es el meollo de todo.
Como cero lo hemos definido como 0, la cuenta (-1 + cero) tendría que darnos, según lo que sabemos tanto de matemática, como del lenguaje C, un simple valor -1.

Pero no nos da eso, sino cualquier otra cosa.
Ese otro número que da, "2 mil millones y pico", no importa cuánto es, ni cómo se forma, ni qué pasó con sus bits.
Eso no tiene importancia porque depende de cada compilador,
y no es algo que esté definido en el lenguaje C.

O sea que con otro compilador puede darnos cualquier otro número, equivocado o no.

El problema está en que hay unas ciertas reglas de conversión automática de tipos de datos que el lenguaje C exige, y ahí se arma el desastre.

El -1 es de tipo "signed int",
mientras que nuestra variable "cero" fue declarada de tipo "unsigned int".

No interesa acá si el -1 es negativo, positivo, 0, sino de qué tipo es.

Lo que hace el signo de suma +, antes de sumar, es convertir los tipos de datos de los sumandos.
Recién después efectúa la suma.
Son dos tareas las que hace el aparentemente inofensivo operador +.

Primero convierte ambos operandos al tipo "unsigned int".
No le importa qué le ocurre al -1 en esa conversión.
Luego los suma.

___________

Para distinguir mejor las cosas.
Supongamos que lo que hago es la suma (1 + cero).
La situación es la misma, sólo que en este caso no se ven los efectos.

Pero en este caso, en la suma (1 + cero),
el primer sumando, el 1, es considerado como "signed int", igual que el -1 de antes.
No importa que el 1 sea positivo. Se considera como un "entero con signo" de todos modos.

Como la variable "cero" es "unsigned", se aplica la misma regla de antes,
y así, primero se convierten ambos sumandos al tipo "unsigned int",
y recién después se suma.

_____________________________

En la matemática tenemos una situación similar al sumar enteros y naturales.

Si tenemos el número 1 del conjunto N de los naturales,
¿es lo mismo que el número 1 del conjunto Z de los enteros?
¿Se pueden sumar ambos?

La respuesta a esto es ambigua si no precisamos bien el contexto.

En principio, N y Z no tienen por qué ser compatibles,
o sea, no sabemos si N es un subconjunto de Z.

Sin embargo, sabemos que Z tiene un subconjunto Z+, que "funciona" igual que N.
Si "convertimos" los números de N (mediante una biyección) a números del subconjunto Z+ de Z, entonces ahora sí que podamos sumar ambos "1"s.

Lo que confunde es nuestro propio abuso de notación.

En la computadora pasa algo parecido: los tipos de datos distintos representan conjuntos de números distintos, y para poder mezclarlos, primero se tiene que hacer alguna clase de identificación, o conversión.

Si no se hiciera esto, directamente nos daría error por todas partes al compilar.

¿Qué significa todo esto?
Bueno, que el C tiene muchos tipos de datos numéricos, para distintas necesidades, y que el C intenta que todos esos tipos distintos sean compatibles entre sí, aún en malas situaciones.

El resultado es que pueden darse situaciones extrañas, difíciles de predecir, si no se programa con cuidado.

Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 06 Enero, 2013, 07:43 pm


Primero convierte ambos operandos al tipo "unsigned int".
No le importa qué le ocurre al -1 en esa conversión.
Luego los suma.



Ah, claro, debería haber sospechado eso aunque no tenga experiencia con este lenguaje; porque cosas así, relacionadas con este tipo de despistes, me han pasado muchas veces con otros lenguajes y hasta con el HTML, que ya es decir; ya te puedes imaginar, con lo despistado que soy yo :D me pasa todo los días, con el ordenador y con todo.
 El ejemplo del conjunto de los naturales y los enteros me parece muy apropiado; y también meto en eso de vez en cuando la pata, el foro ya me habéis visto hacerlo unas cuantas veces, pero lo malo es que me pasa hasta a la hora de pagar cuando voy a la compra :D

Gracias; y no dejes el curso, que Mente oscura ha dicho por ahí que la hoja de cálculo se le queda pequeña para sus cosas de primos y necesita aprender a usar algo más potente; le he recomendado que lo siga.

Saludos. 
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 06 Enero, 2013, 07:59 pm
Te hago un comentario adicional.

En lenguajes como BASIC o Pascal, no está permitido intercambiar ciertos tipos de datos distintos.

Sobretodo Pascal es muy restrictivo con ese tipo de cosas.

En Pascal no se puede sumar un "char" con un "integer", pero en C sí se puede.
El ejemplo de Pascal muestra más claro qué quiere decir tener tipos de datos distintos.
Son atributos de las variables, que no tienen nada que ver con el dato que guardan dentro de sí.

Las reglas de conversión de tipos de datos que sigue el C, no se fijan en ningún momento en el valor concreto que tienen las variables, sino sólo en cuál es el "tipo de datos" que tiene establecido.

Se hace luego una conversión de tipos, sin fijarse si tenemos albergado un 1 un -1, un 0, etc.
El compilador no se fija en esto cuando mezcla y convierte tipos.

Por eso no hay que marearse con el signo "-" del -1,
porque si fuera +1 el valor, al compilador le da lo mismo, ya que en ambos casos "ve" un "tipo de datos signed int".
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 06 Enero, 2013, 08:21 pm
Te hago un comentario adicional.

En lenguajes como BASIC o Pascal, no está permitido intercambiar ciertos tipos de datos distintos.



Nunca probé el Pascal, pero por lo que dices se ve que es de más alto nivel que el C, ya se sabe que cuanto más bajo es el nivel más fácil es equivocarse, son lenguajes más "pasotas", dejan hacer de todo y... antes de que te des cuenta se te bloquea el ordenador. No sé si el C será apropiado para mí :) (bueno, hoy en día, un programa, incluso un sistema operativo, se abre y se cierra en segundos; tampoco pasa nada)
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: pierrot en 06 Enero, 2013, 08:25 pm
Sobre este punto estoy teniendo el cuidado de diferenciar hasta dónde el estándar asegura tal o cual cosa, y a partir de dónde es que ya no asegura nada, y las decisiones las toma el compilador que nosotros usamos.

En tu frase:

Citar
se puede investigar sobre cómo representa C cada tipo de datos.

Lo correcto sería decir "se puede investigar sobre cómo representa el compilador GCC cada tipo de datos".  ;) ;) ;)

Sí, ya veo que es así. Creí que había más uniformidad de criterios entre los compiladores pues, por ejemplo, tengo entendido que un "string" internamente no es más que un "array" de caracteres que termina en '\0' (el 00000000 de ASCII) y es así independientemente de los factores que mencionaste: el compilador usado, las opciones de compilación elegidas, la versión del sistema operativo en que corre, la máquina en que se está ejecutando, etcétera. Supuse que algo similar ocurriría con el tipo entero, al menos en lo que refiere a si usa complemento a dos, complemento a uno, desplazamiento o vaya a saber qué.

En la universidad lo que enseñan es a razonar algoritmos, y el lenguaje es tema secundario, lo cual está bien, porque uno tiene que aprender a pensar los problemas informáticos en forma independiente al lenguaje que está usando.

Exacto. De hecho, no estudiamos códigos sino pseudocódigos  :laugh:. Cuando le hablas a un profesor de una implementación particular, tiende a molestarse. Con ellos sólo se puede hablar a alto nivel. De hecho, los que dan teórico no están muy al tanto de los pormenores del lenguaje; los de práctico sí. Está relacionado con lo que tú decías al principio de que hay gente que parece no interesarle que un programa es algo que va a "aterrizar" a una computadora concreta en algún momento dado.

Ahora estoy con los tipos de datos, sin analizar los operadores, que son muchos.
Pero me parece muy bien la sugerencia, seguramente le dedicaré sus buenos capítulos.

Estaré atento  ;).

Creo que el problema podía estar en el tipo de datos que automáticamente se asigna a los números enteros.

Según las reglas de asignación de tipos, el 1 "intenta" ser un signed int, si es que cabe ahí.
Como cabe, lo pone de ese tipo.
Después, la operación (1 << k) conserva el tipo de datos, porque es sólo un corrimiento de bits.
El resultado será un entero positivo para k < 31 porque el bit de signo sigue siendo 0.
Mientras que para k = 31, el "1" ya ha llegado al bit de signo, el primero de todos: 1000000000...
En ese caso, como se trata de un signed int, el valor que toma es el de un número negativo, el más negativo de todos, digamos.

Claro, resulta el más negativo de todos.

El código siguiente:

for(k=0; k<=31; k=k+1)
      printf("k==%d: (1 << k) == %d\n  ",k, (1 << k));

Genera esta salida:

  k==0: (1 << k) == 1
  k==1: (1 << k) == 2
  k==2: (1 << k) == 4
  k==3: (1 << k) == 8
  k==4: (1 << k) == 16
  k==5: (1 << k) == 32
  k==6: (1 << k) == 64
  k==7: (1 << k) == 128
  k==8: (1 << k) == 256
  k==9: (1 << k) == 512
  k==10: (1 << k) == 1024
  k==11: (1 << k) == 2048
  k==12: (1 << k) == 4096
  k==13: (1 << k) == 8192
  k==14: (1 << k) == 16384
  k==15: (1 << k) == 32768
  k==16: (1 << k) == 65536
  k==17: (1 << k) == 131072
  k==18: (1 << k) == 262144
  k==19: (1 << k) == 524288
  k==20: (1 << k) == 1048576
  k==21: (1 << k) == 2097152
  k==22: (1 << k) == 4194304
  k==23: (1 << k) == 8388608
  k==24: (1 << k) == 16777216
  k==25: (1 << k) == 33554432
  k==26: (1 << k) == 67108864
  k==27: (1 << k) == 134217728
  k==28: (1 << k) == 268435456
  k==29: (1 << k) == 536870912
  k==30: (1 << k) == 1073741824
  k==31: (1 << k) == -2147483648

Hasta acá está andando todo tal cual lo imaginaba al momento de escribir el programa.

Podría ser alguna cuestión de la función printf (pero no, porque printf imprime correctamente datos de tipo signed int), así que podemos verificar el signo. Basta depurar con algo como:

   printf("%d\n", (1 << 31) < 0);

que dio salida "1" (verdadero).

Por otra parte, al hacer la máscara de bits con n = -2, que aparentemente, como vos decís, tiene representación complemento a dos,
el resultado de (n & (1 << 31)) tiene que dar esto: 1000000000000000.....

De nuevo, eso como signed int es el número -2147483648.

Sí, hasta ese punto no veo nada mal.

Cuando lo volvés a correr hacia la derecha con >> k, ¡va agregando 1's a la izquierda!  :o
El resultado de (n & (1 << k)) >> k, con k = 31, es 1111111111111.....  >:(

Pareciera que el corrimiento a derecha no funciona bien.

¡Ah, acá sí que esperaba algo distinto! Supuse que al "shiftear" a la derecha completaría con ceros, o sea, el resultado de (n & (1 << k)) >> k para k=31 debería dar

00000000000000000000000000000001

que es 1.

Al parecer esto no está bien definido en el estándar cuando se trata de números negativos.
Así que depende de la implementación.
Nuestro compilador lo que hace con el corrimiento a la derecha es conservar el bit de signo.

Si el número es positivo, hace lo que esperabas que hiciera, agrega 0's a la izquierda.
Pero si es negativo, agrega 1's por la izquierda, porque en cada corrimiento de los 31 que hace, va agregando un 1 por la izquierda...

Como 111111111111.... es la representación binaria de -1, eso explica el -1 al principio de la salida de tu programa.

Vaya, excelente análisis. Jamás se me cruzó por la cabeza que el shift a la derecha se comportara distinto que el shift a la izquierda.

Conclusión: El problema no es la representación binaria del -2, sino cómo se implementa en forma local (en el compilador) la operación de corrimiento a derecha.

Ya entiendo, muchas gracias  :).
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: pierrot en 06 Enero, 2013, 08:40 pm
Te hago un comentario adicional.

En lenguajes como BASIC o Pascal, no está permitido intercambiar ciertos tipos de datos distintos.

Sobretodo Pascal es muy restrictivo con ese tipo de cosas.

En Pascal no se puede sumar un "char" con un "integer", pero en C sí se puede.
El ejemplo de Pascal muestra más claro qué quiere decir tener tipos de datos distintos.
Son atributos de las variables, que no tienen nada que ver con el dato que guardan dentro de sí.

Complemento la información agregando que a ese tipo de lenguajes se les denomina fuertemente tipados por las mismas razones que argentinator menciona.

Las reglas de conversión de tipos de datos que sigue el C, no se fijan en ningún momento en el valor concreto que tienen las variables, sino sólo en cuál es el "tipo de datos" que tiene establecido.

A esa conversión de tipos de datos prevista en el lenguaje para que se realice de forma "automática" (es decir, sin ser explicitada por el programador) se le suele denominar casting implícito.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 06 Enero, 2013, 09:37 pm

A esa conversión de tipos de datos prevista en el lenguaje para que se realice de forma "automática" (es decir, sin ser explicitada por el programador) se le suele denominar casting implícito.

Gracias por todas tus aportaciones.

A veces no sé el nombre técnico,
y a veces lo sé, pero no lo uso a propósito, para no introducir tanta terminología, y no perder de vista la descripción concreta de lo que estamos haciendo.

Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 06 Enero, 2013, 11:53 pm


En una futura ocasión voy a explicar mejor cómo funciona el printf().

Pero en esencia, la opción %d dice que en ese lugar se va poner un número, que es el primer dato o expresión que aparece después de la coma.


 Sí observé que localiza lo que se imprime más para allá o más para acá a modo de espaciador, o sea


printf("(-1 + cero)/2 = %d\n\n",  (-1 + cero) / 2 );


printf("(-1 + cero)/2 =                   %d\n\n",  (-1 + cero) / 2 );

así aparecería la respuesta más lejos del singo igual.

Pero no sé qué trascendencia tiene que sea una "d", una "c", no sé si es verdaderamente importante, porque probé a cambiar la letra en algunos sitios y funcionaba lo mismo; es decir, no sé si en algunos casos poner una letra inadecuada, según el tipo de variable, puede dar lugar a un error que estropee el programa o se puede uno despreocupar de ello.

Buenas noches.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 07 Enero, 2013, 12:07 am
Citar
Pero no sé qué trascendencia tiene que sea una "d", una "c", no sé si es verdaderamente importante, porque probé a cambiar la letra en algunos sitios y funcionaba lo mismo; es decir, no sé si en algunos casos poner una letra inadecuada, según el tipo de variable, puede dar lugar a un error que estropee el programa o se puede uno despreocupar de ello.

Sí es importante, pero todavía no lo voy a explicar.

Hasta ahora he usado el printf() sólo como una forma rápida de mostrar en la pantalla los resultados de lo que estamos haciendo.

Por eso no lo explico demasiado.
Fijate que al principio ni siquiera le pasaba datos, sólo era texto.

Es importante explicar en detalle el printf(), por eso lo estoy postergando.

Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 07 Enero, 2013, 01:46 pm

Me parece que en este caso lo más adecuado sería hacer una pausa con una llamada al sistema, así:

system("PAUSE");

previamente adosando la librería stdlib.h

______________




#include <stdlib.h>
#include <stdio.h>

void main(void)

{
   int a;

    printf("Escriba un numero: ");
   
    scanf(" %d", &a);

    if(a>0)
        printf("Es positivo\n\n");
   
   system("PAUSE");

 }



 Una cosa que se me pasó. Éste funciona, pero quitando el "Void", si no, me manda un mensaje que dice algo así como que el "main" debe retornar a "int" (yo de inglés no sé mucho, pero es lo que entiendo). Supongo que tendrá que ver con la nueva librería añadida y la función Void ¿no?

 Saludos.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 07 Enero, 2013, 02:26 pm
La  verdad no sé qué decirte, porque a mí me funciona sin problemas, ni avisos de ningún tipo.

No tendría por qué haber problemas.

¿Habrás tocado opciones de la configuración?

Yo no he tocado nada, salvo la opción que da al compilador "soporte para ANSI".
Pero igual esto no afecta en nada.

Si necesitás un int en vez de un void, usalo y listo.
Es más correcto y todo:

int main(void)
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 07 Enero, 2013, 02:47 pm
La  verdad no sé qué decirte, porque a mí me funciona sin problemas, ni avisos de ningún tipo.

No tendría por qué haber problemas.

¿Habrás tocado opciones de la configuración?

Yo no he tocado nada, salvo la opción que da al compilador "soporte para ANSI".
Pero igual esto no afecta en nada.

Si necesitás un int en vez de un void, usalo y listo.
Es más correcto y todo:

int main(void)

Pues será cosa de la configuración mía lo más seguro; no pasa nada, te lo decía por curiosidad.

Saludos.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 07 Enero, 2013, 08:31 pm
Anuncios (que considero) importantes:

Una lectura más cuidadosa de las normas del estándar C de 1999 (el C99) me ha llevado a darme cuenta de que hay cosas que escribí sobre los tipos de datos enteros que no eran del todo correctas.

* No se puede hablar de los bytes que ocupa un tipo de datos entero, sino que el estándar obliga a especificar sólo su "rango de valores".

Es distinto hablar del tamaño en bits o bytes que un dato ocupa en memoria, que el rango de números asignado a un tipo de datos.

Eso me obligó a modificar detalles en este post:

Enteros en C (http://rinconmatematico.com/foros/index.php?topic=64835.msg260467#msg260467)

Además agregué unos tipos de datos de la librería stdint.h que antes no había considerado: los "rápidos" (int_fast8_t, int_fast16_t, etc.) y los asociados a punteros (intptr_t, uintptr_t).



Otra sutileza importante es el tema de qué diablos es un BYTE.
Casi que eliminé la palabra BYTE de todo el post,
porque el estándar C99 deja un byte a libre interpretación.

Cada compilador decide cuántos bits son un byte.
La cantidad de bits en cuestión se ha de definir en el archivo limits.h, con la macro CHAR_BIT.
Luego, un char debe ocupar un byte, eso sí, pero de la cantidad de bits es la indicada en CHAR_BIT.



En el post inmediato siguiente (http://rinconmatematico.com/foros/index.php?topic=64835.msg260468#msg260468 (http://rinconmatematico.com/foros/index.php?topic=64835.msg260468#msg260468)) estoy haciendo una continuación del análisis de los tipos de datos enteros.

Es necesario hacerlo antes de largarnos a hacer un programita que tengo en mente, que pondrá a prueba todos los rangos de valores de los tipos de datos de números enteros en C.

Aún está en edición.

Pero lo más grave es que voy a tener que tragarme estas palabras mías:

Citar
El lenguaje C no es lenguaje de máquina, y entonces la manera en que se representan internamente los datos depende de cada compilador.
No es algo que te puedas aprender, porque no está fijado por las reglas del lenguaje C.

Un programador en C no tiene por qué saber o supone cómo se representan los números (o cualquier dato) internamente.

A partir del estándar de 1999 estas especificaciones se dan en forma precisa, bit a bit, y sólo unos pocos detalles se dejan sin especificar.

Originalmente el lenguaje C era quizás como yo decía, y la representación interna bit a bit podía suponerse "oscura" y "arbitraria", decidida finalmente por el compilador o sistema de turno.

Pero el estándar C99 obliga a que todos los compiladores cumplan con las mismas normas.

Hay pocas cosas que no obliga. Por ejemplo, no te dice si los enteros signados usarán complemento a 2 o complemento a 1.
No obstante, te indica qué debe ocurrir en cada caso, y no da lugar a muchas otras posibilidades.

Esos detalles los estuve explicando en el referido post, aunque todavía no lo he podido terminar. Conlleva mucha información que quiero apuntar y dejar bien organizada.

Está en borrador todavía...
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 08 Enero, 2013, 02:04 am
Terminé por fin con todos los detalles técnicos de los tipos de datos enteros.  :banghead: :banghead: :banghead:

¡Es terrible este tema!

He sufrido mucho escribiendo esos dos pots.   :'( :'( :'( :'( :'(

El primero sólo lo retoqué en un par de párrafos, y el 2do terminé de editarlo.
Ahí van (no hagan caso del post que sigue después de un programa que lee archivos de texto, que está descolgado del tema).

Enteros en C (parte I) (http://rinconmatematico.com/foros/index.php?topic=64835.msg260467#msg260467)
Enteros en C (parte II) (http://rinconmatematico.com/foros/index.php?topic=64835.msg260468#msg260468)
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 08 Enero, 2013, 02:15 am
Terminé por fin con todos los detalles técnicos de los tipos de datos enteros.  :banghead: :banghead: :banghead:

¡Es terrible este tema!

He sufrido mucho escribiendo esos dos pots.   :'( :'( :'( :'( :'(

El primero sólo lo retoqué en un par de párrafos, y el 2do terminé de editarlo.
Ahí van (no hagan caso del post que sigue después de un programa que lee archivos de texto, que está descolgado del tema).

Enteros en C (parte I) (http://rinconmatematico.com/foros/index.php?topic=64835.msg260467#msg260467)
Enteros en C (parte II) (http://rinconmatematico.com/foros/index.php?topic=64835.msg260468#msg260468)

Lo he estado mirando por encima y mañana lo miraré más despacio; ahora, esto es para consultar mientras se hacen los programas e ir viéndolo despacio, porque, si no, no se graba en "mi disco duro" use base octal, binaria o cualquier otra que use  :P

Saludos y hasta mañana,
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 08 Enero, 2013, 02:41 am
Todo el manejo de los tipos de datos enteros es muy engorroso, complicado, lleno de excepciones, consideraciones, vueltas y contratuercas.

No es como en matemática que sólo hay naturales y enteros.
En C es un desastre.

Así que se trata de algo que hay que leer varias veces, incluso en períodos distanciados de tiempo,
hasta lograr terminar de entenderlo, una cosa a la vez.

Más aún, se trata de una discusión completamente técnica.
Me costó porque no quería dejar la tarea incompleta.
Pero yo diría que los dos posts que escribí sobre este tema son, sobretodo, para tenerlos de referencia técnica, no para aprendérselos de memoria.

Sin embargo, sí que me parece apropiado leer al menos una vez todo eso, porque hay que saber que todos esos tipos de datos existen en C, y que hay ciertos manejos internos que se hacen con ellos, de un modo u otro.

El primero de los dos posts es el más importante.
Es fundamental entenderlo lo mejor que se pueda, porque contiene los tipos de datos enteros básicos de C, y que aparecen automáticamente en los programas, nos guste o no.

En cambio, podemos vivir largos años sin necesitar nada del 2do post.

Saludos
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 08 Enero, 2013, 02:46 am
También les estoy dejando una muy buena bibliografía.

La mayoría de los textos son gratuitos por internet:

Bibliografía para C (http://rinconmatematico.com/foros/index.php?topic=64835.msg260248#msg260248)

 :-* :-*
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: pierrot en 08 Enero, 2013, 04:53 am
Todo el manejo de los tipos de datos enteros es muy engorroso, complicado, lleno de excepciones, consideraciones, vueltas y contratuercas.

Humm ya veo. Mañana leeré más despacio los dos posts que has escrito (me refiero a los de las notas teóricas).

Me costó porque no quería dejar la tarea incompleta.

Lo que estás haciendo es admirable. Es como la madre que pela el fruto a su hijo y lo corta en trozos pequeños para facilitarle el trabajo. Aquí no hay que hacer nada; presentas el material de forma clara, sin ambigüedades. Está todo subrayadito e incluso resaltas en negrita y con colores las cosas importantes. Sólo resta sentarse a leer el resumen que has hecho e intentar digerirlo. 

También les estoy dejando una muy buena bibliografía.

La verdad es que con el excelente trabajo que estás haciendo, no pienso lidiar con esos libros. ¿Para qué molestarme en leerlos para luego llegar a las mismas conclusiones que tú has llegado? Yo confío en que no me estás mintiendo...  :laugh:
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 08 Enero, 2013, 11:28 am
Citar
Yo confío en que no me estás mintiendo...

Mmmm...

Bueno, casi en todo lo que escribí me siento seguro.

Pero hay algún detalle que se me escapa.

Dije por ahí que entre las reglas del estándar está que tanto la versión signed como unsigned de un tipo de datos dado tienen la misma longitud en bits.
Pero luego enuncia las demás reglas como si esto no fuera necesariamente cierto.
O sea que ya no sé si es cierta esa regla  :-[ (que encima es la primera que anoté de la representación en bits).
Y ya no me acuerdo de dónde lo saqué.  :-\

Pero la confusión viene de que la versión original tiene en cuenta detalles que yo he omitido a propósito, y ahí quizás me haya quedado algún cabo suelto.
Me refiero a que hay cosas como los "padding bits", que son puro humo, porque son una característica que no es obligatoria en el lenguaje, y yo me estoy ajustando siempre a lo que el estándar pone como estrictamente obligatorio.

Lo opcional lo dejo correr, por la sencilla razón de que no es portable entre compiladores o sistemas distintos.

Pero bueno. Creo que esos posts son un 99% creíbles.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 08 Enero, 2013, 12:39 pm
Bueno PabloN, parece que sí te he mentido.

Como tenía esa duda con los tamaños de signed y unsigned, lo volví a revisar con más cuidado.

Al parecer yo estaba equivocado al decir que ocupan la misma cantidad de bits.

En realidad, esto ocurre en casi todos los sistemas.
Pero hay sistemas en que no pasa.
Y además el estándar no obliga.

Así que en un par de párrafos donde yo insistía en que los tamaños de signed y unsigned de un mismo tipo tenían el mismo tamaño en bits, los he "maquillado" poniendo que en realidad eso es costumbre, pero no regla del estándar.

Y por último puse al final del spoiler que analiza los bits, este texto que explica la situación:

Citar

Nos queda pendiente analizar un detalle técnico importante:

¿Son iguales el número de bits de las versiones signed y unsigned de un tipo entero dado?

En general, se acostumbra   ;) ;) que la versión signed de un tipo entero tenga la misma longitud que su compañera unsigned, y así la precisión será exactamente 1 menos que de la compañera unsigned.

Pero el estándar no obliga a esto, y puede ocurrir que los tipos signed podrían ser más pequeños.
Lo que el estándar sí obliga es que el rango de valores positivos y los bits que representan valores de la versión signed encajen a nivel de bits la versión unsigned, de manera que representen el mismo valor matemático.

Así, podría ocurrir que un signed int tenga 1 bit más que su compañero unsigned int, si ambos comparten los mismos valores positivos, ya que el signed int además debe contener el bit de signo.
(Incluso hay ejemplo de un sistema de la vida real que trabaja así).

Pero en todo otro caso, el número de bits de un signed será menor o igual  :) que la de su compañero unsigned.
Inclusive podría ocurrir que la versión unsigned tenga varios bits más.
 
Precaución: A nivel de bits, se puede dar el caso que los bits de valor sean de cierta forma, pero que su representación como objeto en memoria sea algo diferente, por más que en ambos casos se hable de bits bien ordenaditos y todo.
Nosotros estamos suponiendo que ambas cosas son lo mismo, para no marearnos.
Pero en algún momento tendríamos que estudiar la diferencia entre estos dos aspectos.





¡Ahora sí creo que hay no hay más mentiras!  >:D

Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 08 Enero, 2013, 12:39 pm
También les estoy dejando una muy buena bibliografía.

La mayoría de los textos son gratuitos por internet:

Bibliografía para C (http://rinconmatematico.com/foros/index.php?topic=64835.msg260248#msg260248)

 :-* :-*


Ya ha leído despacio las notas, pero tengo que seguir mirando algunas cosas.

 Sobre lo que pasa "por dentro" para hacer todas esas operaciones, yo, la idea me la hago a partir del primer libro que leí sobre estas cuestiones; lo enlazo aquí (es auténtica arqueología de la informática, creo que puede interesar a los estudiantes de ingeniería informática de hoy como curiosidad). Ya lo enlacé una vez en un post sobre un debate relativo a las máquinas de Turing, pero lo vuelvo a enlazar (se trata de un PDF que no llega al mega y se descarga enseguida)

http://trastero.speccy.org/cosas/Libros/El_libro.htm

 El interés está en que es muy de primera mano, en cuanto a que esto es lo que empezaba a llegar al gran público sobre el lenguaje máquina y, en general, sobre cómo almacena la información un ordenador. Antes de este tipo de libros existían, lógicamente, lo que fueron los primeros libros de una muy incipiente carrera de informática que, hacía sólo unos pocos años, no existía en la mayoría de las universidades de España y otros países. Los ordenadores que existían antes de esos años funcionaban con válvulas de vacío, no con microchips, que no existían aún (por aquella época creo que se hacía el servicio militar con lanza :D ).

 Lógicamente, habla de ordenadores que metían la información de 8 en 8 bits, no más ( un byte para la dirección de memoria y un byte asociado de órdenes; órdenes que dependían según el estado de los bits de éste). Aquí no había long ni short ni mucho menos long long (todo eso es muy nuevo para mí, por eso tengo que mirarlo e ir despacio)  por lo que imagino que, cuando un número sobrepasaba el 256d en bits, habría que formarlo a partir de la dirección de memoria inmediatamente siguiente, adosando otro byte de datos en esa dirección (aunque no lo sé a ciencia cierta, no recuerdo ahora si el libro detalla esto de los números grandes).

 Recuerdo que, cuando lo leí, aunque lo entendía, no terminaba de formarme bien del todo la idea de cómo iba aquello, pues por una parte si ciertos bits, según su posición y normalmente tomados de 2 en 2 consecutivamente, estaban cargados con un 1, quería poder decir, por ejemplo, que estaban activadas las mayúsculas del telcado, etc., pero, luego, otros bytes almacenaban datos en la pila de máquina que a la vez se obtenían de otros bytes que estaban cargados en sólo uno o dos registros acumuladores... No era en sí difícil de entender, era difícil de visualizar; por lo menos para mí, que no tenía ni tengo idea de electrónica ni de cómo se organiza el microprocesador para hablar con la RAN, la ROM, periféricos y demás.

 Sí quedaba claro, básicamente, cómo se almacenaban los datos; en un byte había ocho celdillas y las combinaciones que se podían formar con éstas; si en una celdilla había con una carga eléctrica positiva, ese bit era un 1, si estaba descargada era un cero. Y creo que hoy en día, supongo, no puede ser muy distinto, lo que existirá será la posibilidad de utilizar muchísimas más combinaciones y con ello almacenar números más grandes y mayor número de datos; y eso es lo que dará lugar a tanta complejidad, pero en esencia no creo que sea más que un sistema numérico distinto al que estamos acostumbrados a usar, más bien una forma distinta de entender los números; tengo claro que el ordenador no ve, no reconoce dibujitos, símbolos, todo la información la tiene que guardar o transmitir simplemente sintiendo "frío" o "calor" en  las mil y una partes de su cuerpo; cosa que quizá también hacemos nosotros inconscientemente con muchas informaciones; pero si tuviéramos que hacerlo conscientemente nos resultaría más difícil que entender el funcionamiento de un ordenador, seguramente; o al menos igual de difícil.

 Porque si "sacanf" es "preguntar" o "printf" es "imprimir en pantalla", o que un número tenga un cero delante, respecto de ciertos bytes signifique que está en base ocho, está claro también que eso es una "cortesía" del lenguaje hacia nosotros; el ordenador tiene que guardar la información útil con su "sí" y su "no" en binario y, además, también con sus mismos "sí" y "no", tiene que guardar el traductor de esas palabras humanas para poderse comunicar con nosotros; con lo que hace un gasto de más y bastante grande; y ahí, es de imaginar, entra la labor del compilador para, una vez usado ese "diccionario" que utiliza para hablar con nosotros, tirarlo a la basura y dejar más sitio.

 Luego daré otro repaso a tus notas y en especial al tema de abrir archivos que es lo que está lo último y he mirado menos. El Basic, me parece recordar, reservaba casi en exclusiva el símbolo # para el tema de abrir y cerrar archivos, pero el programa que has puesto funciona con un bucle y no sé si es equivalente; se parece más a lo que era utilizar una "array" de datas que se van leyendo mediante un "for-next"; allí los "datas" se acababan y necesitaba una orden llamada "restore" para volverlos a poder leer. Internamente esto sucedía así, según leí, porque los bits de cada byte almacenados en el stack de la maquina se sacan como de una caja; se toma el que está apilado más arriba, después el siguiente... y se invierte el orden al ser usados, con lo que hay que volver a ordenarlos si se quieren usar para que den el mismo resultado dentro de un programa; por eso, además de una orden gousub-return o lo que fuera del bucle, necesitaba el "restore".

 Saludos.

    

 
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 08 Enero, 2013, 12:58 pm
Feriva:

Citar
Sí quedaba claro, básicamente, cómo se almacenaban los datos; en un byte había ocho celdillas y las combinaciones que se podían formar con éstas; si en una celdilla había con una carga eléctrica positiva, ese bit era un 1, si estaba descargada era un cero.

A ver si no te mareo tanto.

Hay algo que debería quedar claro: Si algo no lo estoy explicando... es porque no importa, jeje.
Siempre en la vida trato de mantener un estilo "autocontenido".

Por ejemplo, no he explicado mucho cómo funciona el printf.
Eso es porque lo uso de forma casera para mostrar información sencilla y rápida, sin analizar mucho cómo funciona.

En el momento oportuno lo voy a explicar con detalle.
Lo mismo pasa con cosas como el getchar, el system("PAUSE") y demás truquillos.
Son temas que deben explicarse en otro contexto, y que nosotros sólo usamos para "hacer trampa", y que queremos que nuestros incipientes programitas hagan "por lo menos algo"  :-[



En cuanto a la representación interna de los datos, quisiera que quede claro qué estamos haciendo:


En otras palabras:

No te estoy enseñando cómo se representa un entero mediante bits internamente.
Y de hecho, esto a mí ni siquiera me importa.  ;D

Pero lo hago porque el comité ISO de estandarización de C de 1999 me obliga a tener en cuenta esos dichosos bits, a fin de poder terminar de entender qué son los tipos de datos enteros en el lenguaje C.

O sea, no perdamos el foco del tema, que está en el título de esos posts: Enteros en C.

Lo que estamos haciendo es tratar de entender qué son y cómo funcionan los tipos enteros,
qué rangos de valores tienen, hasta qué grado de precisión se parecen, cómo se intercambian o combinan, etc.

El hecho de que hayamos tenido que irnos hasta los bits, es porque el estándar se ocupa de eso.

____________

Por ejemplo, un libro que tenga las reglas de estándar de, digamos el lenguaje Delphi, estoy seguro que en ningún momento se va a ocupar de cómo se representan los datos a nivel de bits.
Y entonces, si estudiáramos los tipos de datos enteros en Delphi, no tendríamos que hacer jamás todo este análisis de los bits, ni sufrir con eso.

¿Se entiende más o menos?




Feriva again: ¿Estás pudiendo leer con comodidad las notas? Mario una vez me advirtió de que el exceso de colores puede dificultad la lectura a determinados tipos de ojos . :-\

Se puede hacer un programita que saque todos los colores y deje el resto del texto intacto...
Queda pendiente para más adelante.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 08 Enero, 2013, 01:12 pm
Feriva again: ¿Estás pudiendo leer con comodidad las notas? Mario una vez me advirtió de que el exceso de colores puede dificultad la lectura a determinados tipos de ojos . :-\

Se puede hacer un programita que saque todos los colores y deje el resto del texto intacto...
Queda pendiente para más adelante.

No te preocupes, tengo una pantalla que me dio un amigo y un sintetizador de voz para cuando me canso; y se ven bien los colores.

 En cuanto a lo otro, te entiendo, el lenguaje C imita en ciertas cosas el lenguaje de la máquina para hablar, pero no es el lenguaje de la máquina, es un lenguaje de usuario, creo que es eso lo que me quieres decir.

 Saludos y muchas gracias.

Tengo que operarme de cataratas algún años de éstos, pero cuanto más tarde, mejor, me da un poco de miedo de los médicos, no son matemáticos :D
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 08 Enero, 2013, 06:52 pm
Buenas.

Otro cambio:

En el primer post, en donde se explica cómo instalar el IDE DevC++,
había una opción de configuración seleccionada.
La he quitado, y ahora dice que lo mejor es "no tocar las opciones de configuración".

En el próximo post se explicará cómo tocar opciones del Compilador, acorde a nuestras necesidades.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 08 Enero, 2013, 06:55 pm
Buenas.

Otro cambio:

En el primer post, en donde se explica cómo instalar el IDE DevC++,
había una opción de configuración seleccionada.
La he quitado, y ahora dice que lo mejor es "no tocar las opciones de configuración".

En el próximo post se explicará cómo tocar opciones del Compilador, acorde a nuestras necesidades.


Yo el otro día lo reinstalé por aquello que te dije de las ventanas que se abrían; al final me cargó no sé que extra que tenía que ver con la caché y que decía que se podía cargar después, pero no me di cuenta y lo cargué antes; el caso es que funciona bien y ya no se abren las ventanas.

 Gracias, saludos.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 08 Enero, 2013, 06:58 pm
No hace falta reinstalar todo.
Ya voy a postear sobre el tema.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 08 Enero, 2013, 07:51 pm
No hace falta reinstalar todo.
Ya voy a postear sobre el tema.


Ya lo he configurado, a ver si pruebo ahora el programa ése que no me funcionaba con el void, que a lo mejor era por eso...

Ahora sí va con el void :)
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 08 Enero, 2013, 11:49 pm
Me dice en algunas rutinas que hago que -std=c99 es compatible con C (barra algo más) pero no con
C++

 Por ejemplo en ésta tan sencilla, funciona pero me manda ese mensaje

 #include <stdio.h>

int a,b;
    main()
    {
       
        printf(" %d", 5+6);
        getchar();
    }

  Y en otras  ???

  En cambio en éste me dice que está bien

#include <stdio.h>

#define suma(a, b) (a + b)

void main(void) {
  printf("Suma: %d\n", suma(5, 5));
  getchar();                               
}


Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 09 Enero, 2013, 02:22 am
Por ejemplo en ésta tan sencilla, funciona pero me manda ese mensaje

 #include <stdio.h>

int a,b;
    main()
    {
       
        printf(" %d", 5+6);
        getchar();
    }

 

Usar main(), así pelada, no creo que esté bien.

Los estándares han evolucionada para que esa escritura no se use para programar.
Hay que rellenar los "huecos".

O bien poner

void main(void)

o bien

int main(void)

Pero no sólo: main()

A ver si corrigiendo eso el programa ya te compila bien.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 09 Enero, 2013, 03:03 pm

Hay que rellenar los "huecos".

O bien poner

void main(void)

o bien

int main(void)

Pero no sólo: main()

A ver si corrigiendo eso el programa ya te compila bien.

 Hola, Argentinator. Con el int main(void) me sigue enviando el mensaje, con el void main(void) lo manda y no se abre. Pero no importa, el caso es que se abra y funcione, de momento lo que me interesa es ir viendo si soy capaz de escribir cosas que corran aunque sean muy elemntales.

 He leído lo nuevo y lo he asimilado por encima, pero tengo que probar el programa que has puesto y mirar todo más despacio, que es mucho arroz para tan poco pollo (el pollo soy yo :)  claro ).

 Saludos y gracias.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 09 Enero, 2013, 03:10 pm
Nuevo post: Testeando Tipos Enteros en C (http://rinconmatematico.com/foros/index.php?topic=64835.msg260792#msg260792)

Después de haber explicado temas intrincados, complejos, difíciles, con el mayor rigor posible,
he escrito un post totalmente casero, lleno de truquitos "para salir del paso".
Lo más grave es que ese nivel poco serio de programación se lo he mostrado al mundo entero, y como parte de un curso.  >:D

De a poco iremos mejorando nuestras herramientas de programación, y nuestro estilo de programación.
(creo  :-[ )
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 09 Enero, 2013, 03:27 pm

Hay que rellenar los "huecos".

O bien poner

void main(void)

o bien

int main(void)

Pero no sólo: main()

A ver si corrigiendo eso el programa ya te compila bien.

 Hola, Argentinator. Con el int main(void) me sigue enviando el mensaje, con el void main(void) lo manda y no se abre. Pero no importa, el caso es que se abra y funcione, de momento lo que me interesa es ir viendo si soy capaz de escribir cosas que corran aunque sean muy elemntales.

 He leído lo nuevo y lo he asimilado por encima, pero tengo que probar el programa que has puesto y mirar todo más despacio, que es mucho arroz para tan poco pollo (el pollo soy yo :)  claro ).

 Saludos y gracias.

Hola.

Resulta que a mí tu programa con el "main()" pelado me funciona bien.
Sólo me pone un aviso de que va a poner un "int" como dato de retorno por defecto, pero compila y corre.

No sé cuál puede ser el problema.

Creo que lo que estás haciendo mal es guardar tus archivos sin cuidado.

NO HAY QUE GUARDAR ARCHIVOS CON EXTENSIÓN CPP, SINO CON EXTENSIÓN C.

El inconveniente es que cuando guardas un archivo al disco,
Dev-C++ automáticamente intenta guardarlo con extensión cpp.

Fijate que en el primer post de la teoría, donde hacemos el "HolaMundo.c",
está explicado todo con mucho cuidado.
Acá te copio de nuevo esa parte:

Citar

Para darle un nombre [al programa], y de paso ya tenerlo guardado en el disco duro, vamos al menú Archivo, clic en Guardar Como....
Aparece un cuadro donde hemos de escribir un nombre para nuestro archivo.
También aparece debajo un desplegable con opciones para el Tipo de Archivo.

La opción por defecto para archivos nuevos es la C++ source files.
Entonces abrimos el desplegable y seleccionamos la opción C source files

Ahora en el Nombre de Archivo ponemos [por ejemplo] HolaMundo.c (en general Nombre-de-archivo.c).

Nos aseguramos de que va a guardar nuestro archivo en la carpeta "Mis_Proyectos_C". Si no aparece, la buscamos hasta encontrarlo.

Por fin, hacemos clic en Guardar.



Hay que tener cuidado porque:

NO ES LO MISMO ESCRIBIR UN PROGRAMA EN C Y COMPILARLO CON UN COMPILADOR DE C,
QUE COMPILARLO EN C++, AÚN CUANDO TODA LA SINTAXIS USADA SEA DEL LENGUAJE C.


No siempre se puede considerar que el lenguaje C "funcione" perfectamente como un subconjunto de C++.

Recordemos que Dev-C++ está diseñado sobretodo para C++.
Tenemos que tomarnos el trabajo de cuidar que todos nuestros programas y proyectos satisfagan los requisitos del lenguaje C.



En particular, para que el compilador reconozca que nuestro programa debe compilarse en lenguaje C, tiene que tener extensión .c.

Creo que el modo de automatizar esto es utilizando proyectos, en vez de archivos fuente aislados, como yo les vengo inculcando.
Pero ya que estamos en esto, creo que es buena idea que aprendas a guardar correctamente los archivos fuente individuales en c, repitiendo el proceso arriba explicado.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 09 Enero, 2013, 04:15 pm
Citar
He leído lo nuevo y lo he asimilado por encima, que es mucho arroz para tan poco pollo

Pero es que está bien mirarlo por encima.
No es fácil entender de una sola vez todo el tema de los enteros en C.
Yo puse la teoría completa porque el lenguaje C hace conversiones de tipos enteros todo el tiempo, y me parece que tenemos que tener en la teoría una referencia clara donde consultar qué pasa en tal o cual caso, qué podemos esperar y qué no, reglas y excepciones, etc.



Además, no hemos desarrollado tanta teoría.
La dificultad la estoy poniendo justamente ahí, a propósito:

¿Cómo hacer muchas cosas con las pocas herramientas que tenemos?  >:D >:D

Yo creo que sólo si aprendemos a usar bien cada una de las herramientas disponibles, vale la pena aprender nuevos temas de programación.
Porque si no, lo que va a pasar es que se aprenden muchas herramientas, pero falta el ingenio para usarlas.


Fijate que no hemos hecho operaciones aritméticas,
ni siquiera hemos hecho programas donde se declaren variables.
Sólo distintas versiones locas de "Hola Mundo", y luego estudio de constantes de caracteres, strings y números enteros, y por último rangos de valores y compatibilidad o conversión de tipos de datos enteros.

Todo lo demás son truquitos y rebusques.
Las funciones printf() y getchar() todavía las estamos usando "con trucos poco explicados", sin mucha teoría de respaldo.

No te digo que te aprendas toda la teoría de los tipos de datos enteros, que es un embrollo.
Pero sería bueno discutir los programitas que ya están hechos en la teoría, y ver qué cosas no se entienden.

El tema de las macros puede ser confuso. Así que hay que discutir los ejemplos.

Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 09 Enero, 2013, 04:56 pm
Nuevo post: Testeando Tipos Enteros en C (http://rinconmatematico.com/foros/index.php?topic=64835.msg260792#msg260792)

Después de haber explicado temas intrincados, complejos, difíciles, con el mayor rigor posible,
he escrito un post totalmente casero, lleno de truquitos "para salir del paso".
Lo más grave es que ese nivel poco serio de programación se lo he mostrado al mundo entero, y como parte de un curso.  >:D

De a poco iremos mejorando nuestras herramientas de programación, y nuestro estilo de programación.
(creo  :-[ )


Muchas gracias, Argentinator, ahora la miro.

 En cuanto a la extensión .c de los programas has adivinado que muchas veces, en efecto, se me olvida y los guardo con la otra extensión; pero ya me fijé también en eso y aun así ocurre con el main() a palo seco; lo acabo de probar otra vez. Queda como misterio a descubrir por mí, no te preocupes, el día menos pensado descubriré la razón, como me ha pasado con otras cosas del ordenador e Internet; quizá tenga que ver que tengo el Windows dentro de Linux, aunque intuyo que eso no tiene mucha lógica.

 Volveré a mirar un poco lo de antes también; tú ve a tu aire, no pares por mí porque, si no, el curso se puede hacer infinito y ni con long long va a caber :D, guardo el enlace para utilizarlo como consulta e ir a aprendiendo a la medida de mi curiosidad de mis posibilidades.

 Saludos y gracias.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 09 Enero, 2013, 05:31 pm
Citar
pero ya me fijé también en eso y aun así ocurre con el main() a palo seco;

Se me ocurre que ahora el problema es otro:

Como ya teníamos compilada una versión de tu programa para C++, con la extensión CPP,
el resultado de esa compilación puede haber dejado guardada por ahí información incompatible con las nuevas compilaciones.

Cuando uno no está seguro de si el compilador está trabajando limpiamente, quizás convenga "hacer una limpieza", del siguiente modo:

Ir al menú Ejecutar (o "Run"), clic en "Limpiar resultados" (si está en inglés, debe decir algo como "Clean results" o algo similar) .
Luego de esto, intentar compilar de nuevo el programa, a ver si ahora funciona.

Otra cuestión: ¿hiciste los pasos de configuración que expliqué en Configuración de opciones del Compilador. Compatibilidad con C99 (http://rinconmatematico.com/foros/index.php?topic=64835.msg260748#msg260748).

Fijate que la opción sugerida es -std=c9x (y no c99...).

Saludos
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 09 Enero, 2013, 06:17 pm


Cuando uno no está seguro de si el compilador está trabajando limpiamente, quizás convenga "hacer una limpieza", del siguiente modo:




Gracias, Argentinator, va bien así después de la limpieza, ya no manda el mensaje relativo al C++ pero me pide el int para el main; se lo pongo y ya no se queja más.

 He guardado tu programa del test de enteros y después he guardado sólo la primera parte para analizarlo poco a poco; hasta el primer getchar incluido. En ese caso no corre, dice el compilador, creo entender, que espera que le ponga un "return" o un "end"; no me parece lógico que pase eso, debería correr, aunque, eso sí, al dar a ENTER, se iría la pantalla, pero la primera parte debería salir, no veo a qué obedece eso.

Ah, claro, torpe de mí, se me había olvidado añadir detrás una llave cierre :)

 Gracias, saludos.

 

 
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 09 Enero, 2013, 06:56 pm
pero me pide el int para el main; se lo pongo y ya no se queja más.

Y sí, al final siempre pasa que es la computadora quien lo maneja a uno, cuando la intención de los inventores de la PC era todo lo contrario.

 :P
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 09 Enero, 2013, 11:10 pm


Buenas noches, Argentinator. La macro El DEB(X) DEB_(X) la veo pero no la veo, dime a ver si interpreto bien:


#define DEB_(X) #X

// Esto está claro, convierte una variable numérica en una alfanumérica o, también, cambia un valor por el nombre de su variable asociada; el Basic tenía una función que hacía lo mismo que se llamaba $CHR, creo.

#define DEB(X) DEB_(X)

// Ésta es la macro que digo. Según explicas, DEB(X) evalúa X, que en este caso particular se define indirectamente más abajo junto a la variable denominada N; al definir N DOBLE(1000). Luego X=1000 hasta que se cambie su valor por 17 más adelante.
 
// Seguidamente, por la acción de #define, yo diría que parece que va a meter el valor de X en el DEB_(X), cosa ésta que debería transformar ese valor en alfanumérico, puesto que previamente hemos definido  #define DEB_(X) #X; pero esta acción no parece tener sentido, pues para eso ya está la macro anterior, luego hace otra cosa.


#define DOBLE(X) (X + X)

// Esto también está claro, carga en el identificador DOBLE(X) el doble de X; que se va a definir a continuación.

#define N DOBLE(1000)

 // Aquí se define N en función de X, que toma el valor 1000; como ya había dicho.

#include <stdio.h>

void main(void) {
   
    printf("%d\n", N);

 // Esto  está claro.

 
    printf(DEB_(N) " = " DEB(N) "\n\n");

// Empieza imprimiendo en pantalla la letra N, puesto que en DEB_(N) se ha cargado el alfanumérico del valor 1000, el nombre de la variable asociada a 1000. También está claro hasta aquí.

//Pero acto seguido pone =<1000+1000>. Y lo que ha hecho esto es cargar el alfanumérico de la función DOBLE(X), de la propia función X+X, pero no tomando el alfanumérico respecto de X, sino solamente respecto de la operación; respecto de la ley suma, del signo + ó como queramos decir. Eso es lo que se ve en pantalla y lo que se analiza, pero aun viéndolo, me parece una cosa rarísima, ¿hace eso, o sólo parece que lo hace y se trata de otra cosa?

Gracias y un saludo.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 09 Enero, 2013, 11:58 pm
Tus razonamientos están muy bien,
y es muy acertado lo que decís del $CHR.

Pero acá conviene tener en cuenta algunas cosas.
No deberías pensar en N como una "variable".

La N es sólo una "macro".

Las macros son porciones de texto que, cuando aparecen en el código fuente,
se reemplazan (expanden) "convirtiéndose" en lo que está a su derecha.

Esto es lo mismo que cuando en Word ponés la opción de "Buscar y reemplazar", y te reemplaza un texto por otro texto.

Acá, se procede a buscar todas las ocurrencias de N, e irlas reemplazando por DOBLE(1000).

Como DOBLE es de nuevo otra "macro",
se hace un nuevo "buscar y reemplazar", y así, todas las ocurrencias de DOBLE(1000) se reemplazan en el archivo fuente por la expresión (1000+1000).

Eso es el "trozo de texto" (1000+1000), y como es un trozo de texto,
es lo mismo que si vos lo hubieras escrito a mano.
Por eso queda sin calcularse, sin resolverse a "2000", porque es sólo una expresión.

Esto te muestra, de paso, que N no es una "variable", porque si fuera una variable, su "valor" sería 2000, y no quedaría "pedaleando en el aire" la expresión (1000+1000).

Las macros trabajan de modo similar al que trabaja el editor de texto de tu IDE.
Hace búsquedas y reemplazos en tu archivo, sólo que los hace ocultamente, para no tocarte lo que vos escribiste.

Pero las macros actúan de ese modo, y no calculan nada.

____________________

Ahora, cuando hacemos DEB(N), eso es una porción de texto.

El N intentará reemplazarse, en cuanto pueda, por su definición, que es DOBLE(1000), y así hasta terminar todos los reemplazos, llegando al último posible, que es la expresión (1000+1000).

Pero también DEB(N) intentará reemplazarse por su definición,
que es DEB_( algo-con-la-N ).

Ahora, estamos hurgando "dentro" de DEB, y viendo lo que hace.
La pregunta es,  en este punto
¿qué es lo que el compilador hace primero?
¿Busca reemplazar directamente por DEB_(N), y deja la N como una letra sin tocarla?
¿O primero busca reemplazar N por su definición, y después hace el llamado a DEB_ con el resultado que dejaron los reemplazos de N?

Lo que ocurre es la 2da opción.
Así que aquí resulta que N se va expandiendo hasta llegar a (1000+1000).
En el momento en que se hace el intento de "evaluar" (por decirlo así) DEB_( ),
lo que hace el compilador es tomar DEB_( (1000+1000) ).
Finalmente, al entrar "dentro" de DEB_ con este trozo de tezto, se queda entrecomillado,
y resulta el último reemplazo, quedando: "(1000+1000)".


Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 10 Enero, 2013, 12:39 am


Pero acá conviene tener en cuenta algunas cosas.
No deberías pensar en N como una "variable".

La N es sólo una "macro"...




 Gracias. Es que es una orden de muy alto nivel, hace "muchas cosas" en una, por eso me despistaba un poco.

Si hiciera esto \( caracter\,\,de\,\,f(caracter\,\,de\,\,letra) \) en vez de

\( caracter\,\,de\,\,f(caracter\,\,de\,\,numero) \) no me hubiera extrañado tanto.




 Un saludo y hasta mañana. 
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 10 Enero, 2013, 11:54 pm
Anuncio:

He puesto 3 posts más, relativos al testeo de los rangos de valores de los tipos enteros.

http://rinconmatematico.com/foros/index.php?topic=64835.msg260963#msg260963

http://rinconmatematico.com/foros/index.php?topic=64835.msg260972#msg260972

http://rinconmatematico.com/foros/index.php?topic=64835.msg260976#msg260976


En esos 3 posts iremos desarrollando, paso a paso, con mucho cuidado, lentamente, con todo detalle, y explicado completamente, sin omitir detalles pedagógicos, todos los pasos hasta llegar al programa definitivo.

Esto nos enseñará acerca del ciclo de creación de un programa: requiere pruebas y experimentaciones previas, análisis de casos por separado, y tener en cuenta todo el tiempo detalles técnicas, tanto del estándar como de la implementación local (nuestro compilador).

Mientras tanto iremos aprendiendo diversos truquillos de la programación,
vamos a ver cómo reconocer la aparición de dificultades, basándonos en nuestro conocimiento técnico y teórico del lenguaje C,
lidiar con algunas complicaciones mientras van surgiendo,
y también les voy a ir metiendo fichas sobre algunas técnicas adecuadas para programar correctamente.
Al final se darán técnicas para documentar programas.

El programa en sí que se desarrollará ahí lo que hace es comprobar con un programa todo lo que ya se vio en la parte de teoría sobre los tipos de datos enteros, sus rangos de valores, y su relación con los valores estipulados con el estándar.

Así que el programa nos servirá para fijar con la práctica todos esos conceptos.

Lo único que podrán lamentar es que todavía no hay nada que parezca "programación real".
No hay ningún "if", ningún "for", ningun "while", no hay variables, no hay operaciones aritméticas, no hay arrays, no hay datos estructurados, no hay punteros, no hay funciones, no hay archivos, ¡NO HAY NADA!  :banghead:

Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 11 Enero, 2013, 12:08 am
Anuncio:

He puesto 3 posts más, relativos al testeo de los rangos de valores de los tipos enteros.

http://rinconmatematico.com/foros/index.php?topic=64835.msg260963#msg260963

http://rinconmatematico.com/foros/index.php?topic=64835.msg260972#msg260972

http://rinconmatematico.com/foros/index.php?topic=64835.msg260976#msg260976




Ya los he leído despacio, mañana iré probando las rutinas.

 Me parecen cómodas las denominaciones CASI y lo de poner a mano los negativos con una string "-" usando los naturales unsigned int.

 Saludos, gracias.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 11 Enero, 2013, 05:46 am
He tenido que descomentar esto, me fallaba directamente  ::)



/* Nota: La macro PAUSA es sólo una solución casera. Puede fallar si antes se
         han hecho operaciones de lectura de datos con scanf, por ejemplo.
         Usar con precaución.
         Si no funciona, descomentar el siguiente trozo de código:
*/



    #include <stdlib.h>
   
    #ifdef PAUSE
      #undef PAUSE
    #endif

   #define PAUSE system("PAUSE")

Otra cosa que he visto, así por encima, es que una comparación falla en el rango de tipo char, hay un 255<=127

Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 11 Enero, 2013, 10:23 am


Otra cosa que he visto, así por encima, es que una comparación falla en el rango de tipo char, hay un 255<=127



En los posts creo haber explicado que esto va a pasar.
O sea, para los tipos que he llamado "mixtos", como char, wchar_t, wint_t, sig_atomic_t,
se usa la macro PRINTF_INFO_M(...), la cual tiene dos comparaciones.
Una de las dos necesariamente tiene que fallar.

Esos 4 tipos de datos tienen una definición en el estándar C99, que los hace ambiguos.
No se dice ahí si van a resultar signed o unsigned.
Entonces da dos definiciones, una en caso de que resulte signed, y una en caso de que resulte unsigned.
Es claro que sólo puede ser válido uno de los dos casos, y es suficiente conque eso pase.

Todo eso está explicado.
Quizá el error del programa sea no explicarle debidamente eso al usuario.
Debería ser más claro en ese punto.
Es decir, lo que "falló" es que el programa no da suficiente información al usuario, pero los resultados exhibidos son correctos. Es lo esperable teóricamente.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 11 Enero, 2013, 11:58 am
He tenido que descomentar esto, me fallaba directamente  ::)



/* Nota: La macro PAUSA es sólo una solución casera. Puede fallar si antes se
         han hecho operaciones de lectura de datos con scanf, por ejemplo.
         Usar con precaución.
         Si no funciona, descomentar el siguiente trozo de código:
*/



    #include <stdlib.h>
   
    #ifdef PAUSE
      #undef PAUSE
    #endif

   #define PAUSE system("PAUSE")



Eso era un error de programación mío.
En algún momento mezclé versiones en inglés y en castellano, poniendo PAUSA y PAUSE, y entonces la macro dejó de funcionar.

Ya lo arreglé en el post, y también en el archivo adjunto.

Ahora tendría que funcionar bien, sin necesidad de descomentar nada.

Saludos
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 11 Enero, 2013, 12:07 pm

Ya lo arreglé en el post, y también en el archivo adjunto.

Ahora tendría que funcionar bien, sin necesidad de descomentar nada.

Saludos







Ah, bien, ahora lo pruebo, gracias.

Sí, ya corre


 Saludos.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 11 Enero, 2013, 04:00 pm
Ahí puse unos truquillos para ver más cómodamente la salida de información de la pantalla en un archivo Word por ejemplo.

Saludos
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 11 Enero, 2013, 08:30 pm
Ahí puse unos truquillos para ver más cómodamente la salida de información de la pantalla en un archivo Word por ejemplo.

Saludos

Gracias, acabo de leerlo, después pongo en práctica alguno de los trucos, a ver qué tal.

 Saludos.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 11 Enero, 2013, 10:43 pm
Agregué el Truco número 5, que genera y abre un archivo HTML en el navegador!!!   :o

Altamente recomendado. ;D





¡Y además se ven bien los acentos y las eñes!  ;D

Güüüüüenísimo.

Además, ahora que tenemos el control de la salida para HTML,
vamos a poder mostrar cosas con un formato más lindo,
aprovechando las bondades del lenguaje HTML.
Es cuestión de usar la imaginación no más...
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 11 Enero, 2013, 10:48 pm
Agregué el Truco número 5, que genera y abre un archivo HTML en el navegador!!!   :o

Altamente recomendado. ;D

Lo he leído, luego o mañana lo pruebo; veo que usa el comando ECHO, ése es el mismo comando que

utiliza el lenguaje PHP en los formularios para invocar.

Una cosa, hablando del navegador de Internet y estas cosas, ¿se puede convertir un programa a un "ejecutable" con otra extensión? Lo digo porque los archivos exe no dejan subirlos a ningún hosting gratis, ni siquiera muchas veces lo permiten en algunas páginas privadas de pago. En cambio, otros formatos que sirven para ejecutar en otros lenguajes -como el swf por ejemplo- se pueden subir sin problemas o mandar por correo. Esto tiene su importancia, porque si le quieres pasar a un amigo un programa, que haga cualquier cosa de números o lo que sea, a alguien que no tenga una IDE y no sepa nada de C y demás, no puedes; y como no tiene una IDE tampoco sirve que le pases el código fuente.


 Otra cosa más, hecho esta tontería y quisiera ponerle un "goto",  no sé cuál es el "goto" (el goto a la antigua) de C para volver al principio:


#include <stdio.h>

int A,B;

#define Cociente(A,B) (A/B)

#define resto(A,B) A-((A/B)*B)

int main(void)

{
    
 printf("\nIntroduce el dividendo: ");
        
        scanf("%d", &A);
        
        getchar();
        
         printf("\nIntroduce el divisor: ", B);
        
         scanf("%d", &B);
        
         getchar();
        
      
          
 printf( "\n\n\nParte entera de la divisio'n= %d\n\n\n", Cociente(A,B));
 
 printf("Resto=%d", resto(A,B));
    
    getchar();
    
}

Gracias.  
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 11 Enero, 2013, 11:13 pm
Para enviar ejecutables por email hay que ponerlos dentro de un archivo comprimizo ZIP o RAR, ya sea usando WINZIP o WINRAR.

El GOTO de C es así:

Hay que definir una etiqueta:

label hola;

Luego poner la etiqueta en el punto donde queremos ir, en el salto del goto, seguida del signo "dos puntos":

hola:

Luego poner goto seguido de la etiqueta:

goto hola;

 
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 12 Enero, 2013, 12:27 am
Para enviar ejecutables por email hay que ponerlos dentro de un archivo comprimizo ZIP o RAR, ya sea usando WINZIP o WINRAR.

El GOTO de C es así:

Hay que definir una etiqueta:

label hola;

Luego poner la etiqueta en el punto donde queremos ir, en el salto del goto, seguida del signo "dos puntos":

hola:

Luego poner goto seguido de la etiqueta:

goto hola;

 


Ah, gracias  :) Entonces es como en los srcipts de Flash, con una label.

 Y ahora que dices lo de los exes comprimidos, es verdad, no lo recordaba, y mira que lo hice alguna vez.

 Voy a ver cómo funciona tu invento y te cuento.

Saludos. 
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 12 Enero, 2013, 12:46 am
Disculpá, me confundí.

En C no hace falta declarar la etiqueta con label.

Ni siquiera reconoce la palabra label.

Funciona así no más.

Saludos
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 12 Enero, 2013, 01:28 am
Disculpá, me confundí.

En C no hace falta declarar la etiqueta con label.

Ni siquiera reconoce la palabra label.

Funciona así no más.

Saludos


Ah, vale, no lo había probado todavía, ahora lo probaré. Sí he probado lo del HTML, y se ve bien, lo que ocurre es no es una pantalla "interactiva", si pones un scanf que te pide un dato, no puedes escribir, no es lo mismo que la pantalla negra.

 Saludos.

Cuando se pone la etiqueta hay que poner dos puntos detrás, según he visto por ahí, es lo único; y funciona:

etiqueta:

goto etiqueta
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 12 Enero, 2013, 02:13 am
Sí he probado lo del HTML, y se ve bien, lo que ocurre es no es una pantalla "interactiva", si pones un scanf que te pide un dato, no puedes escribir, no es lo mismo que la pantalla negra.


Ya sé...
Ya voy a pensar en algo.

¡Estos hombres de poca fe!

Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 12 Enero, 2013, 02:16 am
Sí he probado lo del HTML, y se ve bien, lo que ocurre es no es una pantalla "interactiva", si pones un scanf que te pide un dato, no puedes escribir, no es lo mismo que la pantalla negra.


Ya sé...
Ya voy a pensar en algo.

¡Estos hombres de poca fe!



 :laugh:
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 12 Enero, 2013, 01:35 pm
Hola, Argentinator. Ya he visto lo que estás haciendo con HTLM. Para esta cuestión sería mejor crear una hoja de estilos CSS, la cual puede estar en otro documento de la carpeta donde se tienen todos los programas de manera que sirve para todo los documentos; lo único que hay que hacer en cada documento es llamar a la hoja de estilos mediante un "<a href" con otro comando que me parece que era "link rel" o algo así (hace tiempo que no lo uso). Míralo a ver si puede ser útil.

Por ejemplo, una de las hojas de estilo de rinconmatematico es ésta:


http://rinconmatematico.com/foros/Themes/default/style.css

Con ese código se abastecen los estilos de todos los posts que hay y habrá en un futuro aunque en sean "distintas" páginas wes, ya que va en el encabezado general de la web.


 Saludos.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 12 Enero, 2013, 01:52 pm
Te digo dos cosas.

Por un lado la idea me parece muy buena.
Si la podés aplicar, y todo funciona, está bueno, y dale para adelante.

Pero por otro lado, voy a tener que aprender algo de CSS, y ver cómo encajarlo en las salidas de todas las HTML que surjan.

Por ahora no lo voy a hacer. En realidad no lo descarto, pero no sé. Creo que por ahora no.
Creo que prefiero llevar a cabo aquello que "todavía se ve sencillo".

Fijate que lo poco que he puesto de HTML es básico y fácil de aprender.

Además, ando con otras ideas en la cabeza.
Quiero hacer unas macros que sirvan, no sólo para obtener una salida para HTML, sino para cualquier otra cosa que a uno se le ocurra.

Por ejemplo, un post de acá del foro.  :P

Y eso nos serviría para aprender un poco más de cosas del lenguaje C, que es lo que nos importa más.

Ya lo tengo listo a esto. Sólo es cuestión de testearlo un poco, documentarlo y explicarlo...  :-*
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 12 Enero, 2013, 03:10 pm


Por ahora no lo voy a hacer.


 Me parece bien, en realidad, esto son "extras", lo importante en un curso de C, tiene que ser el C, lógicamente. Aparte de que yo he olvidado bastante los lenguajes "web", llamémosles así. Hace unos años sí hice algunas web; ahora ya, con los gestores -que los hay para todo, tiendas, blogs, wikis... - yo creo que nadie se preocupa de hacer una web "a mano"; o sólo se hacen modificaciones sobre los propios gestores.

Citar

Además, ando con otras ideas en la cabeza.
Quiero hacer unas macros que sirvan, no sólo para obtener una salida para HTML, sino para cualquier otra cosa que a uno se le ocurra.

Por ejemplo, un post de acá del foro.


 Lo ideal para eso que quieres hacer, y otras cosas parecidas, sin duda sería el lenguaje PHP; yo no lo conozco nada más que por encima, pero es una mezcla de MSdos y lenguajes de programación; es el lenguaje por excelencia de los formularios, las llamadas a correo y tal, aunque lo más "moderno" es el XHTM.

 Te pongo algunos enlaces que he ido encontrando por si te sirven para tu idea:

 Esto es un programa que convierte archivos exe a swf, con lo cual, así, se puede ver en el navegador el código que hayas compilado a partir de código fuente; lo que no sé, porque no lo he descargado, es sí servirá un código compilado a partir de C++ o sólo a partir de Java u otros programas. Si sirve, es una solución muy buena, porque todo el mundo tiene instalado el flash palayer para ver vídeos de Youtube y, por tanto, el swf se va a poder ejecutar en una pantalla del navegador. Y además te ahorras el tener que ejecutar desde MSdos y todas esas cosas.

 http://es.download.cnet.com/FardaSaz-EXE-to-SWF/3000-6676_4-10554387.html

Este otro enlace es de un foro donde sólo se habla de programación, programación de todo tipo y en todos los lenguajes; en el enlace concreto que pongo aparece una consulta sobre como llamar a una rutina en C desde PHP, lo cual serviría también para visualizar el programa en navegador, ya que el PHP es un lenguaje que escribe dentro del HTML; complementario, digamos, como el CSS pero en vez de para estilos para cosas más de programación, como puede ser lectura de archivos que están en otro sitio o que envía el usuario:

 http://www.forosdelweb.com/f18/llamar-programa-c-desde-php-355659/

Saludos :)
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 12 Enero, 2013, 03:43 pm
El primer enlace que pusiste no sé si sirve para lo que estamos hablando.
Me parece que lo que hace es extraer porciones ejecutables de archivos de flash.

En cuanto al PHP, estuve también mirando, y la conclusión a la que llegué es que tendría que aprender PHP, jejeje.
Estuve ya experimentando con formularios, pero cualquier solución posible me parece complicada.
Implica que tengo que aprender cosas yo, luego enseñarlas.
Y sin son cosas muy complicadas del PHP no tiene sentido,
porque todavía estamos con los temas más elementales de C.  :o
Es contradictorio, jeje.

Hay que ir resolviendo un problema a la vez.

Todavía no hemos hecho programas que tengan que pedir datos al usuario.
Y no creo que los haya en un largo rato.
No sé quién te dijo que tenemos urgencia en usar el scanf.

Y si hay que usarlo... lo usamos en línea de comandos, y punto, jeje.



Otra cuestión: Estuve probando macros para distintas salidas, y una de ellas es un post para el foro.
Me dio esto:



HTMLTestingMacros.exe

(clic aquí)

¡Hola Mundo HTML desde C!

* Ejemplo de efecto:  ¡Hola mundo!

* Ejemplo de negrita, subrayado, en color rojo.

Signos especiales: < > & " #

Programación en C: curso online (http://rinconmatematico.com/foros/index.php?topic=64835.msg260248#msg260248)


[cerrar]



Sí: Generó el título, el Spoiler y todo lo que está adentro, incluido el enlace al curso.

¡El programa postea mejor que yo!
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 12 Enero, 2013, 05:09 pm


Otra cuestión: Estuve probando macros para distintas salidas, y una de ellas es un post para el foro.
Me dio esto:



Y, una vez que se visualiza el programa en la pantalla, ¿se puede acceder al curso pinchando? Aquí ya se ve que sí, pero la cuestión es si se puede en el archivo que genera el programa a partir del ejecutable.

 En cuanto a lo otro, yo sé dos cosas y media de PHP, que además he olvidado, no me refiero a aprender PHP ni otra cosa, sólo a utilizar el comando imprescindible para llamar al programa en C y que lo ejecute en el navegador. No sé si puede hacerse con un comando de PHP o con un applet java o con qué concretamente, pero tiene que poder hacerse de alguna manera fácil, casi seguro, la cuestión es encontrar esa manera. Porque quieras que no, si quieres interactuar con el navegador o la red, siempre hay que utilizar algunas rutinas de otro lenguaje que no es puramente de programación, como has hecho al utilizar comandos de MSdos o HTML, es inevitable.
 En lo que más tiempo se pierde es en buscar ese "comando secreto" del lenguaje auxiliar que sea. Si encuentro algo bueno -que sea bueno probándolo con un programa hecho en C ad hoc para probarlo, porque esos enlaces los he puesto según me los he encontrado- ya pongo aquí la sugerencia.

Gracias, saludos.

 
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 12 Enero, 2013, 06:51 pm
Bueno, me parecen muy buenas tus sugerencias.
Gracias por tus aportes.

Yo ando en la misma  búsqueda.
Aunque trato de mantener las cosas simples.

De HTML he usado sólo lo básico, que se entiende muy bien.
De Latex, se supone que todos entendemos. Aún así, sólo puse comandos básicos.
Para el foro todos estamos acostumbrados a sus etiquetas para formatear texto.

Y en cuanto a los BAT de la línea de comandos, he usado cosas muy simples, que se resumen en ejecutar programas, y redirigirlos, lo cual no amerita que sepamos mucho de los comandos de CMD.
(Creo que sólo usé el ECHO, que muestra mensajitos, y es "lo mismo"  :-X que un printf).

Si encontramos algo simple para manejar formularios en PHP, bienvenido.
Hasta ahora no he tenido suerte.

Además, si hace falta interactuar con el usuario, usamos la ventana de comandos, y listo.  :P



Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 12 Enero, 2013, 07:07 pm


Otra cuestión: Estuve probando macros para distintas salidas, y una de ellas es un post para el foro.
Me dio esto:



Y, una vez que se visualiza el programa en la pantalla, ¿se puede acceder al curso pinchando? Aquí ya se ve que sí, pero la cuestión es si se puede en el archivo que genera el programa a partir del ejecutable.
 

Acá está todo el tema desarrollado:

http://rinconmatematico.com/foros/index.php?topic=64835.msg261158#msg261158 (http://rinconmatematico.com/foros/index.php?topic=64835.msg261158#msg261158)

En el caso de generar HTML, el enlace sí sirve para pinchar y acceder.

En el caso de LATEX, se genera un archivo de extensión TEX, lo cual no sirve para "pinchar y ver".
Primero hay que compilarlo (con PDFLATEX), y entonces en el PDF que genera sí que sirve el enlace generado ahí (usa el paquete hyperref para lograrlo), permitiendo "pinchar y ver".

En el caso de la salida para "el foro del rincón", se genera sólo "algo en modo de texto".
Allí no se puede pinchar ni ver nada.
Usando el BAT que puse en el tutorial, se genera un TXT, que abre con el bloc de notas.

El contenido lo pegás acá en el foro, y luego sí que podrás "pinchar el enlace y abrir la web".

En el caso de la salida estándar por ventana de comandos... ahí no se puede acceder al enlace, claro está.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 12 Enero, 2013, 07:12 pm


Si encontramos algo simple para manejar formularios en PHP, bienvenido.
Hasta ahora no he tenido suerte.


Ni yo tampoco, no encuentro nada de momento  :-\

 Si he visto cómo se puede abrir una página web desde la consola que ejecuta el C++ (la negra que tanto te gusta :D ) con esto

system("Explorer \"http://rinconmatematico.com/foros/index.php?topic=64835.msg260248#msg260248\"");

Donde pone Explorer se pone el navegador que sea (en linux se puede poner otro navegador según he leído, pero en Windows a mí sólo me deja con Explorer).

Lo puedes poner detrás de la Url en el último programa que has hecho, al final del todo y antes de un getchar() con un letrero que diga "Pulse Enter para ir al curso... etc".

  Saludos.  

Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 12 Enero, 2013, 07:15 pm


En el caso de la salida estándar por ventana de comandos... ahí no se puede acceder al enlace, claro está.


Estaba escribiendo y no había visto esta última respuesta; se puede inventar una cosa con System; lo he puesto en la otra respuesta.

Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 12 Enero, 2013, 07:23 pm


Si encontramos algo simple para manejar formularios en PHP, bienvenido.
Hasta ahora no he tenido suerte.


Ni yo tampoco, no encuentro nada de momento  :-\

 Si he visto cómo se puede abrir una página web desde la consola que ejecuta el C++ (la negra que tanto te gusta :D ) con esto

system("Explorer \"http://rinconmatematico.com/foros/index.php?topic=64835.msg260248#msg260248\"");

Donde pone Explorer se pone el navegador que sea (en linux se puede poner otro navegador según he leído, pero en Windows a mí sólo me deja con Explorer).

Lo puedes poner detrás de la Url en el último programa que has hecho, al final del todo y antes de un getchar() con un letrero que diga "Pulse Enter para ir al curso... etc".

  Saludos.  



Es cierto.

Además con system se puede hacer todo lo que normalmente se hace desde el sistema: ejecutar programas, abrir carpetas, etc.

Eso es hacer ya mucha trampa.

Yo más o menos me he permitido usar otras cosas, sólo por una cuestión de tener una visualización más cómoda, y porque detesto la ventanita negra esa.

Pero sigue siendo complicada la entrada de datos sin scanf.

No hay que preocuparse tampoco, falta mucho todavía para que lleguemos a usar scanf.
No sé además si lo vamos a usar mucho.

Hay que resolver los problemas en la medida que van surgiendo.
Aún no hemos tenido que usar scanf. Así que, ¿por qué sufrir?
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 12 Enero, 2013, 07:53 pm
Ya  he visto lo nuevo, buen trabajo.  :aplauso:

 Aunque de momento yo me conformo con la pantalla negra, esto lo veo más para profesionales que quieran publicar cosas bien presentadas; y eso me queda muy lejos a mí  :P
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 12 Enero, 2013, 09:32 pm
Lo importante es ver cómo se logra eso con las macros.

Además, la idea va por otro lado, no tanto lo visual:

Fijate que hay al menos 5 formas distintas de mostrar la misma información.
Esas formas son muy diferentes, y en cambio las hicimos todas con un solo programa.
Cada una se generó simplemente cambiando el valor de una constante al principio del programa:

#define OUTPUT_MODE (elegir acá la constante entre 0 y 4)

En lo que estamos pensando es en mirar el formato de los datos como algo "abstracto".

Tenemos: negritas, cursivas, fuentes, enlaces urls, etc., y todo eso está dado "en abstracto".
El resultado real que tendrá, si como HTML, LATEX, el foro, la consola, etc., es sólo la manera final y visual en que la información se muestra.

Lo que quiero lograr es que se entienda esa forma abstracta de pensar en los atributos de formato de texto.

Ahora "poner negritas" no quiere decir más esto:  NEGRITAS.
Ahora "poner negritas" es sólo un atributo lógico de la información presentada.

Para HTML se dice con etiquetas <b> </b>, en el foro se dice con etiquetas [b]  [/b], en latex se dice con  {\bfseries ...  }, en la consola no se puede decir de ninguna forma..., y en otros contextos "poner negritas" se puede reinterpretar como uno quiera, por ejemplo, poniendo un resaltado.

El uso de las macros que hemos definido permite ese grado de abstracción...

Lo único malo es que estas macros no son el mejor camino para lograrlo en el lenguaje C.
Hay que aprender otras herramientas mejores.

Sin embargo, me parece una buena lección advertir que con las pocas herramientas de programación que tenemos hasta ahora (constantes, macros, y números enteros), somos capaces de lograr cosas complejas e interesantes.

Las macros dan un grado de abstracción muy alto en la programación en C,
pero al mismo tiempo son un elemento extraño del lenguaje.
La programación profesional intenta usar funciones en vez de macros,
porque las macros tienen un comportamiento cuyas consecuencias es difícil de controlar.
Son demasiado flexibles.

A mí me parece que son un tema que merece un estudio más profundo.
Hay cuestiones informáticas importantes en torno a ese tema.

Desde ya que el estilo de programación que he estado usando no es el más profesional.
¿Por qué? Porque a esas macros en realidad les podemos pasar parámetros que contengan cualquier cosa,
incluso una ristra de símbolos como esto: ))*!"·$&ASDF!414rnkv.

En esos casos, las macros se comportarán de forma alocada,
obtendremos errores con el compilador, y será muy arduo descifrar dónde está el error.

Además, es complicado depurar un programa con macros muy complejas.
Cada vez que cometí un error, pasé largo rato buscando la falla.
El compilador no es capaz de ser claro en esto,
porque el compilador no ve nuestras macros, sino que ve el resultado final después de que el preprocesador las convirtió a un programa válido en lenguaje C... pero sin macros.

Sólo les puedo pedir paciencia.
Cuando tengamos más herramientas, tendremos técnicas más sólidas de programación.

Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 12 Enero, 2013, 09:59 pm
Lo importante es ver cómo se logra eso con las macros.

Además, la idea va por otro lado, no tanto lo visual:



 Ya entiendo lo que dices, que tiene interés como ejercicio.

 Me ha pasado una cosa rara con el MSdos, al ejecutar OUTPU.TXT o OUTPUT punto lo que sea, ahora se me abre siempre la ID con el código fuente del programa que quiero abrir, no sé que habré hecho, porque no tiene lógica ninguna...  :o

 
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 12 Enero, 2013, 10:21 pm
Lo importante es ver cómo se logra eso con las macros.

Además, la idea va por otro lado, no tanto lo visual:



 Ya entiendo lo que dices, que tiene interés como ejercicio.

 Me ha pasado una cosa rara con el MSdos, al ejecutar OUTPU.TXT o OUTPUT punto lo que sea, ahora se me abre siempre la ID con el código fuente del programa que quiero abrir, no sé que habré hecho, porque no tiene lógica ninguna...  :o

 

La verdad no sé.

Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 13 Enero, 2013, 01:57 am


La verdad no sé.



Creo que era porque tenía la IDE y la carpeta juntas en el Escritorio.

No, ya está, era que en vez de poner HTMLHolaMundo.exe, ponía punto c, y claro, por eso abría la IDE.

Mira que no haberte dado cuenta :D :D
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 13 Enero, 2013, 02:37 am


La verdad no sé.



Creo que era porque tenía la IDE y la carpeta juntas en el Escritorio.

No, ya está, era que en vez de poner HTMLHolaMundo.exe, ponía punto c, y claro, por eso abría la IDE.

Mira que no haberte dado cuenta :D :D


Pasa hasta en las mejores familias.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 13 Enero, 2013, 02:40 am
En las últimas versiones de "todo este asunto" (por llamarlo de alguna manera),
el archivito BAT funciona de otra manera.

Ese proceso por lotes EYV.BAT ahora "no le gusta" que escribas directamente la extensión .EXE.
La pone él solo, por otras razones.

Te aviso por las dudas llegás a usar algo de eso.

Saludos
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 13 Enero, 2013, 02:59 am
Código: [Seleccionar]
Mira, éste es el código fuente del archivo OUTPUT.HTML tal y como queda, lo he copiado:

 <pre><font face="Arial"><font color="blue"><b>¡Hola Mundo HTML desde C!

</b></font>* <u>Ejemplo de efecto:</u>  <font color="blue">¡Hola mundo!

</font><font color="blue"><u><b>* Ejemplo de negrita, subrayado, en color rojo.

</b></u></font><a href="http://rinconmatematico.com/foros/index.php?topic=64835.msg260248#msg260248">Programación en C: curso online</a></font>


O sea, lo que hace el documento es recibir el texto como fuente, evidentemente, no como texto visible de HTML en ningún caso.

Si haces un sólo macro que llame a una hoja de estilos (una que esté ya hecha, que se puede pillar de cualquier página, para no tener que aprender nada, sólo para probar) y la metes en la carpeta de los archivos, guardada con extensión punto css, cualquier documento exe que lleve ese macro y el printf de ese macro, tendrá el tamaño, color de letra, etc., que aparece en la hoja de estilos. Claro que no se puede personalizar cambiando el valor de "x" como en tu programa, pero es otro tipo de experimento también interesante. Mañana intento hacer un programa análogo al tuyo, más sencillo, pero con hoja de estilos, a ver si me sale.

 El macro tiene sólo que definir esta llamada

 <LINK href="Argentinator-style.css" rel="stylesheet" type="text/css">


Para probar, basta con esta hoja de estilos elemental que he tomado de una página en la que viene como ejemplo:

P.especial {
color : green;
border: solid red;
}

Eso se guarda con el bloc de notas y con extensión "nombre.css" y ya está, se hace el macro del link y a correr :) tiene que salir.

Lo he sacado de aquí:  http://html.conclase.net/w3c/html401-es/present/styles.html.




Saludos y buenas noches.


 
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 13 Enero, 2013, 03:00 am
En las últimas versiones de "todo este asunto" (por llamarlo de alguna manera),
el archivito BAT funciona de otra manera.

Ese proceso por lotes EYV.BAT ahora "no le gusta" que escribas directamente la extensión .EXE.
La pone él solo, por otras razones.

Te aviso por las dudas llegás a usar algo de eso.

Saludos

Pero si no le pongo la extensión .exe me crea el archivo pero no me abre la ventana del navegador automáticamente, tengo que ir a la carpeta que se ha creado y pinchar.

Sí funciona lo del CSS, y cualquier cosa siempre que se tenga cuidado con los símbolos especiales de HTML que se puedan confundir con los que utiliza el C, pero los macros no tienen nada especial en este caso que no tengan en otro, guardan cadenas, parámetros o cosas que también puedes poner directamente en un printf.

  Mira, ejecuta esto:

  #include <stdio.h>

int main(void){
    printf("<img src=\"http://informaticaloren.files.wordpress.com/2012/07/analista-informaticaloren3.jpg\">");
   
    }






De acuerdo, le ponía la extensión por si acaso.

Gracias.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 13 Enero, 2013, 03:43 am
Código: [Seleccionar]
Mira, éste es el código fuente del archivo OUTPUT.HTML tal y como queda, lo he copiado:

 <pre><font face="Arial"><font color="blue"><b>¡Hola Mundo HTML desde C!

</b></font>* <u>Ejemplo de efecto:</u>  <font color="blue">¡Hola mundo!

</font><font color="blue"><u><b>* Ejemplo de negrita, subrayado, en color rojo.

</b></u></font><a href="http://rinconmatematico.com/foros/index.php?topic=64835.msg260248#msg260248">Programación en C: curso online</a></font>


O sea, lo que hace el documento es recibir el texto como fuente, evidentemente, no como texto visible de HTML en ningún caso.

Si haces un sólo macro que llame a una hoja de estilos (una que esté ya hecha, que se puede pillar de cualquier página, para no tener que aprender nada, sólo para probar) y la metes en la carpeta de los archivos, guardada con extensión punto css, cualquier documento exe que lleve ese macro y el printf de ese macro, tendrá el tamaño, color de letra, etc., que aparece en la hoja de estilos. Claro que no se puede personalizar cambiando el valor de "x" como en tu programa, pero es otro tipo de experimento también interesante. Mañana intento hacer un programa análogo al tuyo, más sencillo, pero con hoja de estilos, a ver si me sale.

 El macro tiene sólo que definir esta llamada

 <LINK href="Argentinator-style.css" rel="stylesheet" type="text/css">


Para probar, basta con esta hoja de estilos elemental que he tomado de una página en la que viene como ejemplo:

P.especial {
color : green;
border: solid red;
}

Eso se guarda con el bloc de notas y con extensión "nombre.css" y ya está, se hace el macro del link y a correr :) tiene que salir.

Lo he sacado de aquí:  http://html.conclase.net/w3c/html401-es/present/styles.html.




Saludos y buenas noches.


 


Bueno, me parece un buen ejercicio.
Te queda de tarea hacerlo, que funcione, y después explicármelo con cariño para que yo lo entienda.

Estoy algo negado con CSS. El HTML lo entiendo más, por más que no conozco el lenguaje en detalle.
A ver si me hacés amigo del CSS.

Está bueno ir jugando y agregando más posibilidades.






Citar

O sea, lo que hace el documento es recibir el texto como fuente, evidentemente, no como texto visible de HTML en ningún caso.

No sé a qué te referís con eso.
El HTML es eso.
Si mirás dentro de cualquier archivo HTML, vas a ver que es texto con etiquetas de formato.

Es por eso que sabía que podía jugar con él.
De la misma manera que es posible generar comandos de Latex, porque son comandos de texto.

Y del mismo modo, es posible generar etiquetas para posts del foro.

De hecho, las etiquetas del foro son "heramas gemelas" del HTML.
Cuando aplicamos negritas, fuentes, colores, y demás atributos en los posts del foro, estamos aplicando HTML, sólo que está algo encubierto (tiene corchetes [ ] en vez de ángulos < >).



No es posible generar "texto visible" de HTML, eso sólo lo generan los programas navegadores.
Es decir, el navegador (Explorer ó Firefox o Chrome), toman un archivo "fuente" HTML, como el que me mostraste.
Y se encarga luego de interpretar eso y generar un resultado "visual" y "bonito" para el usuario del navegador. Pero eso es sólo estético.
Lo único "real" es el texto "marcado" (o formateado) dentro del HTML.

Es todo texto. Si no, no se puede. Magia no hago...
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 13 Enero, 2013, 03:46 am
Citar
<LINK href="Argentinator-style.css" rel="stylesheet" type="text/css">

No le pongas "Argentinator", que la gente va a creer que me salió a mí.

A menos que estés sugiriendo que elija mi propio estilo.

Pero en eso no soy muy exigente. Mi estilo es: "cualquier cosa que no sea la ventana de comandos de MS-DOS".

Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 13 Enero, 2013, 04:08 am
Citar
<LINK href="Argentinator-style.css" rel="stylesheet" type="text/css">

No le pongas "Argentinator", que la gente va a creer que me salió a mí.

A menos que estés sugiriendo que elija mi propio estilo.

Pero en eso no soy muy exigente. Mi estilo es: "cualquier cosa que no sea la ventana de comandos de MS-DOS".



Pobre ventana, con lo mona que es y lo bien que veo ya las letras blancas sobre fondo negro, que no me da reflejo.

 Bueno, lo de Argentinator era un homenaje.

 ¿Viste esto que añadí en azul en el otro comentario?

 #include <stdio.h>

int main(void){
    printf("<img src=\"http://informaticaloren.files.wordpress.com/2012/07/analista-informaticaloren3.jpg\">");
   
    }

 Funciona, y con un vídeo también; lo estilos CSS por supuesto que funcionarán, no puede ser de otra manera, pero ya no trae más cuenta hacerlo, ya he entendido como va. Es que al principio me despistaba, no sabía qué era lo que se cargaba en el archivo de salida, por un momento había pensado que era una mezcla de fuente y texto plano, pero no podía ser, claro  :P

 Ah, he probado una operación matemática sencilla definida mediante un macro y añadida a la foto del chiste; para ver si la evaluaba; y sí, la evalúa y el resultado aparece en el HTML junto a lo demás


Gracias, hasta mañana.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 13 Enero, 2013, 04:16 am
En las últimas versiones de "todo este asunto" (por llamarlo de alguna manera),
el archivito BAT funciona de otra manera.

Ese proceso por lotes EYV.BAT ahora "no le gusta" que escribas directamente la extensión .EXE.
La pone él solo, por otras razones.

Te aviso por las dudas llegás a usar algo de eso.

Saludos

Pero si no le pongo la extensión .exe me crea el archivo pero no me abre la ventana del navegador automáticamente, tengo que ir a la carpeta que se ha creado y pinchar.

Sí funciona lo del CSS, y cualquier cosa siempre que se tenga cuidado con los símbolos especiales de HTML que se puedan confundir con los que utiliza el C, pero los macros no tienen nada especial en este caso que no tengan en otro, guardan cadenas, parámetros o cosas que también puedes poner directamente en un printf.

  Mira, ejecuta esto:

  #include <stdio.h>

int main(void){
    printf("<img src=\"http://informaticaloren.files.wordpress.com/2012/07/analista-informaticaloren3.jpg\">");
   
    }






De acuerdo, le ponía la extensión por si acaso.

Gracias.


No, no te confundas.

A ver, la culpa de la confusión la tengo yo.

Está bien que le hayas puesto la extensión EXE a los programas más viejos, pero los más nuevos van a funcionar sin la extensión.

El proceso por lotes Ejecutar_y_ver.BAT, ése sí acepta que pongas la extensión EXE.

Pero el nuevo EYV.BAT, ése no.

Se usaría así:

EYV    OutputHolaMundo   HTML

Si el navegador no te lo abre automáticamente tras eso,
no sé, creo que puede deberse a que estás corriendo un Windows dentro de Linux.

En ese caso la solución sería cambiar el EYV.BAT a algo más específico.
Se me ocurre hacer esto:

Un proceso por lotes llamado:

EYV2.BAT:

%1.EXE > %1.%2

goto %2


:HTML
"C:\Archivos de programa\Internet Explorer\iexplore.exe" %1.%2
GOTO TERMINAR

:TEX
"C:\Archivos de programa\MiKTeX 2.7\miktex\bin\PDFLATEX.exe" %1.%2
"C:\Archivos de programa\Adobe\Acrobat 7.0\Reader\AcroRd32.EXE" %1.PDF
GOTO TERMINAR


:TXT
NOTEPAD %1.%2


:TERMINAR

____________________________


A mí esto  me funcionó.

Es más largo porque para cada caso (HTML, TEX, TXT), hay que decirle explícitamente el programa que tiene que usar para abrir el archivo.

Pero fijate que estoy usando la extensión pasada como 2do parámetro (lo que se indica con %2),
como el mismo nombre para las etiquetas del GOTO.

Así que, si la extensión es HTML, el GOTO salta a la etiqueta HTML, y abre el navegador con el documento HTML que hemos generado.

En el caso del TEX, directamente te lo puse para que compile el archivo TEX que generamos con PDFLATEX, eso genera a su vez un PDF, que en la siguiente instrucción le ordenamos que lo abra con el Acrobat Reader, explícitamente.

En el caso de TXT, lo mandé a que abra el Bloc de Notas (Notepad).

___________

Lo que vos tendrías que hacer es corregir lo que te acabo de dar, poniendo la ruta exacta de los programas de tu sistema:
La ruta exacta de tu navegador,
la ruta exacta donde se ubican tus archivos binarios de LATEX,
y la ruta exacta donde se encuentra tu programa Acrobat Reader.

Esto es bien explícito, y no depende de que a Windows se le ocurra o no abrir automáticamente archivos de extensiones HTML, TEX o TXT.
(A lo mejor es sólo un problema de configuración de tu windows, pero bueno, no sé).
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 13 Enero, 2013, 04:20 am
Citar
<LINK href="Argentinator-style.css" rel="stylesheet" type="text/css">

No le pongas "Argentinator", que la gente va a creer que me salió a mí.

A menos que estés sugiriendo que elija mi propio estilo.

Pero en eso no soy muy exigente. Mi estilo es: "cualquier cosa que no sea la ventana de comandos de MS-DOS".



Pobre ventana, con lo mona que es y lo bien que veo ya las letras blancas sobre fondo negro, que no me da reflejo.

 Bueno, lo de Argentinator era un homenaje.

 ¿Viste esto que añadí en azul en el otro comentario?

 #include <stdio.h>

int main(void){
    printf("<img src=\"http://informaticaloren.files.wordpress.com/2012/07/analista-informaticaloren3.jpg\">");
   
    }

 Funciona, y con un vídeo también; lo estilos CSS por supuesto que funcionarán, no puede ser de otra manera, pero ya no trae más cuenta hacerlo, ya he entendido como va. Es que al principio me despistaba, no sabía qué era lo que se cargaba en el archivo de salida, por un momento había pensado que era una mezcla de fuente y texto plano, pero no podía ser, claro  :P

 Ah, he probado una operación matemática sencilla definida mediante un macro y añadida a la foto del chiste; para ver si la evaluaba; y sí, la evalúa y el resultado aparece en el HTML junto a lo demás


Gracias, hasta mañana.

La verdad es que no logro ver nada.
Me da error 404.

Logré ver sola la imagen del chiste. Pero no veo nada más.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 13 Enero, 2013, 04:27 am
Citar
no sabía qué era lo que se cargaba en el archivo de salida, por un momento había pensado que era una mezcla de fuente

Claro, no.

Solamente se envía el "nombre de la fuente".

La información gráfica de la fuente la tiene el navegador, o la tiene Windows, o quien sea,
pero nosotros no le enviamos nada al respecto.

Si justo enviamos un "nombre de fuente" que no se corresponde con ninguna fuente existente o accesible,
es muy probable que se vea mal, o que no se vea nada, o que se cargue una fuente por defecto, no sé.

Es decir, es claro que nuestras macros hechas en C no son nada sofisticadas.
Es responsabilidad nuestra poner justo ahí un nombre de fuente que luego "tenemos la suerte de que exista".

Dentro de los archivos HTML no va esa información. Que yo sepa, no se "embeben" fuentes en el archivo HTML, sino que esa información (la del dibujito de las letras de la fuente) está quién sabe dónde.
En los archivos PDF creo que sí es posible embeber fuentes.

Pero los PDF no se pueden tratar con la facilidad de los archivos tipo "texto", como sí lo es el HTML.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 13 Enero, 2013, 01:48 pm
La verdad es que no logro ver nada.
Me da error 404.


Logré ver sola la imagen del chiste. Pero no veo nada más.

 Sí, eso es lo que sale, la imagen nada más, pero a mí no me dio ningún error, ese error creo que es el que da cuando los servidores están caídos o no estás conectado a la red, ¿no? Claro, si el servidor donde está alojada la imagen, el vídeo o lo que sea, no está activo, no se ve, porque lo que hace la instrucción HTML es llamar a esa imagen para que salga en el navegador. Pero si sustituyes la imagen por una que esté en una carpeta de tu ordenador, o que esté en la misma carpeta de los archivos del C, para que sea más corto escribir la ruta, entonces se ve siempre; poniendo "imagen.jpg" o con la extensión que tenga.

 Lo que se crea es un index.html, ni más ni menos, al cual, si le pones el "head" el body y todo lo necesario, lo puedes subir a un servidor como index normal; y, por supuesto, junto con él y en el mismo directorio a no ser que se señale en la ruta otra cosa, las imágenes y demás archivos, para que se quede guardado en el disco duro del alojamiento.

 Si haces lo mismo con este comando HTML y esta dirección

 <"frame src="http://rinconmatematico.com/foros/index.php?"></iframe>

en el documento aparecerá una ventanita con barra para desplazarse en scroll y todo eso, y dentro de ella la página principal de los foros (fíjate que no es index.html, es index.php, porque es dinámica, tiene formularios, correos internos y cosas que, sólo con el HTML, no puedes hacer).

 Incluso se podría intentar una cosa curiosa con esto del Iframe, voy a ver... ("voy a ver", dijo un cegato  8^) :D

 Saludos.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 13 Enero, 2013, 05:35 pm
Bueno, lo del iframe funciona.

Sin embargo no hay manera de solucionar lo del scanf usando sólo HTML,
porque no hay etiquetas HTML para interactuar con el usuario.

No importa, hay otras cosas que hacer antes de llegar al bendito scanf.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 13 Enero, 2013, 05:42 pm
Bueno, lo del iframe funciona.

Sin embargo no hay manera de solucionar lo del scanf usando sólo HTML,
porque no hay etiquetas HTML para interactuar con el usuario.

No importa, hay otras cosas que hacer antes de llegar al bendito scanf.

 No, no se puede porque parece ser que el archivo HTML que genera es simplemente eso, no guarda el exe dentro; basta tan solo con mirar el peso del archivo generado, es un simple HTML. Porque podríamos hacer que los parámetros de las macros fueran a la vez variables de HTML dinámico y cambiarlas a través de un formulario para que, por ejemplo, al recibir los nuevos datos se haga una operación nueva; pero no me he molestado en intentarlo, no va a funcionar por eso, porque el exe ya no está ahí dentro, se ha ido al cielo o al limbo de los archivos, que también se van al cielo todos los archivos buenos, parodiando a Machín y su canción angelitos negros  :laugh:

Saludos.

En la pantalla negra, al pinchar en la esquina, además de "propiedades" tiene otra opción que es "predeterminadas", y ahí ya si guarda las modificaciones en cuanto a tamaños y colores, el problema siguen siendo los acentos, la "ñ" y tal, que sería cuestión de agregar a la configuración del CMD la codificación necesaria
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 13 Enero, 2013, 06:37 pm
Bueno, lo del iframe funciona.

Sin embargo no hay manera de solucionar lo del scanf usando sólo HTML,
porque no hay etiquetas HTML para interactuar con el usuario.

No importa, hay otras cosas que hacer antes de llegar al bendito scanf.

 No, no se puede porque parece ser que el archivo HTML que genera es simplemente eso, no guarda el exe dentro; basta tan solo con mirar el peso del archivo generado, es un simple HTML. Porque podríamos hacer que los parámetros de las macros fueran a la vez variables de HTML dinámico y cambiarlas a través de un formulario para que, por ejemplo, al recibir los nuevos datos se haga una operación nueva; pero no me he molestado en intentarlo, no va a funcionar por eso, porque el exe ya no está ahí dentro, se ha ido al cielo o al limbo de los archivos, que también se van al cielo todos los archivos buenos, parodiando a Machín y su canción angelitos negros  :laugh:

Saludos.

En la pantalla negra, al pinchar en la esquina, además de "propiedades" tiene otra opción que es "predeterminadas", y ahí ya si guarda las modificaciones en cuanto a tamaños y colores, el problema siguen siendo los acentos, la "ñ" y tal, que sería cuestión de agregar a la configuración del CMD la codificación necesaria

Los navegadores no permiten correr archivos ejecutables.
Es la forma más directa de quitarse problemas de encima.


En cuanto a los colores del CMD, ya lo pude arreglar, ya que haciendo clic en el iconito de arriba, en donde dice "Predeterminados", te permite cambiar los colores que van a aparecer en forma predeterminada.

Para cambiar la codificación de los caracteres, hay que usar la página de códigos 28591, que corresponde a la opción de ISO-8859-1, y se carga de la siguiente manera:

CHCP 28591

Eso mostrará bien los acentos y las eñes, y todo lo demás.

Si queremos que esto esté disponible desde el arranque de la ventana de comandos,
podríamos intentar editar algunos de los archivos de arranque...
Pero a mí eso no me funcionó.

En cambio, es más seguro, aunque redundando, poner la sentencia de CHCP directamente en los procesos por lotes que nosotros mismos hemos definido: el EJECUTAR_Y_VER.bat, o el EYV.bat, etc.

_________

También podemos crear un proceso por lotes "arreglaracentos.bat", que selecciona la página de códigos correcta, así:

ARREGLARACENTOS.BAT:

CHCP 28591
_____________


O sea, tan sólo esa línea.
Digo, por si no nos acordamos el numerito ese de 28591.

Incluso, nuestras aplicaciones que corran directamente en consola,
podrían agregar desde el lenguaje C la siguiente llamada al sistema:

system("CHCP 28591");  /* Página de códigos para ISO-8859-1 */
                                 /* Esto arregla los acentos y las eñes en consola. */

Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 13 Enero, 2013, 07:07 pm
Tengo una duda sobre qué tema seguir desarrollando en la teoría.

Pensaba seguir con los tipos de datos numéricos de coma flotante,
pero me parece que para expicar apropiadamente los detalles de ese tipo de datos hay que haber dicho algo sobre los operadores aritméticos, de los cuales no he dicho nada, y los pesaba postergar para después que hubiésemos terminado de explicar los tipos mismos.

Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 13 Enero, 2013, 08:28 pm
Tengo una duda sobre qué tema seguir desarrollando en la teoría.

Pensaba seguir con los tipos de datos numéricos de coma flotante,
pero me parece que para expicar apropiadamente los detalles de ese tipo de datos hay que haber dicho algo sobre los operadores aritméticos, de los cuales no he dicho nada, y los pesaba postergar para después que hubiésemos terminado de explicar los tipos mismos.



Gracias por lo de los códigos, estaba pensando en hacer una engorrosa conversión de mediante los ASCII, pero así es mucho más cómodo. Después lo probaré.

 Sigue por dónde tú creas más conveniente, yo tengo noticias del float porque he mirado por ahí, pero o lo conozco en profundidad. En cuanto a los operadores los conozco de otros lenguajes pero tampoco sé si aquí todo va exactamente igual.

 Saludos.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 13 Enero, 2013, 09:35 pm
En cuanto a la configuración de la ventana de comandos, he agregado un post a la teoría:

Trabajando en la ventana de comandos. (http://rinconmatematico.com/foros/index.php?topic=64835.msg260503#msg260503)
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 13 Enero, 2013, 11:00 pm
En cuanto a la configuración de la ventana de comandos, he agregado un post a la teoría:

Trabajando en la ventana de comandos. (http://rinconmatematico.com/foros/index.php?topic=64835.msg260503#msg260503)

Citar
Quiero agradecer a Feriva su colaboración en este tópico, que a mí me produce tantas lágrimas.


Quedo muy agradecido por el agradecimiento, más que tú :D

 Ahora acabo de leer lo que has puesto.

Tiene muy buena pinta, mañana lo hago, a ver si salen los acentos y eso (has desvelado   el lugar de mi carpeta, ahora podrán atacarme los hackers  :o :D

 Gracias.   
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 14 Enero, 2013, 12:10 am

 Una sugerencia cómoda para crear el acceso directo escribiendo un poco menos es usar el buscador del inicio poniendo CMD como cosa a buscar; aparece el icono en una lista, se pincha con botón derecho y se selecciona "acceso directo"; y después todo lo demás.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 15 Enero, 2013, 06:51 am
Al final me decidí por el tema de los números de punto flotante (o coma flotante).

Es un tema complicado, y entonces habrá varios posts meramente teóricos, sin programación.

Después recién podremos hacer algunos experimentos de programación y ver qué sale.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 15 Enero, 2013, 10:44 am
Al final me decidí por el tema de los números de punto flotante (o coma flotante).

Es un tema complicado, y entonces habrá varios posts meramente teóricos, sin programación.

Después recién podremos hacer algunos experimentos de programación y ver qué sale.


Visto  8^)

Saludos.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 17 Enero, 2013, 02:07 am
Leído el nuevo post.

 Una forma en principio cómoda para anotar el exponente \( \pm{r} \) en el caso de los float  hexadecimales  podría ser

 \( \pm{(r_{10})_{16}} \)

 de manera que se ve el número en base decimal pero no se pierde de vista que la base verdadera en que se está trabajando es la hexadecimal.

Porque imagino que lo hicieron así porque entendieron "r" como el número de veces que se multiplica la base y se puede entender en "veces" enteras dando igual anotarlo en una base o en otra. Pero esa "comodidad" puede llevar a confusiones y a ver espejismos paradójicos  :o

 Saludos y buenas noches.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 17 Enero, 2013, 02:46 am
Bueno, en realidad hay que dejar claro que se trata de base 10,

Cuando uno escribe una constante hexadecimal:

1.3p-20

ese "20" está en base 10.

Además, la base elevada a 10 tampoco es 16, sino 2.

A ver si con un ejemplo se ve mejor:

15.0p+10

es el número (15) en base 16 (o sea 21 en base 10) multiplicado por 2 elevado a +10.
El resultado es \( 21\cdot 2^{10} = 21 \cdot 1024 \).

Acá lo importante es entender qué significa esa notación, o sea, qué entiende el compilador.

El compilador entiende que la mantisa 15.0 está en base "16",
y que la base 2 (y no 16) tiene que elevarse al número "+10" en base decimal.

Por eso no voy a cambiar la notación que usé,
porque cada parte está en la base de numeración que le tocó, y lo que tenemos que lograr es entenderlo y aprenderlo tal como es.

Es un tema arduo, y lamentablemente no hay más remedio que tomarlo como viene.
Agregar más notación sólo agrega más confusión.
Lo que hay que hacer es entender bien qué hace el C con las constantes hexadecimales.

_______________________

Me ha costado mucho escribir esto.
El tema de los números en punto flotante es terrible, tiene muchas complicaciones.
Me he limitado a explicar los aspectos más básicos.

De los temas básicos quedan aún dos aspectos: las constantes definidas por el compilador que dan información sobre los tipos de punto flotante, y el tema de los redondeos y pérdida de precisión en las conversiones.

Falta un trecho todavía hasta que hagamos algún programa.

Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 17 Enero, 2013, 03:09 am
Bueno, en realidad hay que dejar claro que se trata de base 10,

Cuando uno escribe una constante hexadecimal:

1.3p-20

ese "20" está en base 10.

Además, la base elevada a 10 tampoco es 16, sino 2.

A ver si con un ejemplo se ve mejor:

15.0p+10

es el número (15) en base 16 (o sea 21 en base 10) multiplicado por 2 elevado a +10.
El resultado es \( 21\cdot 2^{10} = 21 \cdot 1024 \).

Acá lo importante es entender qué significa esa notación, o sea, qué entiende el compilador.




¡Jéesus! no me pidas que entienda al compilador, lo acato, él sabrá lo que hace. Bueno, al menos 2 es 2 en las tres bases que usa, así que eso no me preocupa tanto por una parte, aunque por otra tampoco entiendo muy bien por qué toma como base de la potencia el 2.
 Es como una torre de Babel, donde además de las mil lenguas normales se hablan mezclas como el spaninglish, pero en vez de con idiomas de palabras con distintos idiomas de números  :P

 Gracias, Argentinator, hasta mañana. 
 
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 17 Enero, 2013, 03:50 am
En realidad la intención es usar base 2, pero resulta que es muy engorroso.

La notación en base 16 hay que pensarla como una mera abreviatura de la base 2.
Es más práctico para el programador (cada dígito en base 16 es un paquetito de 4 bits en base 2).

En cuanto al exponente en base 10, tiene sentido porque es sólo un factor de escala,
y es más fácil para el programador "pensar" en base 10.
El factor de escala en base 2 equivale a un corrimiento de bits.

Si uno pone 1.0p+5,
quiere decir que corre hacia la izquierda al bit 1, en una cantidad de 5 bits.
Si uno pone 1.0p-5, equivale a un corrimiento hacia la derecha de 5 bits.

Para el programador es más fácil pensar ese "corrimiento de 5 bits" hacia un costado o hacia el otro, usando el número 5 en decimal, que no en binario o en hexadecimal, que serían un sufrimiento innecesario.

Después de todo, los problemas de redondeo se producen en la mantisa.
Si la mantisa es hexadecimal, los problemas de redondeo desaparecen, y entonces no es necesario escribir el exponente en base 16, sino que la base 10 tiene un significado claro.

_______________

En cuanto a entender el compilador... es algo que ocurre con la práctica.
Yo tengo que dejar los detalles asentados en la parte teórica.
Pero es la práctica lo que nos mostrará el por qué de las normas y sus detalles quisquillositos.

Saludos
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 17 Enero, 2013, 04:00 am


_______________

En cuanto a entender el compilador... es algo que ocurre con la práctica.
Yo tengo que dejar los detalles asentados en la parte teórica.
Pero es la práctica lo que nos mostrará el por qué de las normas y sus detalles quisquillositos.

Saludos

Bien, entonces espero a la práctica para ver si lo veo  8^)
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 18 Enero, 2013, 08:05 am
Ya he leído el hilo nuevo, aunque sin papel y lápiz, como siempre, y cuando hay números... ya se sabe que no se fijan demasiado las cosas si no se escriben.

Una pregunta relacionada con esto. Calculando el número "e" según la fórmula \( (1+\dfrac{1}{n})^n \) cuando "n" tiende a infinito, dando valores naturales a "n" consecutivos desde 1, hace años ya que observé que las cifras  de "e" se iban fijando poco a poco empezando por el primer decimal, después por el segundo, etc. (esto lo hice con la calculadora, no a mano). 
 O sea, a lo mejor para "n=1" empezaba el segundo decimal a ser 2, y luego otro número... así hasta que dando valores llegaba un momento en el que ya valía 7 y ahí se quedaba para siempre, ya no cambiaba; luego pasaba esto mismo con el segundo decimal, etc., lo cual a mí entender, si no estoy equivocado, tiene que ser así siempre y para todos los decimales, pues si uno de los números fijados cambiara en su valor teórico -si cambiara después de haberse fijado, quiero decir- aunque volviera a fijarse después, no estaríamos ante un valor límite o no habría seguridad de ello, pues si cambia una vez puede cambiar más, y "e" no podría converger a un límite.

 Pero hace un año o dos,  al contestar en un post a raíz de una duda sobre la definición de límite que se planteó aquí en el foro, volví hacer el mismo experimento llegando más lejos; y un número ya fijado cambió de valor. Supuse que tenía que ser de la calculadora, no obstante me dejó cierta duda porque el número que varió contra pronóstico no era un decimal muy alejado de la parte entera, creo recordar. Mi intuición - intuición de humano que aprendió a dividir a mano cuando no existían las calculadoras- me decía que, si la calculadora tenía que fallar, habría de hacerlo empezando por los dígitos más alejados y dando unos valores correctos en los más cercanos a la parte entera.
 Entonces, supongo que esto tiene que ver un poco con el tipo de redondeo que hace la calculadora y lo que cuentas en el nuevo hilo, ¿no?


 Saludos
 
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 18 Enero, 2013, 08:42 am
Debido al concepto de límite, es cierto que los dígitos se tienen que estabilizar.

Supongamos una sucesión creciente \( s_k \) que tiende a un límite \( L \).
¿Qué significa que él \( n \)-ésimo dígito detrás de la coma se estabilice?
Quiere decir que la sucesión \( L-s_k < 10^{-n} \), para todos los valores k "bastante grandes", o sea, mayores que un \( K \), que depende de \( n \).

O sea, se toma como \( \epsilon \) a \( 10^{-n} \), y listo,
vas a encontrar que a partir de cierto índice K, se tiene que estabilizar

Pero esa "estabilización" ocurre con sucesiones creciente, como es el caso de la sucesión de sumas parciales que convergen al número \( e \).

Si no, no tiene por qué ocurrir (fijate si no en la sucesión \( (-10)^k \)).

________

Ahora bien, aunque en el caso de sucesiones, como la del número \( e \), los dígitos se estabilizan,
eso no quiere decir que la calculadora logre esa estabilidad correctamente.
Puede llegar a estabilizarse en dígitos erróneos.
Eso es porque trabaja con una cantidad de dígitos limitada, y cuando se suman los elementos de la series 1/n!, con n grande, directamente tienen tan poca precisión respecto la suma de los términos precedentes, que la calculadora considera esos términos como 0.

Pero si uno sumara "desde los valores más pequeños" hacia los más grandes, entonces la suma es más correcta, más exacta numéricamente hablando, y ahí es más factible que todos los digitos obtenidos con la calculadora sean correctos.

Es decir, hay que buscar el último índice n tal que la calculadora puede representar al número 1/n!.
A partir de ahí, sumar de atrás hacia adelante 1/k!, empezando con k = n, n-1, n-2, etc., hasta llegar a 0.

Eso da un resultado más ajustado, más correcto numéricamente, en relación al valor real.

Se supone que las calculadoras proceden sumandos así, inteligentemente, o quizá incluso aplicando algoritmos mejores, para asegurar la máxima precisión posible.

___________


Para jugar con conversiones de binario a decimal, incluyendo partes fraccionarias y todo,
podés ir a esta página:

http://www.mathsisfun.com/flash.php?path=/numbers/images/binary-dec-hex.swf&w=798&h=198&col=%23FFFFFF&title=Binary%2FDecimal%2FHexadecimal+Converter (http://www.mathsisfun.com/flash.php?path=/numbers/images/binary-dec-hex.swf&w=798&h=198&col=%23FFFFFF&title=Binary%2FDecimal%2FHexadecimal+Converter)

Fijate que ahí se obtienen números con mayor precisión que los que yo usé en mi post de "Dictado del curso", así que te puede servir para comparar los dígitos reales (en binario), en comparación con el redondeo.

Por ejemplo, el \( 1+2^{-24} \) es el "siguiente" número en Single Precision (de IEEE 754), que sigue al 1.0. No se pueden representar números intermedios. Los valores intermedios en binario se redondean.
Pero en esa web sí se pueden poner más que 24 dígitos.


__________

Una errata: En la teoría hice los ejemplos con \( 1+2^{-24} \), pero tengo que cambiarlos a \( 1+2^{-23} \), porque sólo se admiten 24 dígitos binarios significativos en Single Precision, y el número \( 1+2^{-24} \) tiene 25 dígitos significativos.

No creo que esto me cambie mucho la exposición o el sentido de los ejemplos,
pero tendré que hacer los cambios, por las dudas, y revisar todos los números.

Un saludo
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 18 Enero, 2013, 10:56 am

Si no, no tiene por qué ocurrir (fijate si no en la sucesión \( (-10)^k \)).


 Ya, pero eso no converge a un límite, y además lo que va cambiando es el signo de la cifra, no me refería a eso.

Citar

Para jugar con conversiones de binario a decimal, incluyendo partes fraccionarias y todo,
podés ir a esta página:

http://www.mathsisfun.com/flash.php?path=/numbers/images/binary-dec-hex.swf&w=798&h=198&col=%23FFFFFF&title=Binary%2FDecimal%2FHexadecimal+Converter (http://www.mathsisfun.com/flash.php?path=/numbers/images/binary-dec-hex.swf&w=798&h=198&col=%23FFFFFF&title=Binary%2FDecimal%2FHexadecimal+Converter)

Gracias por el enlace, luego le echo un ojo.

Citar
Una errata: En la teoría hice los ejemplos con \( 1+2^{-24} \), pero tengo que cambiarlos a \( 1+2^{-23} \), porque sólo se admiten 24 dígitos binarios significativos en Single Precision, y el número \( 1+2^{-24} \) tiene 25 dígitos significativos.



No creo que esto me cambie mucho la exposición o el sentido de los ejemplos,
pero tendré que hacer los cambios, por las dudas, y revisar todos los números.

Un saludo


 Si quieres, con que pongas un letrero de aviso en rojo o en azul que advierta de ello puede valer, a modo de fe de "ratas", así no tienes que andar corrigiendo todo; no creo que nadie se equivoque y, si se equivoca, se lo canta el ordenador dándole un resultado erróneo; es lo que tiene la programación, que o se hace bien o no anda.

Saludos.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 18 Enero, 2013, 11:03 am

Si no, no tiene por qué ocurrir (fijate si no en la sucesión \( (-10)^k \)).


 Ya, pero eso no converge a un límite, y además lo que va cambiando es el signo de la cifra, no me refería a eso.
 

Perdón, quise decir  \( (-10)^{-k} \).
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 18 Enero, 2013, 11:05 am
no creo que nadie se equivoque y, si se equivoca, se lo canta el ordenador dándole un resultado erróneo; es lo que tiene la programación, que o se hace bien o no anda.


En realidad, con el tema de los números de punto flotante, es muy fácil engañarse.
Se pueden obtener resultados correctos por casualidad,
así como obtener errores inadvertidamente.

Además no hay nada de programación ahí,
sino sólo ejemplos con números y formatos teóricos.

Faltan 3 o 4 posts todavía para empezar con los programas de este tema.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 18 Enero, 2013, 11:34 am




Perdón, quise decir  \( (-10)^{-k} \).

 No me hagas estas cosas que he dormido poco  :laugh:

 A ver, el enésimo término tiende a cero, es verdad, pero a cero "signed", creo que no es una sucesión de Cauchy, pero no sé si se considera convergente o no, no me acuerdo...

  En cuanto a los posts haz lo que creas conveniente, por supuesto, yo te he dicho eso porque veo que lo de ser bohemio y dormir poco no es sólo cosa de músicos y pintores, para que no trabajaras tanto y echaras un cabezada :D

 Saludos.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 18 Enero, 2013, 05:54 pm
Ya arreglé los numeritos que estaban mal.

Había otra errata.

Creí por un momento que, al pasar de base 16 a base 2, era fácil identificar la paridad del último bit en base 2...

Pero eso no es tan así, y entonces quité ese párrafo. Sólo puse un ejemplo, y una pregunta para el lector de por qué es más o menos fácil detectar la paridad estando en base 16...  ???
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 19 Enero, 2013, 10:35 am
Ya arreglé los numeritos que estaban mal.

Había otra errata.

Creí por un momento que, al pasar de base 16 a base 2, era fácil identificar la paridad del último bit en base 2...

Pero eso no es tan así, y entonces quité ese párrafo. Sólo puse un ejemplo, y una pregunta para el lector de por qué es más o menos fácil detectar la paridad estando en base 16...  ???

Buenos días. Le estuve echando un ojo anoche y no vi diferencias significativas, vi que habías puesto en color algunas cosas; ya lo veré más despacio.

 También he visto lo del curso de C#; precisamente el otro día estuve mirando un código fuente de este lenguaje y me di cuenta de algunas diferencias.

 La programación orientada a objetos la conozco en actionscript (por el falsh) y en Java; sé como

funciona pero no me tengo memorizadas las instrucciones típicas ni soy diestro en la sintaxis porque siempre he usado trozos de código prediseñados para hacer cuatro pavadas.

 Gracias, un saludo.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 21 Enero, 2013, 06:25 pm
int main(void)

No sé qué les dije sobre ese asunto, pero el valor de retorno SIEMPRE tiene que ser int.

Yo creía que se podía poner varias cosas distintas como el valor de retorno de la función main().

Pero, en el documento del estándar dice que NO, que sólo puede ser int, o un tipo equivalente a int.

Yo tenía la costumbre de poner void como tipo de salida de main.

Pero resulta que eso no es válido, acorde al estándar.

¿Y entonces de dónde saqué que eso podía hacerse?
Hay dos razones principales: una, parece ser que varios libros de texto enseñan que puede escribirse void main(void), sin problemas, que eso está bien. Y entonces todos aprendemos eso sin cuestionarlo demasiado.
Otra, que el compilador no se queja, ni siquiera da advertencias de que la sintaxis void main(void) está mal.

Así que, primero, me toca disculparme por este error,
y además ya he corregido los ejemplos en los que había void main(void) para poner int main(void).

Igual, creo que no es obligatorio poner una cláusula return, aún cuando el tipo de salida de main no sea void.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 21 Enero, 2013, 07:00 pm


Así que, primero, me toca disculparme por este error,
y además ya he corregido los ejemplos en los que había void main(void) para poner int main(void).

Igual, creo que no es obligatorio poner una cláusula return, aún cuando el tipo de salida de main no sea void.

No tiene usted que pedir disculpas, caballero, yo creo que hay cosas que no saben para qué sirven ni los que las inventaron :D

Saludos.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 21 Enero, 2013, 07:05 pm
Es una confusión muy común la del void main(void).

Creo que es muy posible que se enseñe mal desde los libros.

Yo desde ahora voy a respetar el estándar, que dice que NO, que sólo puede ir: int main(...)

El estándar exige esto debido a que se busca compatibilidad con muchos programas que esperan un valor de retorno de los programas hechos en C.

Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 21 Enero, 2013, 10:54 pm
Un nuevo post, esta vez sobre los tipos de punto flotante y el compilador GCC.

Esto tiene una gran importancia práctica porque estamos usando el compilador GCC, el cual tiene algunos problemas en relación al punto flotante.
Creo que es dependiente del hardware aún, es decir, son problemas técnicos bastante difíciles que no me siento capacitado de entender todavía (pues esto requiere estudiar la arquitectura de todos los microprocesadores del mundo, cosa que nunca he hecho).

Sin embargo, podremos experimentar seguramente con nuestro propio micro, y ver qué hace en relación al punto flotante.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 21 Enero, 2013, 11:58 pm
Buenas.

He hecho un cambio en el post sobre la configuración del compilador.

Antes les había indicado que pongan la opción -std=c9x.

Ahora la he cambiado para adherirnos al estándar C99 exclusivamente, lo cual se logra con algunas de las dos opciones siguientes:

-std=c99

o bien:

-std=c99 -pedantic

El post con los cambios sería éste:

http://rinconmatematico.com/foros/index.php?topic=64835.msg260748#msg260748 (http://rinconmatematico.com/foros/index.php?topic=64835.msg260748#msg260748)


Con esto, dejará de funcionar el programita HolaMundo2bisbis.c (que entonces quizá lo termine quitando de la teoría), y el menos importante ExperimentoBasura.c.

Esos programas están en las secciones: "De la eficacia a la elegancia - Macros del Preprocesador (parte I)" y "(parte II)".



Saludos
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 22 Enero, 2013, 12:05 am

El post con los cambios sería éste:

http://rinconmatematico.com/foros/index.php?topic=64835.msg260748#msg260748 (http://rinconmatematico.com/foros/index.php?topic=64835.msg260748#msg260748)


Con esto, dejará de funcionar el programita HolaMundo2bisbis.c (que entonces quizá lo termine quitando de la teoría), y el menos importante ExperimentoBasura.c.

Esos programas están en las secciones: "De la eficacia a la elegancia - Macros del Preprocesador (parte I)" y "(parte II)".



Saludos

De acuerdo, voy a hacer el cambio.

Saludos.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 22 Enero, 2013, 02:26 am
He agregado un párrafo al post que presenta los tipos de datos de punto flotante en el estándar de C, porque descubrí que hay dos tipos de datos extra definidos, que no habìa tenido en cuenta.

El post:

http://rinconmatematico.com/foros/index.php?topic=64835.msg261637#msg261637 (http://rinconmatematico.com/foros/index.php?topic=64835.msg261637#msg261637)

El párrafo.

Citar
Otros tipos de punto flotante declarados en C,

En la librería math.h del estándar C están especificados, acorde a lo requerido por C99, los siguientes tipos de punto flotante:

float_t
double_t

Estos tipos de datos están pensados de la siguiente manera:

Supongamos que en nuestro sistema es posible acceder a tipos de punto flotante que tienen al menos la misma exactitud que float y/o double, pero que además permiten realizar cálculos más eficientes.
En ese caso, el programador puede elegir tomar ventaja de esa eficiencia, y para ello no tendría que hacer muchos cambios en su programa fuente en C, sino hacer algo tan simple como escribir float_t en vez de float y/o double_t en vez de double.

Qué es lo que representan exactamente estos tipos depende del hardware y/o de la implementación local del compilador, etc.
Sin embargo, el estándar C99 establece una pautas mínimas que han de cumplir,
y que dependen del valor asignado a la macro FLT_EVAL_METHOD, que está definida en la librería float.h:

Si el valor de FLT_EVAL_METHOD es 0,
entonces float_t coincide con float, y double_t coincide con double.

Si el valor de FLT_EVAL_METHOD es 1,
entonces float_t y double_t coinciden ambos con double.

Si el valor de FLT_EVAL_METHOD es 2,
entonces float_t y double_t coinciden ambos con long double.

Para otros valores de FLT_EVAL_METHOD, es la implementación local la que debe especificar qué tipos son float_t y double_t.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 22 Enero, 2013, 12:16 pm
Ya he visto el programa  :o

 Lo he guardado y lo he ejecutado, lo iré mirando más.

Saludos.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 28 Enero, 2013, 01:58 am
Bueno.

El programa anterior lo quité, y puse otro parecido, pero que no tiene la última parte.

Como sea, hay 3 posts de testeo de tipos de punto flotante, con 3 programas de testeo.

El primero testea los límites de las constantes de punto flotante de float.h.
El segundo muestra lo que pasa con las macros de infinitos y valores NaN, y macros que clasifican valores de datos punto flotante, que están en math.h.
El tercero pone a prueba las macros de clasificación, jugando con valores típicos, y así vemos si todo anda como esperamos.

Encontré una anomalía en el rango de los números subnormales float y double, porque no los reconoce como subnormales, sino como valores "normales".

Pienso que esto es un error del compilador.

Igual me queda la duda, porque el estándar es algo confuso en esa cuestión.

En realidad no está declarada la macro __STDC_ISO_IEC_559__,
así que el compilador tiene la libertad de interpretar algunas cosas a su antojo.
Pero no sé si aún así es correcto que interprete números subnormales como si fueran "normales de tipo long double".

Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 28 Enero, 2013, 02:56 am
Bueno.

El programa anterior lo quité, y puse otro parecido, pero que no tiene la última parte.

Como sea, hay 3 posts de testeo de tipos de punto flotante, con 3 programas de testeo.



Los he estado leyendo, aún no los he puesto a correr en la ID, pero mañana los pruebo.

 Saludos y buenas noches.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 28 Enero, 2013, 07:34 pm
Ya he visto la nueva entrada sobre los complejos en C++. Tendré que repasar, porque como ya soy mayor muchos complejos los he dejado atrás :D

 Saludos.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 28 Enero, 2013, 08:43 pm
El repaso que hace que hacer de los complejos está puesto ahí.

Y a medida que surjan otras cuestiones, las iremos recordando.

Mi idea es que no necesitemos mucho más que lo que voy poniendo en la teoría.

Por ahora solamente vamos a ver qué diablos significa para el lenguaje C un número complejo, cómo los representa, qué hace con los valores infinitos, y cómo coordina las partes real e imaginaria.

O sea, cosas muy sencillas. Por ejemplo, como se pone en C la dichosa i, la unidad imaginaria.

Por ahora sólo nos interesan cuestiones senciilas: ¿cómo y con qué reglas se especifican constantes numéricas en C? ¿Cómo las interpreta internamente, o cómo las guarda en memoria? ¿Cómo redondea cuando la precisión interna se le acabó? ¿Qué convenciones hay, qué excepciones, cómo mostrar correctamente los resultados numéricos, qué precauciones hay que tomar?

La principal dificultad no está en recordar la teoría matemática de los números, sino, a mi juicio, en el hecho de que el lenguaje C tiene varios tipos de datos distintos para lo que nosotros, matemáticamente, entendemos como un solo conjunto de números.

Así, hay 3 tipos de datos para representar números reales.
Cada uno con características propias de precisión y tamaño.
Pero como nos interesa usarlos a todos en combinación, para representar números reales cualesquiera,
hay que estudiar la manera correcta en que se pueden intercambiar esos tipos de datos, para que no tengamos resultados erróneos, o comportamientos inesperados.

Las dificultades están en la parte del lenguaje C y sus detalles, y no en la parte matemática.

Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 21 Febrero, 2013, 02:11 am
Después de varios días sin actividad, agregué un post que tan sólo hace un pequeño testeo de cómo funcionan los números complejos en nuestra implementación local.

_____________

Hice una corrección en un post ya antiguo, en que desarrollé la teoría de los caracteres y las strings.

Allí decía ingenuamente que las constantes de caracter eran de tipo char.

En realidad esto no es exacto.

Lo corregí con esta otra frase:

El tipo de datos que se usa en C para representar caracteres es char.
(Sin embargo, el tipo de datos de una constante de caracter no es char, sino int).

Esta es una sutileza que en principio no se entiende mucho a cuento de qué viene.
La cuestión será analizada cuando abordemos el estudio profundo de los caracteres en C, que es muy complejo.

Además, sí es cierto que las strings son de tipo char[] o char*.
O sea que con eso no hay nada que aclarar ni corregir.

____________________

Por último, escribí un par de posts totalmente descontextualizados, en que no vemos nada del lenguaje C, sino sólo anécdotas de la vida, y consejos espirituales para programadores del siglo 21.

Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 21 Febrero, 2013, 11:19 am


Por último, escribí un par de posts totalmente descontextualizados, en que no vemos nada del lenguaje C, sino sólo anécdotas de la vida, y consejos espirituales para programadores del siglo 21.



 Ya lo estuve leyendo, cómo iba a dejar de hacerlo :)
 Por mi parte no tengo prisa en que que arreglen el bug ése del float, si necesito hacer algún programa para mis cosas siempre va a ser muy sencillo y, siendo así, puedo utilizar otros lenguajes menos profesionales que el C++. Pero está muy bien que te hayas "peleado" con esos sabios informáticos para que lo arreglen, porque los estudiantes de informática, e incluso los que ya son informáticos, seguro que sacan provecho de ello y evitan muchos dolores de cabeza.

 Un saludo y gracias.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 21 Febrero, 2013, 02:36 pm
Es que este curso no de es de C++, sino del viejo y decrépito C "pelado" sin el "++".

No voy a enseñar Programación Orientada a Objetos, nada de C++.

Un saludo
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 08 Septiembre, 2013, 11:49 pm
Hola gente.

Desde el último comentario hecho aquí, he agregado lentamente los siguientes posts a las notas de "Dictado":

* ¿Cómo lograr que todo funcione? Partes I y II: Son unas estupideces que conté acerca de cómo veo la programación hoy en día. Una actividad no sólo tecnológica, computacional, sino también social, comunitaria. Para que un programa funcione bien, a veces necesitamos de otras personas...

* Pare de sufrir: Alternativas a la consola, Parte II: En esta ocasión lo que hago es instarles a reemplazar la consola estándar de Windows por otra que se consigue en Internet: ConEmu. Hay dos razones básicas por las cuales hago esto: (i) La consola ConEmu tiene al menos las mismas características que CMD, pero tiene una visualización más clara y agradable, además de poderse configurar con facilidad. (ii) ¡En la consola ConEmu se puede poner una imagen de fondo, que además se actualiza automáticamente!  ;D

Esto de tener una imagen de fondo que se actualiza al mismo tiempo que la imagen misma... nos será muy útil para futuros proyectos de programación gráfica. Es decir, vamos a poder realizar programación gráfica en C, sin necesidad de aprender o instalar librerías ajenas a las librerías que el estándar especifica de entrada.

(Aunque, eso sí, habrá que aprender un poco de formatos de imagen, al menos el más sencillo de todos: BMP, mapas de bits).

* Caracteres en Lenguaje C, Partes I, II, III, IV y V.

He abodardo allí el complicadísimo y durísimo tema de los caracteres.

Es un asunto tedioso de estudiar, difícil de comprender, y extenuante de explicar.

He intentado ser lo más preciso posible, procurando no cometer errores de ninguna índole en la exposición. Sin embargo, los recovecos de este tema son tantos, que lo más probable es que algo se me haya escapado.

** En la parte I hago una brevísima recorrida histórica sobre los conjuntos de caracteres y sus métodos de codificación. El recorrido no está completo, y he dejado cabos sueltos (por ahora) respecto a Unicode. Esto lo completaré en otro momento, pero lo que sigue puede "sobrevivir" sin ello. Para una exposición más detallada sobre la historia de los caracteres en computación, he estado escribiendo un artículo separado en la revista del foro (que también adolece por el momento de no tener la parte de Unicode):

Codificación de caracteres (http://rinconmatematico.com/foros/index.php?topic=65991.msg264941#msg264941)

** En la parte II introduzco de lleno toda una discusión técnica acerca de cuáles y cuántos son los caracteres que el estándar C admite. Se separa de entrada entre el "lugar" donde los programas compilan y el "lugar" donde ejecutan. En cada "lugar" puede haber distintos juegos de caracteres, o con codificaciones distintas.

La intención de analizar en detalle ese tema es, principalmente, comprender cuáles son los caracteres admitidos cuando estamos escribiendo un programa en C que se supone "válido" sintácticamente. ¿Podemos usar caracteres especiales, de otros idiomas, de Unicode, de otros juegos de caracteres exóticos, o que funcionan con algún método multibyte?

El estándar C habla de todo eso con detalle, y luego esos detalles se vuelven importantes si pretendemos conocer los límites del lenguaje, los caracteres que podemos usar, y el significado que tienen.

Una lección importante de este tema es que los caracteres que escribimos como cadenas de caracteres en nuestro programa, puede que no luzcan igual, o que no tengan la misma codificación cuando llevemos nuestro programa fuente de un sistema a otro, o cuando lo compilemos para ejecutarse en sistemas distintos al nuestro.

En todo caso, aprendemos de esto que si aparecen resultados extraños en la visualización de caracteres, es que "algo de todo este asunto" está involucrado ahí.

Prestando la debida atención, varios problemas relacionados a los caracteres en nuestros programas se pueden ir solucionando.

** En la parte III nos preocupamos por un tema más concreto: las constantes de caracter, constantes de caracter ancho, constantes de cadena y constantes de cadena de caracteres anchos.

Allí aprendemos sin lugar a dudas que el tipo de datos de una constante de caracter es un int (en el caso de caracteres "normales") o bien wchar_t (en el caso de caracteres "anchos").

Esto parece contradecir el sentido común, porque creeríamos que lo más "lógico" es que las constantes de caracter tengan tipo char.
Esto no es así, sin embargo, se puede asegurar que el numerito que codifica el código de un caracter en C será un valor "en el rango de valores" del tipo char.

Esto abre la puerta a la posibilidad de que haya caracteres con códigos ¡negativos!
Pero también el estándar C se previene a tiempo, y decide que los caracteres fundamentales del lenguaje (que llama básicos) siempre tienen un código positivo.

** En la parte IV sólo hago un resumen relajado de las cosas discutidas en las partes I, II y III.

** En la parte V se estudia el modo en que actúan los caracteres de control que el estándar C adopta, cuando se los envía a la pantalla (saltos de línea, tabulaciones, retrocesos, etc.). Para ello se usa una terminología algo técnica, y pongo como ejemplos mi propio sistema, a ver qué es lo que pasa ahí.

Lo importante de esta parte V es llegar a entender que en realidad tenemos muy poco control de lo que pasa cuando enviamos información a la consola desde un programa en C.
Podemos estar seguros de pocas convenciones y detalles, siempre y cuando se den determinadas condiciones.
Pero en general tenemos que estar preparados para entender lo que el programa que elegimos como "consola" se supone que hace cuando se le solicita enviar o recibir información.



Me llevó muchos meses superar esta etapa de los caracteres.
A tal punto que tuve que desviarme escribiendo un artículo aparte sobre el tema, en la revista del foro.

Pero ahora que ya terminé (salvo posibles detalles adicionales que algún día quizás agregue),
puedo al fin seguir con las cuestiones mismas de programación.



Si se fijan, he seguido un plan algo aburrido, pero con una intención determinada:

* Definir primero las cuestiones más básicas del lenguaje, a saber: las constantes literales.

Las constantes literales son de 3 tipos: aritméticas (enteras y de punto flotante), de caracter (que son de nuevo números enteros), y de cadena (éstas son arrays de caracteres).

Terminé de especificar en detalle ese "asuntito" que parecía tan simple.

En el interín, estudiamos también los tipos de datos aritméticos asociados a esas constantes, y con qué reglas esas constantes promocionan de un tipo a otro.

Para lo que sigue, planeo explicar los tipos de datos predefinidos en C, primero los básicos, y luego los estructurados. Junto con esto más o menos iría el tema de "evaluar expresiones en C", y en particular los "casts" (u operadores de promoción).

Este tema puede estudiarse... ¡sin declaraciones de variables!
Quiero postergar eso para después...

Cuando estudiemos las declaraciones de variables, previamente necesitaremos las reglas para definir identificadores, y en particular es allí cuando cobran relevancia las palabras reservadas del lenguaje (que están prohibidas para usos definidos por el usuario).

Por supuesto, es importante luego explicar en profundidad el tema de las funciones.

Y finalmente vendrá el tema de las librerías estándar... y las no estándar.

Saludos.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 16 Septiembre, 2013, 07:44 am
Estuve podando el curso.

Quité varios posts en los que había intentado reemplazar la consola por salidas a HTML y cosas por el estilo.
En realidad moví todo eso a un hilo aparte en la sección de "Temas de Computación", por si a alguien le interesa usar algo de ahí: http://rinconmatematico.com/foros/index.php?topic=70244.0 (http://rinconmatematico.com/foros/index.php?topic=70244.0)

También moví el tema de la configuración de la consola de Windows a un hilo aparte: http://rinconmatematico.com/foros/index.php?topic=70251.0 (http://rinconmatematico.com/foros/index.php?topic=70251.0)

En lugar de todo esto, he preferido acomodar como "Tema número 10" el de la instalación del programa ConEmu (Console Emulator), y debajo dejé unas indicaciones sencillas para obtener acentos y eñes de español en la consola.

Esta consola ConEmu es básicamente lo que estaba buscando hacía tiempo, para reemplazar la consola corriente CMD de Windows.
Así que no le veo sentido a dejar colgado todo lo demás.

_________

También estoy introduciendo un cambio estético, para no espantar lectores con los terribles colores chillones que hacen arder la vista.

Además los colores y formatos que ahora he elegido tienen un significado concreto,
porque inventé un lenguaje de "marcado" para escribir posts en el foro.

Como ustedes saben, el foro no permite definir nombres de estilos de HTML, ni nada similar.
Así que me las arreglé para crear un minilenguaje de estilos adaptado a las necesidades del foro.

Dicho minilenguaje está programado en C, y es un interesante ejercicio (a la vez que fácil), y permite a un usuario crear sus propias reglas de formatos o reemplazos.

Para esto estuve investigando qué es lo más conveniente para mostrar información por Internet.
Descubrí algunas cosas interesantes:

* El tipo de letra que menos cansa a la vista es la que usa el foro por defecto: Verdana.
* Los colores que menos rechazo producen a la vista son colores tipo "pastel", y mejor si son oscuros (verdes, azules, marrones y grises).
* Los colores pálidos pueden llegar a atiborrar la visión, porque en realidad están "iluminados" (igual los voy a usar, pero con tonos suaves).
* El tipo de fuente Arial es desagradable para leer en un texto completo, pero no resulta desagradable en términos resaltados breves.

____________

Imagino que estarán aburridos de tanta información técnica.
Pero bueno, son detalles que no se encuentran en otros sitios, y menos en castellano.

Tengo un par de temas aburridos que tratar aún: reglas para formar identificadores, y operadores.

Tras esto creo que será posible, además de deseable, ir colgando programas, y entonces estudiar en paralelo la teoría del lenguaje junto con las aplicaciones.

(Estoy cambiando de planes de nuevo, sorry).
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 05 Octubre, 2013, 10:19 am
Uffff.

Bueno, terminé de postear los siguientes temas:

* Caracteres en C (muchos e intrincados posts).
* Identificadores en C (que requieren la discusión previa sobre caracteres), y también la lista de palabras clave del lenguaje.
* Instalación de compiladores alternativos: Pelles C, PCC.
* Discusión técnica de objetos (en memoria RAM), valores y tipos de datos en C.
* Tipos de datos básicos, y declaración de objetos (variables) de esos tipos.
* Una seguidilla de posts sobre los operadores en C (aplicados más que nada a los tipos básicos, que son los que conocemos por ahora).
* Estructuras de control (if, switch, while, do while, for, goto, continue, break, return, y la función exit()).

Con todo esto ya es posible hacer programas de verdad, que resuelvan problemas básicos de aritmética, incluyendo números complejos.

A partir de aquí se admiten sugerencias de problemas a resolver.
Iré procurando agregar diversos ejercicios.

Saludos.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 06 Octubre, 2013, 12:15 pm
La primer lista de ejercicios del curso... ¡en la sección 49!

O sea que hubieron 48 secciones de teoría previa.

Y eso que no está todavía la teoría con toda la formalidad que me gustaría...

Otra cosa: Ninguno de los ejercicios es fácil, aunque tampoco difícil.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 19 Octubre, 2013, 05:02 am
Actualizada la instalación del compilador PCC, en el post #41.

http://rinconmatematico.com/foros/index.php?topic=64835.msg279680#msg279680 (http://rinconmatematico.com/foros/index.php?topic=64835.msg279680#msg279680)

Se dice por ahí que hay gente planteándose reemplazar GCC por PCC en proyectos importantes como Linux.

Al parecer es más eficiente, entre otras cosas.

Vaya uno a saber...

Yo se los dí para que nos acostumbremos a trabajar desde Línea de comandos, y sacar así algunos programas rápidos, sin tanto editor de por medio.

Saludos
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 21 Octubre, 2013, 09:26 am
Estoy abrumado.

El C es un lenguaje muy complejo.

Es complejo porque es sofisticado, y conlleva soporte para muchos dialectos que se han practicado durante su historia hasta hoy.

Por otra parte, entender las sutilezas del lenguaje lleva a una comprensión interesante de lo que significa un lenguaje serio. No creo que haya un lenguaje parecido en lo referido a rigor técnico.

Lo que me abruma es que C prometía ser un lenguaje más o menos sencillo.
Pero no lo es, si es que uno quiere hacer programas sólidos.

Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: manooooh en 05 Junio, 2019, 08:17 am
Hola

No sirve de nada que copie un programa de ese video de Youtube, porque el programa que tiene errores es el tuyo.

Por eso tengo que ver tu programa.

Además, aunque el programa del video es corto, no lo pienso copiar a mano, porque encima lo va cambiando durante todo el video, y tengo que comerme toda la explicación hasta ver qué diablos es lo que hace.

No voy a mirar videos...

Bueno, hombre, no te pongas así  :laugh:  :laugh: Decía sólo la primera parte hasta que ejecuta; lo he mirado y remirado, repasado puntos y comas, etc., pero introduzco el número y ahí se queda, el condicional que le sigue no corre. Pero da igual, ya lo repaso más veces, a ver...

Me puse celoso, me andás engañando con el tipo ese de youtube.  :'(

¡Oh no! Ya somos dos :-\ :-\.

Saludos :laugh:
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 05 Junio, 2019, 08:29 am
Hola

No sirve de nada que copie un programa de ese video de Youtube, porque el programa que tiene errores es el tuyo.

Por eso tengo que ver tu programa.

Además, aunque el programa del video es corto, no lo pienso copiar a mano, porque encima lo va cambiando durante todo el video, y tengo que comerme toda la explicación hasta ver qué diablos es lo que hace.

No voy a mirar videos...

Bueno, hombre, no te pongas así  :laugh:  :laugh: Decía sólo la primera parte hasta que ejecuta; lo he mirado y remirado, repasado puntos y comas, etc., pero introduzco el número y ahí se queda, el condicional que le sigue no corre. Pero da igual, ya lo repaso más veces, a ver...

Me puse celoso, me andás engañando con el tipo ese de youtube.  :'(

¡Oh no! Ya somos dos :-\ :-\.

Saludos :laugh:

Pero esto fue hace mucho :D Ya no me acuerdo del C desde que me hice pythonero.

Buenos días, manooooh.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: manooooh en 05 Junio, 2019, 08:39 am
Buen día!

Pero esto fue hace mucho :D Ya no me acuerdo del C desde que me hice pythonero.

Ya sé que el mensaje data de hace años, pero como estaba aburrido (aun teniendo que rendir hoy un examen y hacer otras cosas) quise comentar :).

:o ¿en serio te pasaste a Phyton? Se usa mucho, me alegro que seas de ese bando, aunque me duele en cierto modo, pensé que a esta altura sabías más C que otra cosa.

Apuesto a que por lo menos sabés a día de hoy hacer un "Hola Mundo" en C :laugh:. ¡¡Sin leer y sin soplar de ningún mensaje anterior quiero ver un "Hola Mundo" hecho por feriva en 2019!! Luego lo podemos comprobar con todo lo anterior a ver si lo hiciste bien, si te parece.

Saludos
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 05 Junio, 2019, 09:37 am

Apuesto a que por lo menos sabés a día de hoy hacer un "Hola Mundo" en C :laugh:. ¡¡Sin leer y sin soplar de ningún mensaje anterior quiero ver un "Hola Mundo" hecho por feriva en 2019!! Luego lo podemos comprobar con todo lo anterior a ver si lo hiciste bien, si te parece.

Saludos

Pues si apuestas pierdes, no me acordaba ni de que el “print” aquí es “printf” :D, he tenido que mirar; y he usado una consola on line, porque ya tampoco tengo; la tenía con Windows, ahora en Linux sólo tengo Python, que viene de fábrica.

https://www.onlinegdb.com/online_c_compiler

Saludos.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 05 Junio, 2019, 12:24 pm
_Static_assert(0,"Hola mundo");
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: feriva en 05 Junio, 2019, 02:08 pm
_Static_assert(0,"Hola mundo");

Y ¿eso se puede poner tal cual, sin librería y sin el main, o sigue haciendo falta?

Saludos.
Título: Re: Proyecto de Curso (Comentarios): Programación en C (2013, por Argentinator)
Publicado por: argentinator en 06 Junio, 2019, 03:35 am
_Static_assert(0,"Hola mundo");

Y ¿eso se puede poner tal cual, sin librería y sin el main, o sigue haciendo falta?

Saludos.

Sí. Aunque no lo he comprobado.
Fijate en el compilador online.
Lo que ocurre es que en realidad es sólo una declaración que chequea cosas durante el proceso de compilación,  y en caso de falsedad muestra el mensaje y termina la compilación.
No es un programa completo ni nada.