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

[SOLUCIONADO] Problemita con los struc

Estas en el tema de Problemita con los struc en el foro de C/C++ en Foros del Web. @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C: Ver original #include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> #define MAXLIBROS 200 #define MAXCAD 256   typedef char cadena [ ...
  #1 (permalink)  
Antiguo 14/03/2016, 14:37
 
Fecha de Ingreso: enero-2014
Mensajes: 16
Antigüedad: 10 años, 3 meses
Puntos: 0
Pregunta Problemita con los struc

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <conio.h>
  5. #define MAXLIBROS 200
  6. #define MAXCAD 256
  7.  
  8. typedef char cadena[MAXCAD];
  9. typedef struct {
  10.     int codigo;
  11.     cadena nombre;
  12. }libro;
  13. //typedef libro lislibro[MAXLIBROS];
  14. //----------------------------------------------------------------
  15. // MAIN
  16. int main(int argc, char *argv[]) {
  17.     libro lib[MAXLIBROS];  
  18.     lib[0] = listar();
  19.     //lislibro libs = listar();
  20. return 0;}
  21.  
  22. //- listar libros
  23. //lislibro listar(){
  24. libro listar(){
  25.     lislibro ll;
  26.     libro l;
  27.     //lib = listar();
  28.     int i;
  29.     //for(i=0; i<5; i++){
  30.         l.codigo = i;
  31.         strcpy(l.nombre,"nombre");
  32.       //  ll[i] = l;   
  33.     //}
  34.     printf("%d", l.codigo);
  35. //return l;
  36. return ll;  
  37. }

queria que la funcion retorne un struct, pero no se como se hace ello.
estoy recien aprendiendo C
  #2 (permalink)  
Antiguo 14/03/2016, 15:08
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Problemita con los struc

Da la sensación de que ya lo tenías y por algún lado te has equivocado y has empezado a liarte sólo

Es casi como lo tenías, lo que pasa es que has de declarar (o declarar e implementar) primero la función listar().

Por otro lado, en la función ha aparecido un objeto o struct del tipo "lislibro" que luego es el que pretendes retornar, pero ese struct no está definido.
En resumen, que casi lo tenías.
Te pongo el ejemplo tuyo corregido:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define MAXLIBROS 200
  5. #define MAXCAD 256
  6.  
  7. typedef char cadena[MAXCAD];
  8. typedef struct
  9. {
  10.     int codigo;
  11.     cadena nombre;
  12. } libro;
  13.  
  14. libro listar();
  15.  
  16. int main(int argc, char *argv[])
  17. {
  18.     libro lib[MAXLIBROS];
  19.     lib[0] = listar();
  20.     printf("%d", lib[0].codigo);
  21.     printf("\n");
  22.     printf("%s", lib[0].nombre);
  23.     return 0;
  24. }
  25.  
  26.  
  27. libro listar()
  28. {
  29.     libro l;
  30.     int i=100;
  31.     l.codigo = i;
  32.     strcpy(l.nombre,"nombre");
  33.     return l;
  34. }
__________________
Mi calculadora en Qt
  #3 (permalink)  
Antiguo 15/03/2016, 04:06
 
Fecha de Ingreso: enero-2014
Mensajes: 16
Antigüedad: 10 años, 3 meses
Puntos: 0
Respuesta: Problemita con los struc

Cita:
Iniciado por dehm Ver Mensaje

... lo que pasa es que has de declarar (o declarar e implementar) primero la función listar().

Código C:
Ver original
  1. libro listar();
esto no lo sabia.
  #4 (permalink)  
Antiguo 15/03/2016, 04:40
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Problemita con los struc

Cita:
Iniciado por slcna Ver Mensaje
esto no lo sabia.
Tu piensa que el compilador trabaja SIEMPRE hacia adelante. Si en un punto se encuentra algo (una llamada a una función o un tipo de dato) y llegados a ese punto el compilador no sabe nada sobre ese elemento en vez de complicarse la vida te va a arrojar un error y se queda tan tranquilo.

Por otro lado, si tu modificas un archivo cualquiera de código el compilador tendrá que recompilar el código de dicho archivo y, además, todos los archivos de código que hagan referencia al archivo modificado (es como funciona).

Por estos dos motivos fue por el que históricamente existen los archivos de cabecera. En los archivos de cabecera no se suele encontrar código sino únicamente declaraciones de tipos y de funciones. Cuando tu pones un include al principio de un archivo de código estás añadiendo todas las declaraciones de dicho archivo a tu código por lo que el compilador al encontrarse con una función de dicha cabecera sabrá gestionarla correctamente.

Claro está no es obligatorio que todas las funciones y tipos usados en un fichero de código estén en la cabecera. Si una función o un tipo únicamente se va a usar dentro de ese fichero se puede omitir de la cabecera... en este caso para poder hacer uso de dicho elemento tienes que incluirlo de alguna forma antes de su primer uso y esto se puede hacer de dos formas:

  • Implementando el elemento antes del primer uso
    Código C:
    Ver original
    1. int func()
    2. { return 3; }
    3.  
    4. int main()
    5. {
    6.   printf("%d",func());
    7. }
  • Declarando el elemento antes del primero uso. La implementación puede ir ya en cualquier parte del archivo.
    Código C:
    Ver original
    1. int func();
    2.  
    3. int main()
    4. {
    5.   printf("%d",func());
    6. }
    7.  
    8. int func()
    9. { return 3; }

Con las estructuras pasa algo similar, sin embargo en este caso el uso de las declaración en vez de la implementación tiene implicaciones adicionales así que para no liarte por el momento acostúmbrate a dejar las estructuras al principio del archivo y así evitas problemas.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #5 (permalink)  
Antiguo 16/03/2016, 14:37
 
Fecha de Ingreso: enero-2014
Mensajes: 16
Antigüedad: 10 años, 3 meses
Puntos: 0
Pregunta Respuesta: Problemita con los struc

Cita:
si verdad que tonto.
Otra consulta con respecto al codigo es que lo que deseo hacer esto:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <conio.h>
  5. #define MAXLIBROS 200
  6. #define MAXCAD 256
  7.  
  8. typedef char cadena[MAXCAD];
  9. typedef struct {
  10.     int codigo;
  11.     cadena nombre;
  12. }libro;
  13. // CREO UN ARRAY DEL STRUCT LIBRO
  14. typedef libro lislibro[MAXLIBROS];
  15.  
  16. lislibro listar();
  17.  
  18. // MAIN
  19. int main(int argc, char *argv[]) {
  20.     lislibro libs = listar(); // OBTENGO EL ARRAY LISLIBROS DE STRUCT
  21.    
  22. // MUESTRO LA INFORMACION
  23.    printf("%d",libs[0].codigo);
  24.  
  25. return 0;}
  26.  
  27. //- listar libros
  28. lislibro listar(){
  29.     lislibro ll; // CREA LA VARIABLE ll QUE ES UN ARRAY DEL STRUCT
  30.     libro l;
  31.     int i;
  32.     // RELLENA EL ARRAY DESDE EL STRUCT LIBRO
  33.     for(i=0; i<5; i++){
  34.         l.codigo = i;
  35.         strcpy(l.nombre,"nombre");
  36.       ll[i] = l;    
  37.     }
  38.  
  39. // RETORNO EL ARRAY DE STRUCT
  40. return ll;  
  41. }

Me estoy basando en tu respuesta, pero la verdad no lo veo
me da error siempre
  #6 (permalink)  
Antiguo 17/03/2016, 01:46
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Problemita con los struc

Una limitación del lenguaje C es que no puede devolver arrays que provienen de la pila (Espero que llegados a este punto sepas la diferencia entre memoria dinámica y pila).

El lenguaje C nació (a grandes rasgos) como una mera traducción del lenguaje ensamblador para poder usarlo con un nivel de abstracción mayor. Esto implica que dicho lenguaje suele adolecer de algunos comportamientos extraños y este es uno de ellos.

Para solventar tu problema tienes dos opciones:
  • Usas memoria dinámica para devolver la lista de elementos (que por otro lado sería más eficiente que la solución que intentas aplicar)
    Código C:
    Ver original
    1. lislibro *ptr = (lislibro*)malloc(sizeof(lislibro));
    2. // rellenas ptr teniendo en cuenta que es un puntero a un array
    3. // (*ptr)[x] = y; <<--- Se puede usar así
    4.  
    5. // ...
    6. // y antes de salir del programa hay que liberar la memoria
    7. free(ptr);
  • En vez de usar el return, que la función reciba una lista sin inicializar como parámetro y se encargue de rellenarla.
    Código C:
    Ver original
    1. void listar(lislibro);
    2.  
    3. int main(int argc, char *argv[]) {
    4.   lislibro libs;
    5.   listar(libs); // OBTENGO EL ARRAY LISLIBROS DE STRUCT
    6.  
    7.   // ...
    8. }
    9.  
    10. void listar(lislibro ll) {
    11.   // lislibro ll; <<--- Ya no hace falta
    12.  
    13.   // ...
    14.  
    15.   // return ll; <<--- esto tampoco
    16. }

Un saludo
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.

Etiquetas: cadena, char, funcion, int, problemita, string
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 06:10.