elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  estructuras punteros programacion c
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: estructuras punteros programacion c  (Leído 2,716 veces)
adexrn

Desconectado Desconectado

Mensajes: 4


Ver Perfil
estructuras punteros programacion c
« en: 31 Marzo 2012, 18:53 pm »

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++;
   }
}


En línea

Beakman

Desconectado Desconectado

Mensajes: 190



Ver Perfil WWW
Re: estructuras punteros programacion c
« Respuesta #1 en: 31 Marzo 2012, 22:10 pm »

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:
Código
  1. char salir=true;
  2. ( ... )
  3. salir = false;
  4.  
En vez de esto usá lo siguiente:
Código
  1. char salir= 1;
  2. ( ... )
  3. salir = 0;

Cuarto:
Código
  1. 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.


En línea

durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: estructuras punteros programacion c
« Respuesta #2 en: 31 Marzo 2012, 22:43 pm »

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
En línea

Ahorrate una pregunta, lee el man
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: estructuras punteros programacion c
« Respuesta #3 en: 2 Abril 2012, 17:35 pm »

¡Buenas!

Aqui tienes otro error de logica:

Código
  1.            scanf ("%s", &ptr_clientes->ciudad);
  2.            ptr_clientes++;
  3.         }
  4.         ptr_clientes++;
  5.  

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.
« Última modificación: 2 Abril 2012, 17:50 pm por do-while » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
adexrn

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: estructuras punteros programacion c
« Respuesta #4 en: 9 Abril 2012, 10:10 am »

ok voi a mirarlo muchas graciass ;D
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[C] Estructuras y punteros a funciones
Programación C/C++
Amadeo Magnus 1 5,360 Último mensaje 13 Octubre 2010, 15:05 pm
por Karman
Estructuras anidadas, funciones y punteros
Programación C/C++
NathanD 9 8,603 Último mensaje 18 Marzo 2013, 08:56 am
por 85
Punteros a estructuras...???
Programación C/C++
Ja_90 4 1,612 Último mensaje 11 Noviembre 2014, 21:10 pm
por eferion
Error al crear punteros a estructuras.
Programación C/C++
NikNitro! 2 1,256 Último mensaje 5 Marzo 2015, 17:11 pm
por NikNitro!
Estructuras con Punteros
Programación C/C++
jgonzalezo 1 923 Último mensaje 13 Abril 2015, 09:02 am
por eferion
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines