estructuras punteros programacion c

Iniciado por adexrn, 31 Marzo 2012, 18:53 PM

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

adexrn

ola buenas qtal estaba haciendo este progrma que te pide nombres de personas y sus datos como un hotel  el problema me viene cuando lo ejecuto y me sale este error estaria muy agradecido si me ayudaseis
gracias ;D

Unhandled exception at 0x772015de in pruevba.exe: 0xC0000005: Access violation reading location 0x00000065.




Citar#ifndef ficheroo_h
#define ficheroo_h
#define NUM_MAX 3
void pantalla(void);
typedef struct
{char nombre[20];
char apellido[50];
char direccion[20];
char telefono[20];
char dni[20];
char email[20];
char cpostal[20];
char fnacimiento[20];
char ciudad[20];
unsigned char Edad;
}t_cliente;
t_cliente clientes[NUM_MAX];
void datoscliente(t_cliente *ptr_clientes, int cantidad);      //definimos funcion asosiando al struct
void lista (t_cliente *ptr_clientes, int cantidad);
void prueba (t_cliente *ptr_clientes, int cantidad);
                     //clientes[] pertenece a t_cliente
#endif                     /* fichero_H */





Citar#include<string.h>
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include "fichero.h"

int main (void)
{
   char tecla;
   char salir=true;
   while(salir)
   {pantalla();
      tecla=getch();
      
      switch(tecla)
      {
      
      case'1':
         datoscliente(clientes,NUM_MAX);               //
         break;
      
      case'2':
         lista(clientes,NUM_MAX);
         break;
      case'3':
      salir=false;
      break;
      }
         
   }
}

void pantalla(void)
{   printf("\n\t Datos de Clientes\n");   
   printf ("\n1-Introduce datos del cliente\n");
   printf ("\n2-Muestra ficha de datos de los cliente\n");
   printf ("\n3-Salir\n");
   
}
void datoscliente(t_cliente *ptr_clientes, int cantidad)
   {
      int i,a;
      for (i=0; i<cantidad; i++)
      {
         printf("\n\nElige la opcion para seguir");
         printf("\n1 introducir datos de un nuevo cliente \n");
         printf("\n2 salir\n");
         printf("\n Desea seguir?\t");
         scanf("%d",&a);
         
         if(a==1)
         {
            printf ("\nIntroduce el nombre del cliente %d \n", i+1);   //cliente 1.2.. count+1  va sumando 1 a medida que introducimos los datos del cliente
            scanf ( "%s", &ptr_clientes->nombre);
            printf ("\nIntroduce el apellido del cliente %d\n", i+1);
            scanf ("%s", &ptr_clientes->apellido);
            printf ("\nIntroduce la edad del cliente %d\n", i+1);
            scanf ("%s", &ptr_clientes->Edad);
            printf ("\nIntroduce la direccion del cliente %d\n", i+1);
            scanf ("%s", &ptr_clientes->direccion);
            printf ("\nIntrodude el telefono del cliente %d\n", i+1);
            scanf ("%s", &ptr_clientes->telefono);
            printf ("\nIntroduce el DNI del cliente %d\n", i+1);
            scanf ("%s", &ptr_clientes->dni);
            printf ("\nIntroduce el EMAIL del cliente %d\n", i+1);
            scanf ("%s", &ptr_clientes->email);
            printf ("\nIntroduce el CODIGO postal del cliente %d\n", i+1);
            scanf ("%s", &ptr_clientes->cpostal);
            printf ("\nIntroduce la fecha de nacimiento del cliente %d\n", i+1);
            scanf ("%s", &ptr_clientes->fnacimiento);
            printf ("\nIntroduce la ciudad del cliente %d\n", i+1);
            scanf ("%s", &ptr_clientes->ciudad);
            ptr_clientes++;
         }
         ptr_clientes++;
         
         if(a==2)
         {break;}
      }
}


void lista (t_cliente *ptr_clientes, int cantidad)
{
   int i;
   for (i=0;i<cantidad;i++)
      
   {printf("\n%s\t",ptr_clientes->nombre);
   printf("\t%s",ptr_clientes->apellido);
   printf("\t%s",ptr_clientes->direccion);
   printf("\t%s",ptr_clientes->telefono);
   printf("\t%s",ptr_clientes->dni);
   printf("\t%s",ptr_clientes->Edad);
   printf("\t%s",ptr_clientes->email);
   printf("\t%s",ptr_clientes->cpostal);
   printf("\t%s",ptr_clientes->fnacimiento);
   printf("\t%s",ptr_clientes->ciudad);
   ptr_clientes++;
   }
}

Beakman

Primero: Para qué usas la librería conio ?!. Solo para poner getch() ?. Tranquilamente podés usar scanf();.
Alguien podría decir que esto es una pavada, pero no lo es, porque yo como mucha gente, uso una distribución de linux. Entonces si yo quiero ayudarte tengo que buscar en todo tu código que funciones de conio usaste para reemplazarlas por funciones estándar.

Segundo: Main debe retornar un número entero: return 0;

Tercero:
char salir=true;
( ... )
salir = false;

En vez de esto usá lo siguiente:
char salir= 1;
( ... )
salir = 0;


Cuarto:
lista(clientes,NUM_MAX);
A la función lista le estás pasando NUM_MAX como cantidad de elementos del vector clientes. Si el usuario ingresa menos clientes que NUM_MAX ( por ejemplo uno solo ), aparece error de violación de segmento.

Quinto: El menu no es del todo claro.

durasno

Hola! Aparte de lo que te marco CrisQC tenes un error en:
scanf ("%s", &ptr_clientes->Edad); // debe ser %c
a Edad lo definist como unsigned char Edad;
Otra error es en los scanf de la funcion datoscliente. Todos los campos de tu estructura son arreglos(sin contar Edad) por ende no es necesario agregar "&"

Saludos
Ahorrate una pregunta, lee el man

do-while

#3
¡Buenas!

Aqui tienes otro error de logica:


           scanf ("%s", &ptr_clientes->ciudad);
           ptr_clientes++;
        }
        ptr_clientes++;


Si se escoge introducir los datos de un cliente se esta avanzando por el vector de clientes de dos en dos, por lo que si escoges rellenar todo el vector al llegar a la mitad estaras apuntando a una zona de memoria a la que, en principio, no te corresponderia acceder.

Tendras que avanzar el puntero siempre, bien introduzcas datos o decidas no introducirlos en la posicion dada, por lo que el avance del puntero dentro del if te sobra.

¡Saludos!

PD: No te preocupes, si el usuario solo introduce un cliente tu codigo no supone ningun problema, directamente sale del for y vuelve a la funcion llamadora. Al mostrar datos lo mas posible es que muestre basura al acceder a datos no inicializados. He mentido. Como tienes cadenas de caracteres, si no contienen caracteres nulos, las funciones que las acceden seguramente de daran errores por acceder a posiciones de memoria indebidas al seguir leyendo la memoria en busca del caracter nulo que indica su fin. Puedes añadir una funcion que inicialice los datos de forma consistente.

Otra cosa, si no quieres encontrarte cosas raras, asegurate de que los datos introducidos estan dentro de rango, y luego actua en consecuencia. Si no te aseguras de que los datos de los distintos menus esten en el rango adecuado, tendras que añadir elses a los ifs para discriminar los datos que no te interesen.
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

adexrn