Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Estructura y funciones en lenguaje C.

Estas en el tema de Estructura y funciones en lenguaje C. en el foro de C/C++ en Foros del Web. Hola a todos. El caso es que estoy haciendo una agenda, en especial para aprender estructuras en C, créanme que hace 1 día que estoy ...
  #1 (permalink)  
Antiguo 21/09/2013, 13:36
RoDaVi
Invitado
 
Mensajes: n/a
Puntos:
Estructura y funciones en lenguaje C.

Hola a todos.
El caso es que estoy haciendo una agenda, en especial para aprender estructuras en C, créanme que hace 1 día que estoy renegando con el manual, el amigo Google y mucho picar código pero no lo logro.-
Lo que quiero es poner el ingreso de datos en una función como escribir_datos pero no hay caso.-

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4.  
  5. typedef struct
  6. {
  7.     int orden;
  8.     char nombre[30];
  9. }agenda;
  10.  
  11. void escribir_datos(agenda param)
  12. {
  13.     printf("\n Orden....:%d", param.orden);
  14.     printf("\n Nombre...:%s", param.nombre);
  15. }
  16.    
  17. int main()
  18. {
  19.     agenda datos;
  20.    
  21.     datos.orden = 1;
  22.     strcpy(datos.nombre, "Daniel");
  23.    
  24.     escribir_datos(datos);
  25.    
  26.    
  27.     printf("\n\n Pulse una tecla para cerrar la aplicacion..."); system("PAUSE>NULL");
  28.     return 0;
  29. }

Windows Xp, Borland C++ 5.5, lenguaje C. (autodidacta de 61 años)

Bueno es todo.-
Un gran saludo.
Daniel (espero encontrar amigos, no profe.)
  #2 (permalink)  
Antiguo 21/09/2013, 16:04
 
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
  #3 (permalink)  
Antiguo 22/09/2013, 12:35
RoDaVi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Estructura y funciones en lenguaje C.

Hola vosk.
No te puedo explicar el cansancio mental que tengo, me comí más de 2 horas con un montón de errores, pasaba de compilar de Dev-C++ a Borland C++ y los errores persistían y al final era la declaración de la estructura.-

Código:
struct _agenda //esta me daba error
{
    int orden;
}agenda;

Código:
typedef struct
{
    int orden;
}agenda;
Bueno que te puedo decir, la explicación es realmente esplendida muy completa, ya me pongo a estudiar todo y a memorizar la sintaxis.-
Solo aclararte que la librería Windows.h la uso para posicionar el cursor, me sirve para poner primero todos los pedidos de ingreso y luego comenzar por el primero.-
…Ingrese nombre………...:
…Ingrese apellido………….:
…Ingrese dirección………..:
…Ingrese código postal….:

Una cosa que no entiendo(ya me olvidaba) porque funciona el paso por referencia sin declarar de una forma tradicional un puntero a estructura?.-

Un gran saludo y muchas gracias.-
Daniel
  #4 (permalink)  
Antiguo 22/09/2013, 13:05
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Estructura y funciones en lenguaje C.

"... porque funciona el paso por referencia sin declarar de una forma tradicional un puntero a estructura?..."

Porque es lo mismo pero sin hacer la asignacion:

Código C:
Ver original
  1. agenda datos;//declaracion de la estructura
  2. agenda *ptr_datos;//declaracion de un puntero a un tipo agenda
  3.  
  4. //llamada a la funcion enviando un puntero
  5. mi_funcion(&datos);
  6.  
  7. //asignacion del puntero y llamada a la funcion enviando un puntero
  8. ptr_datos = &datos;
  9. mi_funcion(ptr_datos);

Nota que cuando usas el puntero en el segundo caso no necesitas referenciarlo con & porque ya es una referencia:

Código C:
Ver original
  1. //la sintaxi es correcta pero el funcionamiento no
  2. mi_funcion(&ptr_datos);

Saludos
vosk
  #5 (permalink)  
Antiguo 23/09/2013, 11:22
RoDaVi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Estructura y funciones en lenguaje C.

Hola vosk.
Bien lo entendí, unas cositas más:
getchar() es de conio.h y casi todos te aconseja no usar esa librería porque no es estándar de C.
Si no uso Windows.h ¿ como hago para posicionar el cursor en coordenadas a mi necesidad?.-

Desde ya gracias por tú tiempo.-
Saludos.
Daniel
  #6 (permalink)  
Antiguo 23/09/2013, 12:48
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Estructura y funciones en lenguaje C.

Ok, pues usa windows.h; pero ya que estás en windows no te sería mas rentable usar la windows.h para trabajar en modo grafico en vez de consola?

Saludos
vosk
  #7 (permalink)  
Antiguo 24/09/2013, 06:57
RoDaVi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Estructura y funciones en lenguaje C.

Hola vosk.
Lo voy a tener muy en cuenta.-

Saludos.
Daniel

Etiquetas: estructura, funciones, int, lenguaje, struct
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:02.