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

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C] Problema con Struct en funciones que llaman a otras funciones
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C] Problema con Struct en funciones que llaman a otras funciones  (Leído 23,526 veces)
‭lipman


Desconectado Desconectado

Mensajes: 3.062



Ver Perfil WWW
[C] Problema con Struct en funciones que llaman a otras funciones
« en: 14 Mayo 2011, 18:37 pm »

Mi objetivo es crear un sistema básico que en una función, teniendo un limite, esté añadiendo contactos a una tabla.

La cosa es que no entiendo porqué no me funciona lo siguiente:

Código
  1. #include<stdio.h>
  2. #define LIMITE 3
  3.  
  4.  
  5.  
  6. struct contactos {
  7.  
  8.  char telefono[10];
  9.  
  10.  char descripcion[51];
  11.  
  12. };
  13.  
  14. //Prototipos:
  15. int almacenaContacto(struct contactos *f);
  16. void leerContacto(struct contactos *f);
  17.  
  18. int main(){ //INICIO PROGRAMA
  19.  
  20. int variable;
  21.  
  22. struct contactos gente[LIMITE];
  23.  
  24.  
  25.  
  26. variable=almacenaContacto(&gente);
  27.  
  28.  
  29.  
  30.  
  31. return 0;
  32.  
  33. } //FIN PROGRAMA
  34.  
  35. int almacenaContacto(struct contactos *f){
  36.  
  37.  
  38. int i=0;
  39.  
  40.  while(i<LIMITE){
  41.  
  42.  leerContacto(&(*f)[i]);
  43.  
  44.  i=i+1;
  45.  
  46.  }
  47. }
  48.  
  49. //Nota: la funcion leerContacto funciona correctamente: recibe un parámetro struct y me permite ir añadiendo contacto a contacto
  50.  
La parte que empieza a dar problemas en el programa es la de "leerContacto(&(*f)[ i]);", es decir, que podria concluir diciendo que:

Tengo un programa principal y en el tengo un struct en el que quiero que vayan un determinado numero de elementos. Llamo a una funcion para que haga el bucle y vaya uno a uno, y a su vez, esta función llama a otra que se encarga individualmente de meter los datos en cada una. Mi error se encuentra justo aquí al final, que no se porqué, no consigo hacer referencia a cada parte en el bucle.

Alguna idea?

Un saludo


En línea

‭lipman


Desconectado Desconectado

Mensajes: 3.062



Ver Perfil WWW
Re: [C] Problema con Struct en funciones que llaman a otras funciones
« Respuesta #1 en: 14 Mayo 2011, 21:15 pm »

Voy a replantear el problema de otra forma, igual así alguien me puede ayudar de otra manera >.<

Tengo el siguiente código que funciona correctamente:

Código
  1. #include<stdio.h>
  2.  
  3.  
  4. struct contacto {
  5.  char tlfn[10];
  6.  char dir[51];
  7. };
  8.  
  9. //Prototipo
  10. void probar(void);
  11. void escribir(struct contacto *f);
  12.  
  13. int main(){
  14.  probar();
  15.  return 0;
  16. }
  17.  
  18.  
  19. void probar(void){
  20. int i=0;
  21. struct contacto gente[3];
  22.  
  23. while(i<3){
  24.  escribir(&gente[i]);
  25.  i=i+1;
  26. }
  27.  
  28. }
  29.  
  30. void escribir(struct contacto *f){
  31.  
  32. printf("Introduce el telefono: ");
  33. gets((*f).tlfn);
  34. printf("Introduce la direccion: ");
  35. gets((*f).dir);
  36.  
  37. }

Explicación breve:
La función principal llama a una funcion que define unas estructuras y mediante un bucle va rellenándolas. Si dentro de la primera función pusiera otra que se encargase de leer lo que he introducido, lo leeria perfectamente. El problema es que la estructura que he escrito la quiero en el int main, y no tengo ni idea de cómo llamarla.

Alguna idea?


En línea

Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: [C] Problema con Struct en funciones que llaman a otras funciones
« Respuesta #2 en: 14 Mayo 2011, 23:21 pm »

Quieres tener la estructura declarada en el main, pasarla a un función que ingrese datos a ella, y luego pasarla a otra función que lea los parámetros que le fueron ingresados.
Podes pasar el puntero directamente de la función 1 a la función 2.

Es decir, en main tenes algo como esto:

Código
  1. int main{
  2. //random code
  3. struct contacto gente[3];
  4.  
  5. AlgunaFuncion( &gente[x]);

Código
  1. void AlgunaFuncion ( struct contacto *ptr)
  2. {
  3. //random code
  4.  
  5. ptr->algo =  otracosa;
  6.  
  7. FuncionNumeroDos(ptr);
  8. }
  9.  


Código
  1. FuncionNumeroDos ( struct contacto *ptr)  
  2. {
  3. //random code
  4. printf("%s", ptr->algo);
  5.  
  6. }

También podrías pasar el arreglo de estructuras directamente, pero no se si es eso lo que estas buscando.
No se si te entendí del todo, cualquier cosa me avisas.

Saludos!
En línea

An expert is a man who has made all the mistakes which can be made, in a very narrow field.
‭lipman


Desconectado Desconectado

Mensajes: 3.062



Ver Perfil WWW
Re: [C] Problema con Struct en funciones que llaman a otras funciones
« Respuesta #3 en: 15 Mayo 2011, 11:12 am »

Muchas gracias! Ya poco a poco estoy más cerca de la solución, pero todavia le falla algo. Aquí dejo el código completo de momento:

Código
  1. #include<stdio.h>
  2.  
  3. struct contacto {
  4.  char tlfn[10];
  5.  char dir[51];
  6. };
  7.  
  8. //Prototipo
  9. void probar(struct contacto *f);
  10. void escribir(struct contacto *f);
  11.  
  12. int main(){
  13.  struct contacto gente[3];
  14.  probar(&gente[3]);
  15.  return 0;
  16. }
  17.  
  18. void probar(struct contacto *f){
  19. int i=0;
  20.  
  21. while(i<3){
  22.  escribir(f);
  23.  i=i+1;
  24. }
  25.  
  26. }
  27.  
  28. void escribir(struct contacto *f){
  29.  
  30. printf("Introduce el telefono: ");
  31. gets(f->tlfn);
  32. printf("Introduce la direccion: ");
  33. gets(f->dir);
  34.  
  35. }

Este código compila (te sale el warning de la funcion gets pero no es problema). El error viene cuando lo voy a ejecutar: hace los tres bucles pidiendome tres veces los datos, los introduzco, y justo despues, en lugar de terminar sin decirme nada, me salta con un: "violacion del segmento ('core' generado)"

El problema no es del gets, porque lo he cambiado por unos respectivos bucles usando el getchar con lectura adelantada para que compile sin warnings y recogiendo la información usando otra alternativa y termina exactamente igual.

¿Que puede pasar?

Un saludo y gracias!
En línea

Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: [C] Problema con Struct en funciones que llaman a otras funciones
« Respuesta #4 en: 15 Mayo 2011, 15:45 pm »

Bueno por lo pronto algunas cosas:

Código
  1. while(i<3){
  2. escribir(f);
  3. i=i+1;
  4. }

Esto no se porque lo haces siendo que f siempre contiene el mismo elemento. Es decir, ese bucle no tiene sentido, estas asignando contenido siempre al mismo elemento, el cual es el que le pasaste desde main. En todo caso en el main es donde tendrías que hacer el bucle (pasarías un elemento a la función probar en cada vuelta), o le tendrías que pasar el array completo a la función probar y ahí si seria correcto de la forma en que lo tienes.

Entrando en el main, el elemento que le pasas esta fuera de los limites del array. Recuerda que el primer elemento de un array comienza en la posición 0 y termina en arraymax-1.

Código
  1. struct contacto gente[3];
  2. probar(&gente[3]);

gente[0] , gente[1], gente[2]. Esas son las 3 posiciones que tenes actualmente.

Saludos!
« Última modificación: 15 Mayo 2011, 15:47 pm por Littlehorse » En línea

An expert is a man who has made all the mistakes which can be made, in a very narrow field.
‭lipman


Desconectado Desconectado

Mensajes: 3.062



Ver Perfil WWW
Re: [C] Problema con Struct en funciones que llaman a otras funciones
« Respuesta #5 en: 15 Mayo 2011, 17:26 pm »

Vale vale, me he liado y no me he fijado en eso, de ahí viene esa incongruencia tan rara =S

Lo que yo queria hacer (ahora entenderás el porqué del bucle while) era que, desde la primera funcion a la que llamas, haga un bucle de, en este caso, tres veces, ejecutando la funcion segunda tres veces en total. Esta funcion segunda es la que se encarga de tomar los datos. De esta manera, si tengo un array gente[3] (como tu dices, del 0 al 2), quisiera pasarle a la segunda funcion cada vez un valor distinto, para que al final de la llamada a la segunda función, tras recoger todos los datos, me quedase lo siguiente de forma esquemática:

gente[0].tlfn = "lo que sea"
gente[0].dir = "lo que sea"
gente[1].tlfn = "lo que sea"
gente[1].dir = "lo que sea"
gente[2].tlfn = "lo que sea"
gente[2].dir = "lo que sea"

Y de esta manera, desde la función principal poder usar cualquier dato. Creo que ahora si que me he explicado bien xD, pero claro, lo que no puedo hacer es lo siguiente:

Código
  1. while(i<3){
  2.  escribir(f[i]);
  3.  i=i+1;
  4. }

O igual si que puedo hacerlo, pero tengo que cambiar la estructura de la función escribir: ahí mi duda.

Muchas gracias, un saludo!
En línea

Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: [C] Problema con Struct en funciones que llaman a otras funciones
« Respuesta #6 en: 16 Mayo 2011, 02:24 am »

Código
  1. void probar(struct contacto f[]) // *f
  2. {
  3. int i=0;
  4.  
  5. while(i<3){
  6. escribir(&f[i]);
  7. i=i+1;
  8. }
  9.  
  10. }
  11.  

Código
  1. //llamada
  2. probar(gente);

Saludos
« Última modificación: 16 Mayo 2011, 18:51 pm por Littlehorse » En línea

An expert is a man who has made all the mistakes which can be made, in a very narrow field.
‭lipman


Desconectado Desconectado

Mensajes: 3.062



Ver Perfil WWW
Re: [C] Problema con Struct en funciones que llaman a otras funciones
« Respuesta #7 en: 18 Mayo 2011, 12:40 pm »

En efesto. Muchísimas gracias, me solucionaste el problema por completo =)
En línea

D4RIO


Desconectado Desconectado

Mensajes: 1.004


U N I X


Ver Perfil WWW
Re: [C] Problema con Struct en funciones que llaman a otras funciones
« Respuesta #8 en: 18 Mayo 2011, 20:37 pm »

En vista de tu código, supongo que estás aprendiendo C y no tienes del todo afianzados los conocimientos técnicos del lenguaje. Por eso, permíteme hacerte algunos comentarios que te pueden favorecer el aprendizaje.

Primer Punto: No debería ser un WHILE sino un FOR, puesto que sabes exáctamente cuántos lugares recorrer.

Segundo: En estos casos, mientras uses C, te convendría ser más explícito en la aritmética de punteros, y quizá menos en la lógica. Yo prefiero ese estilo de codificación porque es más explícito en lo que se está haciendo a nivel memoria. Me refiero a que si tu código es más técnico, lo comprenderás mejor. Cuando conozcas lo suficiente, elegirás cuál es tu manera de codificar favorita.

No he probado porque estoy en el trabajo, pero esto es lo que haría yo:

1 - SIEMPRE pasar el puntero, así sabemos exáctamente con qué trabajamos:
Código
  1. int almacenaContacto(struct contactos *f)

2 - Usar la aritmética de punteros. Cada suma de una unidad para un puntero es un desplazamiento equivalente a su tamaño. Es totalmente claro hacer algo así:
Código
  1. int almacenaContacto(struct contactos *f){
  2.    int i;
  3.    struct contactos *punt = f;
  4.    /* punt contiene la misma direccion, por
  5.      * lo tanto es equivalente, pero como es
  6.      * local a la funcion, podemos moverlo
  7.      */
  8.    for(i=0; i<LIMITE; i++) {
  9.        /* en cada vuelta tienes una llamada simple
  10.          */
  11.        leerContacto(punt);
  12.        /* se mueve una vez el tamanno de
  13.          * la estructura
  14.          */
  15.        punt++;
  16.    }
  17. }

Respecto a la notación que LittleHorse te indicaba, lo reescribiría de esta forma:
Código
  1. void probar(struct contacto f[]) {
  2.    int i;
  3.    for(i=0; i<3; i++){
  4.        escribir(&f[i]);
  5.    }
  6. }


Y por favor, no utilices:
Código
  1. i=i+1

Esto no es PASCAL, aquí existe el operador de incremento:
Código
  1. i++


Saludos
En línea

OpenBSDFreeBSD
Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: [C] Problema con Struct en funciones que llaman a otras funciones
« Respuesta #9 en: 19 Mayo 2011, 23:39 pm »

En efesto. Muchísimas gracias, me solucionaste el problema por completo =)

De nada! igualmente dale una leída a todo lo que es punteros y pasaje por referencia así no queda nada en el aire.


Respecto a la notación que LittleHorse te indicaba, lo reescribiría de esta forma:
Código
  1. void probar(struct contacto f[]) {
  2. int i;
  3. for(i=0; i<3; i++){
  4. escribir(&f[i]);
  5. }
  6. }

Solo tome el código tal cual estaba en el primer post y modifique los parámetros para resolver la duda inicial, por lo que el código no es realmente mio. Mas allá de esta pequeña aclaración, tus indicaciones son correctas.

Saludos!
En línea

An expert is a man who has made all the mistakes which can be made, in a very narrow field.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema con argumentos por defectos en funciones.
Programación C/C++
anonimo12121 3 2,253 Último mensaje 25 Julio 2012, 14:18 pm
por overxfl0w13
Problema con funciones desde menu
Programación C/C++
Luckim 0 1,884 Último mensaje 30 Julio 2012, 23:18 pm
por Luckim
PROBLEMA ENTRE ARRAY MULTIDIMENSIONAL Y FUNCIONES
Programación C/C++
BJM 2 2,503 Último mensaje 29 Septiembre 2012, 12:47 pm
por leosansan
COMO ACTIVAR FUNCIONES A DC CAD2004
Ingeniería Inversa
dorager1 5 9,334 Último mensaje 11 Abril 2013, 06:43 am
por apuromafo CLS
Paso de funciones a otras funciones
Programación C/C++
eaz95 1 1,951 Último mensaje 18 Julio 2017, 11:59 am
por ivancea96
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines