Struct y apuntadores

Iniciado por Cas980, 3 Abril 2014, 04:39 AM

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

Cas980

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.
reg->editorial
reg.editorial

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

struct libros
{
   char titulo[60];
   char autor[60];
   char editorial[60];
   int num_paginas[60];
} struct libros *reg;

void* cast(int m)
{
   return(malloc(m*sizeof(struct libros)));
}

main ()
{
   int x;
   int n;
   
   printf("Cuantos registros deseas ingresar?");
   scanf("%d",n);
   
   reg=(struct libros*)cast(n);
   
   for(x=0;x<n;x++)
   {
       printf("Titulo: ");
       gets(reg->titulo);
       printf("Autor; ");
       gets(reg->autor);
       printf("Editorial: ");
       gets(reg->editorial);
       printf("Numero de paginas: ");
       scanf("%d",reg->num_paginas);
       
       reg++;
   }
   
    for(x=0;x<n;x++)
   {
       printf("Titulo: %s",reg->titulo);
       printf("Autor; %s",reg->autor);
       printf("Editorial: %s",reg->editorial);
       printf("Numero de paginas: %s",reg->num_paginas);
       
       reg++;
   }

   
   getch();
}

rir3760

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.

Cita de: Cas980 en  3 Abril 2014, 04:39 AMTengo 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:
for (x = 0; x < n; x++){
   printf("Titulo: ");
   gets(reg[x].titulo);
   
   printf("Autor; ");
   gets(reg[x].autor);
   
   printf("Editorial: ");
   gets(reg[x].editorial);
   
   printf("Numero de paginas: ");
   scanf("%d", &reg[x].num_paginas);
}


Cita de: Cas980 en  3 Abril 2014, 04:39 AMNo tengo muy claro la diferencia entre estas dos formas.
reg->editorial
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:
struct libros {
   char titulo[60];
   char autor[60];
   char editorial[60];
   int num_paginas;
};
struct libros *reg;


* Te falta el operador "dirección de" (el '&') en la primera llamada a scanf:
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|.

* El segundo bucle se debe modificar de forma similar al primero y en la impresión del numero de paginas:
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
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