Algunas consultas sobre C

Moderadores: Kravenbcn, largeroliker, fidelcastro, cerealkiller, pspCaracas, dark_sasuke, m0skit0, LnD, ka69, zacky06

yosoy_bostero
Enteradillo
Enteradillo
Mensajes: 43
Registrado: 12 Ene 2011, 16:55

Algunas consultas sobre C

Mensaje por yosoy_bostero »

Tal como me dijeron traslado mis consultas aca para no ensuciar el otro thread

muchachos mis dudas son las siguientes si alguien me puede dar una mano:

al finalizar al programacion si tenemos muchos .c con muchas funciones y .H con cabeceras como se linkea todo a la hora de compilar?

que es un .o? que funcion tiene?

Cual es el uso practico del IFDEF y IFNDEF ? no logro entenderlo, que errores se evitan?

y por ultimo, mas bien filosofico el tema, ademas de ser por un tema casi de convencion, que problema hay en trabajar con metodos/atributos de clase, cuando se tiene una clase que no sera instanciada (o lo sera solo una vez)? (ej, placa base)

EDIT:

agrego algo mas, si m0skit0 me puede dar su opinion sobre las diferencias en desarrollar en C para linux y para Windows, para saber en que "equipo" anotarme, de todas formas calculo que me anotare en windows por haber trabajado siempre con el...

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: Algunas consultas sobre C

Mensaje por m0skit0 »

yosoy_bostero escribió:al finalizar al programacion si tenemos muchos .c con muchas funciones y .H con cabeceras como se linkea todo a la hora de compilar?

Primero, los h no tienen código y por tanto no se enlazan (que no "linkean" ;) ). Son meras definiciones. Los .c se pasan cada uno a .o por parte primero del compilador (que pasa de C a ensamblador) y luego por parte del ensamblador (que pasa de ensamblador a código máquina). Estos .o son ficheros binarios pero aún mantienen "símbolos", lo que se denomina código objeto. Estos "símbolos" son marcas que le permiten al enlazador reconocer las referencias cruzadas entre unos .c y otros, y saber cómo mezclar todos los .o en un sólo fichero de código objeto, y si hay suerte no habrá más símbolos que resolver, con lo que la compilación habría terminado.

yosoy_bostero escribió:que es un .o? que funcion tiene?

Supongo que te la he respondido arriba ;) Cualquier duda me dices.

yosoy_bostero escribió:Cual es el uso practico del IFDEF y IFNDEF ? no logro entenderlo, que errores se evitan?

Bueno, en sí no evitan ningún error. Son directivas de preprocesador, que es un programa que se pasa sobre el código fuente antes de la compilación. El preprocesador prepara el código fuente para ser compilado. Esto supone sustituír los .h por los ficheros propiamente dichos (sí, se cambia el #include <stdio.h> por el fichero stdio.h enterito), entre otras muchas cosas que se le pueden indicar (los # son órdenes de preprocesador).

Imagina ahora esta situación: tengo un fichero a.h que tiene un #include <b.h>, mientras que b.h tiene un #include <a.h>. Aquí el preprocesador como puedes comprobar nunca acabará de incluir uno en otro porque tienen una referencia circular.

Esto se puede solucionar de varias maneras, siendo la más común usar la directiva #ifndef. En b.h nada más empezar el fichero, preguntamos por un símbolo que indique que el fichero ya ha sido incluido, con #ifndef B_H, por ejemplo. Esto pregunta si B_H ha sido definido. En caso de no haber sido definido, lo definimos con #define B_H. Ahora si hay una referencia circular, no se volverá a incluir el contenido del fichero b.h porque el símbolo B_H está definido e #ifndef B_H devolverá falso al preprocesador, que se saltará el fichero. Espero haberme explicado y no haberte liado aún más :?

yosoy_bostero escribió:que problema hay en trabajar con metodos/atributos de clase, cuando se tiene una clase que no sera instanciada (o lo sera solo una vez)?

Las clases no instanciadas ("estáticas" en su nombre técnico) no pueden crear diferentes objetos con diferentes valores. Siempre hay una sola. En el caso que nos ocupa del emulador, posiblemente se puedan trabajar con clases estáticas, esto se puede discutir en el hilo de diseño del software. Personalmente no me gustan porque no se pueden ni crear ni destruir, por tanto siempre ocupan memoria, y para un emulador hay muchos componentes que a lo mejor no necesitan estar ocupando memoria todo el rato (por ejemplo el lector de UMDs).

yosoy_bostero escribió:si m0skit0 me puede dar su opinion sobre las diferencias en desarrollar en C para linux y para Windows

Linux sigue prácticamente todos los estándares de programación internacionales, incluídos POSIX, ANSI C, TCP/IP, WWW, etc... Es un SO con una muy alta aceptación de los estándares internacionales.

Sin embargo Windows es posiblemente uno de los SOs con menos aceptación de los estándares internacionales, ya que M$ siempre los "adapta" a lo que ellos consideran que es lo mejor, lo que casi siempre suele redundar en incompatibilidades. El objetivo confeso (ver Adoptar, extender y extinguir, ojo con Wikipedia en español que está censurada :? ) de M$ con estas prácticas es sustituír los estándares internacionales con los suyos propios, en una clara estrategia de monopolio agresivo.

Saludos.
Imagen

yosoy_bostero
Enteradillo
Enteradillo
Mensajes: 43
Registrado: 12 Ene 2011, 16:55

Re: Algunas consultas sobre C

Mensaje por yosoy_bostero »

Muchisimas gracias m0skit0 flor de respuesta, sigo leyendo y leyendo el tema del ifndef, y los .o a ver si lo agarro bien.

Mas que nada lo del IFNDEF que voy a buscar un ejemplo concreto a ver que pasa.

En cuanto a lo de las Clases, digo, no son objetos en si? (al menos eso sucedia en smalltalk), por lo tanto no se crea (o instancia) ni se destruye sino que siempre "existe" o me equivoco?

ahah edito,

Una pregunta, los .c saben a que .h pertenecen por asi decirlo (que cabecera los "define" ) ? yo tengo un quilombo de .c y .h's a la hora de compilar se linkea todo solo? es decir el .h busca en todos los .c donde esta la funcion a la cual se refiere?

edito2: lo que haces con el B_H es una suerte de Flag o "bandera" para que solo se defina todo una vez? es decir si el ifndef devuelve falso salta TODO el bloque de codigo, no solo las directivas al preprocesador verdad?

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: Algunas consultas sobre C

Mensaje por m0skit0 »

yosoy_bostero escribió:En cuanto a lo de las Clases, digo, no son objetos en si?

En el paradigma de POO se distingue entre clase y objeto, y precisamente porque no son lo mismo. La clase es como la definición, la idea. El objeto es la implementación, la realidad. Por ejemplo, todos tenemos una idea de árbol, pero los árboles reales son todos diferentes entre sí, pero gracias a la idea sabemos que todos son árboles. Yo no he visto SmallTalk, no te sabría decir, pero en C++ las clases no existen si no se instancian.

yosoy_bostero escribió:Una pregunta, los .c saben a que .h pertenecen por asi decirlo (que cabecera los "define" ) ?

No, ni necesitan saberlo.

yosoy_bostero escribió:yo tengo un quilombo de .c y .h's a la hora de compilar se linkea todo solo?

Claro que no. Tienes que indicarle al enlazador qué objetos (me refiero a los .o) quieres enlazar. Y repito: los .h no se enlazan, sólo son definiciones. No tienen código y por tanto no generan nada de código ;)

yosoy_bostero escribió:es decir el .h busca en todos los .c donde esta la funcion a la cual se refiere?

No, es .c el que incluye una cabecera para poder usar las definiciones que ésta incluye.

yosoy_bostero escribió:lo que haces con el B_H es una suerte de Flag o "bandera" para que solo se defina todo una vez? es decir si el ifndef devuelve falso salta TODO el bloque de codigo, no solo las directivas al preprocesador verdad?


yosoy_bostero escribió:lo que haces con el B_H es una suerte de Flag o "bandera" para que solo se defina todo una vez? es decir si el ifndef devuelve falso salta TODO el bloque de codigo, no solo las directivas al preprocesador verdad?

Sí, es un flag (o bandera). La verdad no serviría de nada que sólo se saltara las directivas de preprocesado puesto que su función es procesar el código :D el #ifndef se salta todo hasta el primer #endif que encuentre, si no hay #endif saltará un error de compilación (aunque en realidad es el preprocesador el que lo ha lanzado).
Imagen

yosoy_bostero
Enteradillo
Enteradillo
Mensajes: 43
Registrado: 12 Ene 2011, 16:55

Re: Algunas consultas sobre C

Mensaje por yosoy_bostero »

bueno, sigo haciendome un poco de quilombo por lo de los .c .o y demas pero seguire leyendo y consultando

respecto a lo del ifndef, entonces habria que poner un endif abajo de TOOODO el codigo ? para que lo saltee en caso de que el flag se active?

y respecto a lo de clase y objeto, Se la diferencia entre ellos, es decir, un objeto es una instancia de la clase, pero al haber metodos y atributos de clase, (no de instancia), te podes referir a la clase directamente, por ejemplo si quisieras setear una constante para todos los objetos de una clase, podes mandarle un mensaje a la clase y modificar un atributo de la clase.

no se como sera en C++ pero en Smalltalk podias definir metodos de clase y mandarles mensajes sin haber instanciado la clase, un ejemplo.

yo tengo una clase Persona

sin necesidad de hacer un: Jose:= Persona new.

yo podria hacer
Persona cantidad_de_piernas: 2

se entiende a lo que apunto?

repito no se como sera el tema en c++

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: Algunas consultas sobre C

Mensaje por m0skit0 »

yosoy_bostero escribió:sigo haciendome un poco de quilombo por lo de los .c .o y demas pero seguire leyendo y consultando

Como quieras, pero ya sabes, aquí puedes preguntar las dudas que quieras.

yosoy_bostero escribió:respecto a lo del ifndef, entonces habria que poner un endif abajo de TOOODO el codigo ? para que lo saltee en caso de que el flag se active?

Míralo tú mismo: http://code.google.com/p/psp-emu/source ... egrex.h#40

En cuanto a lo de SmallTalk, es curioso, no lo sabía. En C++ no se puede hacer eso, de hecho no existen clases estáticas como tales, pero se pueden simular. En C++ siempre debes crear un objeto, ya sea declarándolo:

Código: Seleccionar todo

string a;

o creándolo dinámicamente:

Código: Seleccionar todo

string* a = new string();

pero de esta segunda forma, hay que acordarse de destruirlo:

Código: Seleccionar todo

destroy a;

Por estas cosas esto es C++ y no D :lol:
Imagen

Avatar de Usuario
dRoLl3R
Habitual
Habitual
Mensajes: 315
Registrado: 29 Sep 2009, 21:30
Ubicación: [ † ] Asturias

Re: Algunas consultas sobre C

Mensaje por dRoLl3R »

La función que menciona que tiene SmallTalk la tiene Java. ¿Esa funcionalidad que es implementada por el creador de Java? lo pregunto porque tengo entendido que Java esta basado en C++
PSP3ooo: 4.21 -> 5.00 -> 5.03 -> 5.03 GEN-A -> 5.03 M33 -> 5.03 MHU -> 5.03 GEN-C -> 5.03 MHU -> 6.20 PRO-B4

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: Algunas consultas sobre C

Mensaje por m0skit0 »

dRoLl3R escribió:¿Esa funcionalidad que es implementada por el creador de Java?

Bueno, SmallTalk es el "inventor" de la programación orientada a objetos, así que tanto C++ como Java están basados en SmallTalk. Por tanto SmallTalk ya tenía clases estáticas (que es a lo que te refieres supongo). Algo como:

Código: Seleccionar todo

public static class jClaseJorl

Esto no lo implementa directamente C++, pero se puede crear una clase cuyo comportamiento sea igual. Sólo hay que declarar todos los métodos de la clase como estáticos (algo que también debes hacer en Java, por cierto) y no tener ningún constructor público. Es lo mismo, sólo que C++ no distingue la clase como "static" como ocurre con Java.
Imagen

yosoy_bostero
Enteradillo
Enteradillo
Mensajes: 43
Registrado: 12 Ene 2011, 16:55

Re: Algunas consultas sobre C

Mensaje por yosoy_bostero »

a ver entonces, por un lado, yo tengo varios .c con diferentes funciones supongamos, con sus headers y todo completito, como procedo a compilar y linkear? como le digo que quiero crear esos .o para luego poder compilar todo junto?

lo del ifndef como que creo qe lo tengo entendido ya,

despues con respecto a nuestro proyecto, la clase principal sera la de la placa madre, ahora desde donde se instanciara? desde si misma? por ejemplo dentro de mother.cpp habra un new... o tendremos un main.c desde donde instanciar todo y controlar lo que sucede?

estuve pegandole una leida al codigo, la idea que tenes sobre los errores los terror, seran strings ? int? structs? que tenes en mente?

edit: vi lo de los errores en el codigo, serian int enumerados por tipo digaaamos.
Última edición por yosoy_bostero el 21 Ene 2011, 08:14, editado 1 vez en total.

Avatar de Usuario
~Rdavid~
Experto
Experto
Mensajes: 965
Registrado: 12 Nov 2009, 17:29
Ubicación: Costa Rica

Re: Algunas consultas sobre C

Mensaje por ~Rdavid~ »

yosoy_bostero escribió:a ver entonces, por un lado, yo tengo varios .c con diferentes funciones supongamos, con sus headers y todo completito, como procedo a compilar y linkear? como le digo que quiero crear esos .o para luego poder compilar todo junto?


Si no estoy mal se usa un makefile para compilar todo junto.
Imagen

Responder