Ver Mensaje Individual
  #2 (permalink)  
Antiguo 21/09/2013, 16:04
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Estructura y funciones en lenguaje C.

Centrate en los temas de punteros y argumentos de funciones. En tu caso lo que quieres es enviar un puntero a tu agenda como argumento a la funcion que rellenará los datos


Código C:
Ver original
  1. agenda datos;//tu agenda
  2. agenda *ptr_datos = 0;//puntero nulo
  3. ptr_datos = &datos;//puntero a datos

Sabiendo esto ya pudes imaginar el prototipo de tu funcion:

Código C:
Ver original
  1. void entra_datos(agenda *);

Solo queda implementar la funcion y la llamada a la funcion:

Código C:
Ver original
  1. void entra_datos(agenda *ptr_datos) {
  2.     ptr->orden = 123;
  3.     sprintf(ptr->nombre, "Daniel");
  4. }
  5.  
  6.  
  7. int main() {
  8.     //declaras la estructura
  9.     agenda datos;
  10.  
  11.     //envias un puntero a la funcion
  12.     entra_datos(&datos);
  13.  
  14.     //volcado
  15.     escribir_datos(datos);
  16.    
  17.     return 0;
  18. }

Ok? Seguramente te habrá faltado algo de informacion sobre porque esto de los punteros, en los manuales que puedas leer estará mejor explicado que lo que te voy a comentar: cuando envias la estructura tal cual (sin referencia, es decir sin puntero) la funcion recibe una copia exacta de la estructura, es decir recibe una segunda estructura que por mucho que la modifiques no alterará la original. Puedes hacer la prueba:

Código C:
Ver original
  1. void modifica(agenda datos_copia) {
  2.     //datos_copia es una copia exacta de 'agenda datos' que tienes en el main
  3.     datos_copia.orden = 999;
  4. }
  5.  
  6. int main() {
  7.     agenda datos;
  8.    
  9.     datos.orden = 1;
  10.     modifica(datos);
  11.     printf("%d", datos.orden);//muestra 1
  12.  
  13.     return 0;
  14. }

En la funcion 'modifica' se recibe una copia de 'datos' donde originalmente orden=1, pero por mucho que machaque 'datos_copia.orden' nunca alterará el valor 'orden' de la estructura original. Esto se debe a que la copia no está en la misma direccion de memoria que la original ya que tal como el nombre indica es una nueva copia que se genera en cada llamada a la funcion.

Esto suele tenerse en cuenta en aplicaciones que necesitan ejecutar muy deprisa (p.ej. videojuegos), si se requiere enviar estructuras (o variables que no sean estructuras) muy grandes suele ser preferible enviar su puntero que solo pesa 4 bytes que forzar a que la aplicacion reserve memoria para una nueva copia de esa variable, la rellene, la use en la funcion y le vuelva a liberar al finalizar la funcion.

Para trabajar sobre la estructura original se envia una direccion de memoria de esa variable (o lo que sea), dicho de otra forma una referencia o un puntero. Cualquier modificacion sobre ese puntero efecta la variable original. Una simple prueba:

Código C:
Ver original
  1. void modifica(agenda *datos_ptr) {
  2.     datos_ptr->orden = 999;
  3. }
  4.  
  5. int main() {
  6.     agenda datos;
  7.    
  8.     datos.orden = 1;
  9.     modifica(&datos);
  10.     printf("%d", datos.orden);//muestra 999
  11.  
  12.     return 0;
  13. }

Tambien te habrás fijado en los modificadores '->' y los '&', indican que estas trabajando sobre el puntero. Todo esto puede explicarse mejor, pero bueno supongo que ahora ya ves por donde van los tiros, con cualquier manual puedes profundizar en el tema de punteros.

Una ultima cosa, no incluyas las librerias que no uses: windows y stdlib no las estas usando para nada.

Y aun otra ultima cosa: por ahi encontraras mil referencias a porque evitar la llamada system("pause"), puedes sustituirla por la funcion 'getchar()'.

Saludos
vosk