Estructuras en C

Iniciado por Yc, 13 Marzo 2014, 14:17 PM

0 Miembros y 1 Visitante están viendo este tema.

Yc

Muy wenas estoy haciendo estructuras en C:

queria saber maso menos la diferencia entre estos dos:


typedef struct coordinate
    {
        int x;
        int y;
    } Coordinate;


int main()
{
    Coordinate c[N];
}


typedef struct  {
                    int x;
                    int y;
                } Coordinate;

int main()
{
    Coordinate c[N];
}


typedef struct Coordinatei {
                        int x;
                        int y;
                    } c[N];

int main()
{
    struct coordinate c[N];
}




SI SE PUEDE VER LA NOTACION ES DIFERENETE PERO CREO QUE AL FINAL SON LA MISMA COSA O NO ENTIENDO QUE QUIERE DECIR CADA UNO, EN SI AL VER ESTO ME HE MAREADO Y YA NO ENTIENDO BIEN COMO ES LA NOTACION DEL "TYPEDEF STRUCT", les agradeceria mucho gracias

rir3760

Cita de: Yc en 13 Marzo 2014, 14:17 PMSi se puede ver la notacion es diferenete pero creo que al final son la misma cosa o no entiendo que quiere decir cada uno, en si al ver esto me he mareado y ya no entiendo bien como es la notacion del "typedef struct"
Por favor no escribas el texto en mayúsculas, dificulta la lectura y en foros como este equivale a gritar.

----

Tienes tres casos distintos, en el primero:
typedef struct coordinate {
   int x;
   int y;
} Coordinate;


int main()
{
   Coordinate c[N];
}

Declaras la estructura "struct coordinate" y su alias "Coordinate", puedes utilizar cualquiera de los dos para la declaración, esta se realiza en la función main: "c" es un array de N elementos de tipo "Coordinate".

En el segundo:
typedef struct {
   int x;
   int y;
} Coordinate;

int main()
{
   Coordinate c[N];
}

La estructura es anónima (sin nombre, para ser exactos, sin etiqueta). De nuevo la declaración se realiza en la función main y aquí solo puedes utilizar el alias.

El tercero:
typedef struct Coordinatei {
   int x;
   int y;
} c[N];

int main()
{
    struct coordinate c[N];
}

Es mas complicado y no es valido ya que:
1) Se declara la estructura "struct Coordinatei".
2) Se declara el alias "c" como equivalente a "struct Coordinatei [N]".
Ya que no hay declaración de "struct coordinate" tu compilador debe generar un mensaje de error.

Por ultimo y solo para redondear puedes utilizar "c" como el tipo para declarar un array, por ejemplo:

/* Forma usual */
struct Coordinatei a[N];

/* Utilizando el alias */
c b;

En ambas declaraciones el tipo es el mismo: array de N elementos de tipo "struct Coordinatei", la primera utiliza la forma usual y la segunda el alias.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

dato000

Estupenda explicación, como a todo novato, siempre me pareció complicado entender eso, pero luego de eso me pareció una ventaja suprema para la declaración de variables, siempre declaro estructuras con un alias, es mucho pero muchisisisisisisimo más cómodo así

slds ;D ;D



Yc

y en si lo que puse antes era algo asi, solo que me equivoque al cambiar los nombres para que salgan 3 ejemplos..........:

typedef struct nombre {
                        char nombre[M];
                        char apellido[M];
                        char fijo[M];
                        char mobil[M];
                    } Nombre[N];

int main()
{
    struct nombre Nombre[N];
    .
    .
    .
    .


y asi compila. Por eso decia que raro que salga "struct nombre Nombre [N]

eferion

NOTA: En el formulario para escribir los mensajes, tienes un compo que dice GeSHi... elige ahí C o C++ según corresponda y mete tu código dentro de las etiquetas que te va a crear... así consigues que el código aparezca coloreado y sea más legible.

si tu tienes esto:


typedef struct nombre
{
  char nombre[M];
} Nombre[N];


es como decir lo siguiente:

tienes una estructura, cuyo "nombre" es "struct nombre". Esta estructura tiene un alias que es "Nombre". El contenido de esta estructura es un array de caracteres identificado como "nombre".

Como se puede ver no hay ninguna ambigüedad, aunque para que quede más claro te lo pongo en formato lista:

* identificador estructura: struct nombre
* alias de la estructura: Nombre ( el alias se corresponde a un array de N elementos )
* identificador del array de caracteres: nombre

Yc

Gracias por tu ayuda =D con eso ya me aclare todo lo que es estructuras ahora voy bien en lo que es ficheros, muchar gracias.

eferion

De nada.

Suerte con tus prácticas.

Yc

Hola disculpa si es mucha molestia y creo que no va al tema por aca, pero veo que eres el unico que me ayuda asi que en si solo por eso "romperia las reglas" jeje por un caso hay una manera de,nose si has visto en algunos compiladores cuando no te sale lo que quieres haces 'Debug' 'Run to cursor' y asi asi vas viendo n un 'watch' como van las variables y todo eso,asi a veces veo mis errores y aprendo mucho d eso, quedria saber si hay en los compiladores una forma de ver linea de comando donde se pueda ver estos pasos, yo uso el codeblocks todo me va bien pero no tendria idea si hay esto o derepente algun otro compilador......Ejecutar la linea de comando si lo se por el DOS pero si no me sale lo que quiero nose donde esta mi error, ese es mi problema.Espero me entiendas gracias

eferion

A ver si te he entendido bien.

Estas hablando de depurar programas, no?

Si no es así no sigas leyendo jejeje.

Cuando compilas un programa puedes hacerlo en modo debug o en modo release. La diferencia entre ambos modos es que el modo release aplica una serie de optimizaciones en el código para hacerlo más rápido. El modo debug, en cambio, inserta "marcadores" en el código para poder depurarlo. En resumen, cuando compilas en modo debug, el programa es más lento y grande que si lo compilas en modo release.

Cuando tienes un programa compilado en modo debug puedes usar unos programas llamados depuradores. Un depurador es una aplicación que permite seguir la traza de la aplicación para rastrear problemas en el código. Un depurador, para poder funcionar, necesita el ejecutable y el código fuente para relacionar ambos y presentarte la información de forma amigable.

Los depuradores, por definición, no tienen interfaz gráfica, son aplicaciones de modo consola. El problema que presenta utilizar un depurador en modo consola es que navegar por el código (por ejemplo para poner breakpoints o evaluar variables) puede ser bastante tedioso y frustrante... aunque con práctica todo se consigue.

Los IDEs suelen utilizar uno de estos depuradores, lo que sucede es que te lo presentan con una interfaz gráfica que además se integra automáticamente con tu código fuente, lo que reduce muchísimo la curva de aprendizaje. Yo, a título personal, prefiero depurar a través de un IDE que depurar "a pelo". He probado las dos formas y elijo la primera.

Dicho esto, hay depuradores para todos los colores y gustos. A mi personalmente me gusta bastante el que trae el VisualStudio. Al menos comparado con el que viene con QtCreator no hay color. El de CodeBlocks aún no he tenido ocasión de utilizarlo... aún no se integra del todo bien con Qt.

nolasco281

Muy buena pregunta y respuesta

si mal no tengo entendido hay errores logicos sintacticos y semanticos, ya que se habla de IDE es posible ver de alguna manera los errores semanticos, en el IDE, o ver el proceso de como ocurre este tipo de error.

Gracias.
Lo que se puede imaginar... se puede programar.