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

[SOLUCIONADO] Estructura con dimensión variable en C

Estas en el tema de Estructura con dimensión variable en C en el foro de C/C++ en Foros del Web. Como podria hacer que una estructura contenga una cantidad variable de datos (línea 33); porque no se puede usar char[2] en una estructura ( línea ...
  #1 (permalink)  
Antiguo 15/05/2013, 15:49
 
Fecha de Ingreso: julio-2011
Mensajes: 62
Antigüedad: 12 años, 9 meses
Puntos: 0
Pregunta Estructura con dimensión variable en C

Como podria hacer que una estructura contenga una cantidad variable de datos (línea 33); porque no se puede usar char[2] en una estructura ( línea 16); al usar printf("%c\n", nudo1.nombre) imprime un caracter extraño y si uso printf("%s\n", nudo1.arriba.nombre) el ejecutable se cuelga.


Código c:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. // Pórtico con 5 nudos y 4 elementos
  5. //
  6. //         BC     CB   CE   EC
  7. //       B --------- C ------ E
  8. //       | BA     CD |
  9. //       |           |
  10. //       |           |
  11. //       |           |
  12. //       | AB     DC |
  13. //       A           D
  14.  
  15. struct elemento{
  16.        char nombre; //char[2] nombre;
  17.        double fem;
  18.        double df;
  19. };
  20.  
  21. struct nudo{
  22.        char nombre;
  23.        struct elemento arriba;
  24.        struct elemento abajo;
  25.        struct elemento izquierda;
  26.        struct elemento derecha;
  27. };
  28.  
  29. int main()
  30. {
  31.     struct elemento barra2;
  32.     struct nudo nudo1;
  33.     struct nudo nudos[5]; //struct nudo nudos[scanf("%d", &numero)];
  34.    
  35.     barra2.nombre = "BC";
  36.     barra2.fem = -17.5;
  37.     barra2.df = 0.47;
  38.    
  39.     nudo1.nombre = "A";
  40.     nudo1.arriba.nombre = "AB";
  41.     nudo1.arriba.fem = 20.5;
  42.     nudo1.arriba.df = 0.27;
  43.    
  44.     printf("%c\n", barra2.nombre);
  45.     printf("%4.2f\n", barra2.fem);
  46.     printf("%4.2f\n", barra2.df);
  47.    
  48.     printf("\n");
  49.    
  50.     printf("%c\n", nudo1.nombre);
  51.     printf("%c\n", nudo1.arriba.nombre);
  52.     printf("%4.2f\n", nudo1.arriba.fem);
  53.     printf("%4.2f\n", nudo1.arriba.df);
  54.  
  55.     system("PAUSE");   
  56.     return 0;
  57. }

Última edición por Bael_Balzac; 15/05/2013 a las 16:08
  #2 (permalink)  
Antiguo 15/05/2013, 16:42
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 3 meses
Puntos: 35
Respuesta: Estructura con dimensión variable en C

Que es exactamente lo que querés hacer con "char[2]". Supongo que querrás que elemento.nombre sea un array con dos índices, que contienen cadenas.

Código C:
Ver original
  1. char nombre[2][10] = {"Nombre", "Apellido"};
  2. printf("%s, %s", nombre[1], nombre[0]);

Con respecto a la línea 33, scanf retorna el número de datos de entrada asignados.

  #3 (permalink)  
Antiguo 15/05/2013, 16:44
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 11 años, 9 meses
Puntos: 28
Respuesta: Estructura con dimensión variable en C

Creo que es evidente que no puedes guardar una cadena de caracteres en una unica variable char (hasta ahí llegamos).

Ahora bien, has declarado char nombre[2]; puedes pensar que con eso puedes guardar 2 letras. Falso, solo puedes disponer de 1 letra. Cuanto tu realizas la siguiente asignación:

Código C:
Ver original
  1. char nombre[] = "Texto de ejemplo";

C automáticamente añade un elemento "adicional" al final. Se le conoce como el caracter nulo '\0'

El caracter nulo sirve para determinar el final de la cadena, una cadena sin '\0' al final no puede mostrarse puesto que el programa seguiría mostrando hasta el infinito.

Volviendo pues al ejemplo anterior:

Código C:
Ver original
  1. char Nombre[2] = "ab";

Estás dejando sin espacio para el caracter nulo. Las consecuencias son imprebisibles. Hay dos maneras fáciles de solucionarlo:

- Hacer el array más grande (char Nombre[256];)
- Cambiar el array por puntero (char* Nombre). Este metodo tiene el problema de que no puedes modificar los datos una vez asignados.
  #4 (permalink)  
Antiguo 15/05/2013, 16:53
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Estructura con dimensión variable en C

Solamente pon suficiente espacio en los arreglos.

Recuerda char arreglo[10] puede contener hasta 9 caracteres imprimibles por que necesitas dejar uno para indicar el fin de la cadena.


Código C++:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. // Pórtico con 5 nudos y 4 elementos
  6. //
  7. //         BC     CB   CE   EC
  8. //       B --------- C ------ E
  9. //       | BA     CD |
  10. //       |           |
  11. //       |           |
  12. //       |           |
  13. //       | AB     DC |
  14. //       A           D
  15.  
  16. struct elemento{
  17.        char nombre[5];
  18.        double fem;
  19.        double df;
  20. };
  21.  
  22. struct nudo{
  23.        char nombre[5];
  24.        struct elemento arriba;
  25.        struct elemento abajo;
  26.        struct elemento izquierda;
  27.        struct elemento derecha;
  28. };
  29.  
  30. int main()
  31. {
  32.     struct elemento barra2;
  33.     struct nudo nudo1;
  34.     struct nudo nudos[5]; //struct nudo nudos[scanf("%d", &numero)];
  35.    
  36.     strcpy(barra2.nombre, "BC");
  37.     barra2.fem = -17.5;
  38.     barra2.df = 0.47;
  39.    
  40.     strcpy(nudo1.nombre, "A");
  41.     strcpy(nudo1.arriba.nombre, "AB");
  42.     nudo1.arriba.fem = 20.5;
  43.     nudo1.arriba.df = 0.27;
  44.    
  45.     printf("%s\n", barra2.nombre);
  46.     printf("%4.2f\n", barra2.fem);
  47.     printf("%4.2f\n", barra2.df);
  48.    
  49.     printf("\n");
  50.    
  51.     printf("%s\n", nudo1.nombre);
  52.     printf("%s\n", nudo1.arriba.nombre);
  53.     printf("%4.2f\n", nudo1.arriba.fem);
  54.     printf("%4.2f\n", nudo1.arriba.df);
  55.  
  56.     return 0;
  57. }
Tu ejemplo funcional.
  #5 (permalink)  
Antiguo 16/05/2013, 07:51
 
Fecha de Ingreso: julio-2011
Mensajes: 62
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Estructura con dimensión variable en C

Gracias por sus respuestas, usare char Nombre[2] o char Nombre[3] pero usar char Nombre[256] no lo hare debido a que la memoria es pequeña, estoy programando para una calculadora usando hpgcc3, ¿ es posible calcular el tamaño aproximado de un struct ? .
Y sobre struct nudo nudos[scanf("%d", &numero)]; es correcta esta declaración.

Última edición por Bael_Balzac; 16/05/2013 a las 07:58
  #6 (permalink)  
Antiguo 16/05/2013, 08:36
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 11 años, 9 meses
Puntos: 28
Respuesta: Estructura con dimensión variable en C

Cita:
Iniciado por Bael_Balzac Ver Mensaje
Gracias por sus respuestas, usare char Nombre[2] o char Nombre[3]
Usar char Nombre[2] no tiene sentido!. Solo podrás almacenar un caracter y para eso es suficiente con un char.

Cita:
Iniciado por Bael_Balzac Ver Mensaje
¿ es posible calcular el tamaño aproximado de un struct ? .
sizeof(struct nodo);

Cita:
Iniciado por Bael_Balzac Ver Mensaje
Y sobre struct nudo nudos[scanf("%d", &numero)]; es correcta esta declaración.
No es correcto, scanf devuelve el número de argumentos leídos, no el valor leído (este se pasa por la referencia).
  #7 (permalink)  
Antiguo 16/05/2013, 11:15
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 3 meses
Puntos: 35
Respuesta: Estructura con dimensión variable en C

Si no sabes el tamaño que puede llegar a tener la cadena, podes usar malloc() y realloc().

Etiquetas: estructura, int, struct, variable
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 14:20.