Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Cas980 en 3 Abril 2014, 04:39 am



Título: Struct y apuntadores
Publicado por: Cas980 en 3 Abril 2014, 04:39 am
Saludos a toda la comunidad, tengo el siguiente programa que maneja una estructura y apartir de un numero n dado por el usuario reserva memoria para guardar todos los registros.
Tengo varias dudas al usar los apuntadores y la forma de acceder a las variables del struct. La forma en que lo estoy haciendo es correcta?  :huh: :huh:
No tengo muy claro la diferencia entre estas dos formas.
Código
  1. reg->editorial
Código
  1. reg.editorial

Código
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <stdlib.h>
  4.  
  5. struct libros
  6. {
  7.    char titulo[60];
  8.    char autor[60];
  9.    char editorial[60];
  10.    int num_paginas[60];
  11. } struct libros *reg;
  12.  
  13. void* cast(int m)
  14. {
  15.    return(malloc(m*sizeof(struct libros)));
  16. }
  17.  
  18. main ()
  19. {
  20.    int x;
  21.    int n;
  22.  
  23.    printf("Cuantos registros deseas ingresar?");
  24.    scanf("%d",n);
  25.  
  26.    reg=(struct libros*)cast(n);
  27.  
  28.    for(x=0;x<n;x++)
  29.    {
  30.        printf("Titulo: ");
  31.        gets(reg->titulo);
  32.        printf("Autor; ");
  33.        gets(reg->autor);
  34.        printf("Editorial: ");
  35.        gets(reg->editorial);
  36.        printf("Numero de paginas: ");
  37.        scanf("%d",reg->num_paginas);
  38.  
  39.        reg++;
  40.    }
  41.  
  42.     for(x=0;x<n;x++)
  43.    {
  44.        printf("Titulo: %s",reg->titulo);
  45.        printf("Autor; %s",reg->autor);
  46.        printf("Editorial: %s",reg->editorial);
  47.        printf("Numero de paginas: %s",reg->num_paginas);
  48.  
  49.        reg++;
  50.    }
  51.  
  52.  
  53.    getch();
  54. }


Título: Re: Struct y apuntadores
Publicado por: rir3760 en 3 Abril 2014, 05:22 am
Si no tienes un curso o libro de calidad sobre C te recomiendo conseguir uno, recomendaciones sobre ellos las puedes encontrar mediante el motor de búsqueda de los foros.

Tengo varias dudas al usar los apuntadores y la forma de acceder a las variables del struct. La forma en que lo estoy haciendo es correcta?
No. Debes primero utilizar el operador "[ ]" para acceder a un elemento del bloque y a continuación el operador "." para acceder al campo indicado. Por ejemplo el primer bucle se debe cambiar a:
Código
  1. for (x = 0; x < n; x++){
  2.   printf("Titulo: ");
  3.   gets(reg[x].titulo);
  4.  
  5.   printf("Autor; ");
  6.   gets(reg[x].autor);
  7.  
  8.   printf("Editorial: ");
  9.   gets(reg[x].editorial);
  10.  
  11.   printf("Numero de paginas: ");
  12.   scanf("%d", &reg[x].num_paginas);
  13. }

No tengo muy claro la diferencia entre estas dos formas.
Código
  1. reg->editorial
  2. reg.editorial
La primera se utiliza si "reg" es un puntero, la segunda cuando no lo es.

En cuanto al programa tiene varios errores, algunos de ellos:

* Te falta el punto y coma después de la declaración de "struct libros" y el numero de paginas no debe ser un array. Hay que cambiar la declaración a:
Código
  1. struct libros {
  2.   char titulo[60];
  3.   char autor[60];
  4.   char editorial[60];
  5.   int num_paginas;
  6. };
  7. struct libros *reg;

* Te falta el operador "dirección de" (el '&') en la primera llamada a scanf:
Código
  1. scanf("%d",n); /* Deberia ser scanf("%d", &n); */

* La función "cast" solo "pasa la cubeta" (llama a otra función), para el caso eliminala y llama a malloc directamente. Y no es necesario convertir el resultado de malloc al tipo apropiado.

* La función main se debe definir como "int main(void) ..." o "int main() ..." y su valor de retorno debe indicarse con al menos "return 0;". También hay que evitar el uso de gets y la biblioteca conio de Borland. Las razones de ello en el tema |Lo que no hay que hacer en C/C++. Nivel basico| (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html).

* El segundo bucle se debe modificar de forma similar al primero y en la impresión del numero de paginas:
Código
  1. printf("Numero de paginas: %s",reg->num_paginas);
Como ya te comente debes cambiar el tipo del campo "num_paginas" a int e imprimirlo utilizando el especificador "%d" ("%s" solo debe utilizarse para imprimir cadenas).

Un saludo