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

 

 


Tema destacado:


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

Desconectado Desconectado

Mensajes: 48


Ver Perfil
Estructuras anidadas, funciones y punteros
« en: 17 Marzo 2013, 15:25 pm »

Buenas a todos, tengo unas cuantas dudas y espero poder resolverlas con vosotros.

Tengo que coger un ejercicio de administración de hoteles, hecho anteriormente, y hacerlo, pero esta vez usando punteros.

Por ejemplo, las primeras líneas del .c con main, donde declaro la estructura y la inicializo:

Código
  1. HOTELES hotel[NUM_HOTELES];          //3 hoteles
  2.  
  3. /***************/
  4. HOTELES_inicializarHoteles(hotel); //Inicializamos el número de clientes de cada hotel a 0
 

Dicha función está definida así:

Código
  1. void HOTELES_inicializarHoteles(HOTELES hotel[])
  2. {
  3. int i;
  4.  
  5. for(i=0; i<NUM_HOTELES; i++)
  6. {
  7. hotel[i].numero_clientes = 0;
  8. }
  9. }

Como se trata de reescribir el programa usando punteros, me he limitado a cambiar el parámetro:

Código
  1. void HOTELES_inicializarHoteles(HOTELES *hotel)

Pero no consigo hacer nada. Me da error tanto si intento acceder a la posición del hotel con aritmética de punteros

Código
  1. *(hotel + i).numero_clientes = 0;

como accediendo a la estructura con el operador "->"

Código
  1. hotel[i]->numero_clientes = 0;

(Y haciendo ambas cosas juntas también de da error, claro).

En cambio, si en el parámetro de la función defino hotel como indirección doble, sí que debo emplear el operador "->". Pero bueno, que tampoco tengo del todo claro por qué hay que hacerlo así, lo he hecho un poco al tuntún. Además, así da error en ejecución...

Mi otra duda es si también debería modificar las estructuras anidadas, es decir, si en el primer ejercicio tengo una estructura dentro de otra de forma "simple", si ahora tengo que anidarlas usando punteros.

El tema de los punteros lo tengo claro, cómo y cuándo usar los operadores, direcciones de memoria, etc. Pero ahora con las estructuras no lo tengo nada claro.

Gracias de antemano, perdón por el tocho y saludos.


En línea

avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: Estructuras anidadas, funciones y punteros
« Respuesta #1 en: 17 Marzo 2013, 16:21 pm »

Sería de gran ayuda que postearas los errores que te dá el compilador. A mí así me funciona perfectamente:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define NUM_HOTELES 3
  4.  
  5. /// DEFINICIÓN DE ESTRUCTURAS
  6. struct HOTEL
  7. {
  8.    int numero_clientes;
  9. };
  10.  
  11. typedef struct HOTEL HOTELES;
  12.  
  13. /// DECLARACIÓN DE FUNCIONES
  14. void HOTELES_inicializarHoteles(HOTELES *hotel);
  15.  
  16. int main (int argc, char *argv [])
  17. {
  18.    HOTELES hotel[NUM_HOTELES];          //3 hoteles
  19.  
  20.    HOTELES_inicializarHoteles(hotel); //Inicializamos el número de clientes de cada hotel a 0
  21.  
  22.    return 0;
  23. }
  24. /// DEFINICIÓN DE FUNCIONES
  25. void HOTELES_inicializarHoteles(HOTELES *hotel)
  26. {
  27.    int i;
  28.    for(i=0; i<NUM_HOTELES; i++)
  29.    {
  30.        hotel[i].numero_clientes = 0;
  31.    }
  32. }
Quizás te hayas confundido al declarar las estructuras puesto que se declaran así:
Código
  1. [struct] <identificador> <objeto_estructura>
Fuente: http://c.conclase.net/curso/?cap=011
Y tu la has declarado sin el struct:
Código
  1. HOTELES hotel[NUM_HOTELES];
Eso sí, si has puesto esto en el código no sé de que es el problema:
Código
  1. typedef struct HOTEL HOTELES;

¡Un saludo!


« Última modificación: 17 Marzo 2013, 16:32 pm por avesudra » En línea

Regístrate en
NathanD

Desconectado Desconectado

Mensajes: 48


Ver Perfil
Re: Estructuras anidadas, funciones y punteros
« Respuesta #2 en: 17 Marzo 2013, 16:35 pm »

Hola avesudra, gracias por responder.

Así lo he hecho funcionar, modificando el parámetro de la función, solamente poniendo * en lugar de []. Pero verás, como se trata de hacer el ejercicios con punteros, asumo que debe de haber más cambios, no algo tan simple como cambiar los parámetros. Como, por ejemplo, acceder a los valores con la notación de punteros en lugar de con la de los arrays, o usando el operador -> en lugar de ., para acceder a las estructuras.

Si no me he expresado con claridad sólo tienes que preguntarme :)

Muchas gracias
En línea

avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: Estructuras anidadas, funciones y punteros
« Respuesta #3 en: 17 Marzo 2013, 16:46 pm »

---------------------------------------------------------------------------------------------------------------------------------------
El problema es que si desreferencias el puntero a la estructura te quedas con el valor del primer elemento de la estructura(supongo que puede ser el número de clientes o no sé, por eso no puedes acceder a nada, la primera dirección de memoria de una estructura creo que normalmente es su primer elemento, dependiendo de como se organize la memoria...)(que conste que no lo tengo claro):
Código
  1. *(hotel + i).numero_clientes = 0;
---------------------------------------------------------------------------------------------------------------------------------------
Retirando lo dicho, es un problema de sintaxis, pues así si sale:
Código
  1. (*(hotel + i)).numero_clientes = 0;
Pues así no está mal, lo que pasa es que obviamente tienes que apuntar el puntero a la estructura, que la creo con calloc:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define NUM_HOTELES 3
  4.  
  5. /// DEFINICIÓN DE ESTRUCTURAS
  6. struct HOTEL
  7. {
  8.    int numero_clientes;
  9. };
  10.  
  11. typedef struct HOTEL HOTELES;
  12.  
  13. /// DECLARACIÓN DE FUNCIONES
  14. void HOTELES_inicializarHoteles(HOTELES *hotel);
  15.  
  16. int main (int argc, char *argv [])
  17. {
  18.    HOTELES *hotel;          
  19.    hotel = calloc(NUM_HOTELES,sizeof(HOTELES));//3 hoteles
  20.    HOTELES_inicializarHoteles(hotel); //Inicializamos el número de clientes de cada hotel a 0
  21.    return 0;
  22. }
  23. /// DEFINICIÓN DE FUNCIONES
  24. void HOTELES_inicializarHoteles(HOTELES *hotel)
  25. {
  26.    int i;
  27.  
  28.    for(i=0; i<NUM_HOTELES; i++)
  29.    {
  30.        (hotel+i)->numero_clientes = 0;
  31.    }
  32. }
« Última modificación: 17 Marzo 2013, 16:58 pm por avesudra » En línea

Regístrate en
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Estructuras anidadas, funciones y punteros
« Respuesta #4 en: 17 Marzo 2013, 16:58 pm »

Como se trata de reescribir el programa usando punteros, me he limitado a cambiar el parámetro:
Código
  1. void HOTELES_inicializarHoteles(HOTELES *hotel)
El problema: todo parámetro declarado como un array en realidad se procesa como un puntero. Puedes hacer ese cambio pero solo es cosmético.

El error en esta sentencia:
Código
  1. *(hotel + i).numero_clientes = 0;
Se genera porque el operador "." tiene mayor prioridad que "*" y la expresion se evalúa así:
Código
  1. *((hotel + i).numero_clientes) = 0;
Para conseguir el efecto deseado se deben utilizar paréntesis (mejor, por sencillo, utilizar "[]").

Y como ya te comentaron es mas fácil ayudarte si publicas el código fuente del programa así como los mensajes de error que se generan.

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
NathanD

Desconectado Desconectado

Mensajes: 48


Ver Perfil
Re: Estructuras anidadas, funciones y punteros
« Respuesta #5 en: 17 Marzo 2013, 17:37 pm »

Muchas gracias a los dos :D Ya veo que era un error sintáctico, pensaba que había probado todas las formas...  ;D

Me ha surgido otra duda (siento ser tan pesado). ¿Cuál es la diferencia entre

Código
  1. (*(hotel + i)).numero_clientes = 0;

y


Código
  1. (hotel+i)->numero_clientes = 0;

? Ambas opciones me las da como válidas en la misma función, independientemente de haber usado calloc o no (¿y la diferencia entre inicializar con calloc y estáticamente como un array?).
En línea

avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: Estructuras anidadas, funciones y punteros
« Respuesta #6 en: 17 Marzo 2013, 23:30 pm »

Es que con el operador "->" lo que haces es acceder a un miembro ( variable ) de un puntero, y con el "." simplemente al miembro cuando no hay punteros de por medio... De ahí que cuando desreferencias con el "*" debas usar el "." . La diferencia de usar memoria dinámica ( calloc, malloc, realloc ... ) y memoria estática ( declaraciones de arrays etc ) la puedes leer aquí:

http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Manejo_din%C3%A1mico_de_memoria

¡Saludos!
En línea

Regístrate en
85

Desconectado Desconectado

Mensajes: 206



Ver Perfil WWW
Re: Estructuras anidadas, funciones y punteros
« Respuesta #7 en: 18 Marzo 2013, 03:30 am »

El problema: todo parámetro declarado como un array en realidad se procesa como un puntero. Puedes hacer ese cambio pero solo es cosmético.

El error en esta sentencia:
Código
  1. *(hotel + i).numero_clientes = 0;
Se genera porque el operador "." tiene mayor prioridad que "*" y la expresion se evalúa así:
Código
  1. *((hotel + i).numero_clientes) = 0;
Para conseguir el efecto deseado se deben utilizar paréntesis (mejor, por sencillo, utilizar "[]").

Y como ya te comentaron es mas fácil ayudarte si publicas el código fuente del programa así como los mensajes de error que se generan.

Un saludo


haber haber haber, veamos

Código
  1.  
  2. //
  3. // Yo no fui
  4. //
  5. //
  6. //
  7. //
  8.  
  9. /////////////////////////////////////////////////////////////////////////////////////////////////
  10.  
  11. #include<windows.h>// SYSTEM
  12. #include<stdio.h>
  13.  
  14. /////////////////////////////////////////////////////////////////////////////////////////////////
  15. /////////////////////////////////////////////////////////////////////////////////////////////////
  16.  
  17. struct Sasafras{
  18.  
  19. int mandan;
  20. };
  21.  
  22. struct Quete{
  23.  
  24. struct Sasafras quete;
  25. };
  26.  
  27. struct Cador{
  28.  
  29. struct Quete tazo;
  30. };
  31.  
  32. struct ElchoCador{
  33.  
  34. int x, y, z;
  35. struct Cador elcho;
  36. };
  37.  
  38. /////////////////////////////////////////////////////////////////////////////////////////////////
  39.  
  40. void Iniciar1(struct ElchoCador* reg);
  41. void Iniciar2(struct ElchoCador* reg);
  42.  
  43. /////////////////////////////////////////////////////////////////////////////////////////////////
  44.  
  45. int main(){
  46.  
  47. struct Cador elcho;
  48. memset(&elcho,0,sizeof elcho);
  49. printf("Valor: %d\n", elcho.tazo.quete.mandan);
  50.  
  51. __try
  52.       {
  53. //if(IsDebuggerPresent())
  54.                DebugBreak();
  55.       }
  56.        __except(GetExceptionCode() == EXCEPTION_BREAKPOINT ?
  57.             EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
  58.       {
  59.  
  60. system("pause");
  61.                // No debugger is attached, so return FALSE
  62.                // and continue.
  63.                // return FALSE;
  64.        }
  65.  
  66. struct ElchoCador regs[20];
  67. Iniciar1(regs);
  68. Iniciar2(regs);
  69. for(int j=0; j<20;j++){
  70. printf("%d %d %d\n",regs[j].x,regs[j].y,regs[j].z);
  71. }
  72.  
  73. while(getchar()!='\n');
  74. return 0;
  75. }
  76.  
  77. /////////////////////////////////////////////////////////////////////////////////////////////////
  78.  
  79. void Iniciar1(struct ElchoCador* regs){
  80.  
  81. for(int i=0; i<20;i++){
  82.  
  83. if(i%2==0)
  84. {
  85. (*(regs+i)).x = (*(regs+i)).y = (*(regs+i)).z = 2;
  86. }
  87. }
  88. }
  89.  
  90. /////////////////////////////////////////////////////////////////////////////////////////////////
  91.  
  92. void Iniciar2(struct ElchoCador* regs){
  93.  
  94. for(int i=0; i<20;i++){
  95.  
  96. if(i%2!=0)
  97. {
  98. //regs[i].x = regs[i].y = regs[i].z = 10;
  99. (regs+i)->x = (regs+i)->y = (regs+i)->z = 10;
  100. }
  101. }
  102. }
  103.  
  104. /////////////////////////////////////////////////////////////////////////////////////////////////
  105.  
  106.  

« Última modificación: 20 Abril 2013, 22:15 pm por 85 » En línea

Me cerraron el Windows Live Spaces, entonces me creé un WordPress XD
http://etkboyscout.wordpress.com/
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Estructuras anidadas, funciones y punteros
« Respuesta #8 en: 18 Marzo 2013, 04:53 am »

haber haber haber, veamos

...
No te entendi. ¿Por favor puedes explicar a que te refieres con eso?

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
85

Desconectado Desconectado

Mensajes: 206



Ver Perfil WWW
Re: Estructuras anidadas, funciones y punteros
« Respuesta #9 en: 18 Marzo 2013, 08:56 am »

a lo de acceder a los campos de la estructura con esas 2 funciones que se llaman Iniciar1 i Iniciar2  ::)

En línea

Me cerraron el Windows Live Spaces, entonces me creé un WordPress XD
http://etkboyscout.wordpress.com/
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 6,297 Último mensaje 13 Octubre 2010, 15:05 pm
por Karman
Ayuda con borrado en estructuras anidadas
Programación C/C++
JHodges 8 3,768 Último mensaje 11 Junio 2015, 04:24 am
por rir3760
[Ayuda] Estructuras anidadas, registro. Lenguaje C « 1 2 »
Programación C/C++
neron991 11 10,282 Último mensaje 9 Julio 2015, 10:07 am
por mester
Estructuras anidadas en lenguaje C. -
Programación C/C++
NOB2014 3 4,383 Último mensaje 5 Febrero 2017, 18:42 pm
por ivancea96
Problema con realloc funciones y punteros a estructuras [RESUELTO]
Programación C/C++
Xargam 8 4,465 Último mensaje 3 Junio 2018, 21:36 pm
por Xargam
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines