2

Se trata de lo siguiente: "Deberán realizar un programa con estructuras y punteros de una biblioteca que almacene n libros con datos de: título del libro, nombre del autor, número de hojas, costo, editorial, genero literario."

Mi idea para hacer el programa era que al ingresar el usuario una cantidad, se creara esa cantidad de arreglos y el ciclo for guardaría todos los datos en los distintos arreglos. Sin embargo, me quedé estancado con un error de compilación.

#include <iostream>

using namespace std;

struct biblio {
  char TL[30];
  char NA[40];
  int NH;
  float CS;
  char ED[30];
  char GL[20];
};

int main (int argc,char*argv[]) {
  int cl,clS;

  cout<<"Ingrese la cantidad de libros que desea ingresar: ";
  cin>>cl;
  clS=cl-1;

  // EL ERROR ESTA EN LA SIGUIENTE LINEA
  struct biblio bi[clS],*p_bi[clS]=&bi; // <-- ERROR

  for(int i=1; i<=cl; i++) {
    cout<<"Ingrese el titulo del libro: ";
    cin.getline(p_bi[i-1]->TL,30);
    cout<<"Ingrese el nombre del autor: ";
    cin.getline(p_bi[i-1]->NA,40); 
    cout<<"Ingrese el numero de hojas: ";
    cin>>p_bi[i-1]->NH;
    cout<<"Ingrese el costo: $";
    cin>p_bi[i-1]->CS;
    cout<<"Ingrese el nombre de la editorial: ";
    cin.getline(p_bi[i-1]->ED,30);
    cout<<"Ingrese el genero literario: ";
    cin.getline(p_bi[i-1]->GL,20);
  }
}
Trauma
  • 25,297
  • 4
  • 37
  • 60
Emma Hdez
  • 21
  • 1
  • 2
  • ¿ Que error de compilación ? ¿ En qué línea ? Datos **exactos**, por favor :-) – Trauma Apr 23 '20 at 06:27
  • El error de compilación es el siguiente: [Error] array must be initialized with a brace-enclosed initializer Linea 21 – Emma Hdez Apr 23 '20 at 06:36
  • ¿ `struct biblio bi[clS],*p_bi[clS]=&bi;` ? – Trauma Apr 23 '20 at 06:43
  • Exacto, ahí se encuentra el error, mi idea para hacer el programa era que al ingresar el usuario una cantidad, se "creara" esa cantidad de arreglos y el ciclo for guardaría todos los datos en los distintos arreglos. En un principio creí que podía, conforme avancé en la creación del código me di cuenta que la había liado. – Emma Hdez Apr 23 '20 at 06:46

1 Answers1

3

El error es claro y conciso, puede que no lo entiendas por estar en inglés; te lo traduzco:

ERROR: array must be initialized with a brace-enclosed initializer

ERROR: las formaciones 1 deben inicializarse con un inicializador entre llaves.

El error viene a decir que esto no es válido:

tipo formacion[tamaño] = expresión_convertible_a_tipo;

Pero que esto sí lo es:

tipo formación[tamaño] = { expresión_convertible_a_tipo };

Pero este es el menor de tus problemas. tu código presenta errores de concepto y diseño:

  • En se suele usar std::string para guardar cadenas de texto, es mucho más flexible y seguro que usar formaciones1 de caracteres:

    struct biblio {
      std::string TL;
      std::string NA;
      int NH;
      float CS;
      std::string ED;
      std::string GL;
    };
    
  • Debes usar nombres autoexplicativos, los nombres de dos letras no ayudan a saber cuál es la misión de una variable; si redactas los nombres de manera que se sepa lo que es la variable tus compañeros de trabajo y tu yo del futuro te lo agradecerá.

    struct libro { // <--- Esta estructura es un libro, no una biblioteca.
      std::string titulo;
      std::string autor;
      int hojas;
      float precio;
      std::string editorial;
      std::string genero;
    };
    
  • En C++ las estructuras (struct) son tipos fundamentales, no necesitas preceder la palabra clave para declarar una estructura.

    /* struct */biblio bi[clS],*p_bi[clS]=&bi;
    // ^^^^^^ <--- Innecesario.
    
  • En C++2 el tamaño de las formaciones1 debe ser conocido en tiempo de compilación (a no ser que creen con new), por lo que no puedes usar una variable para definir el tamaño lee estos hilos para saber más. Te será más fácil un std::vector para tu biblioteca:

    int cantidad;
    cout << "Ingrese la cantidad de libros que desea ingresar: ";
    cin >> cantidad;
    
    std::vector<libro> biblioteca(cantidad);
    
  • Puedes olvidarte de los índices en el bucle for si usas su variante de rango:

    for (auto &libro : libros) {
      cout << "Ingrese el titulo del libro: ";
      cin.getline(libro.titulo);
    
      cout << "Ingrese el nombre del autor: ";
      cin.getline(libro.autor); 
    
      cout << "Ingrese el numero de hojas: ";
      cin >> libro.hojas;
    
      cout << "Ingrese el costo: $";
      cin >> libro.precio;
    
      cout << "Ingrese el nombre de la editorial: ";
      cin.getline(libro.editorial);
    
      cout << "Ingrese el genero literario: ";
      cin.getline(libro.genero);
    }
    
  • La función main debe devolver un valor, lee este hilo para saber más.


1También conocidas como arreglos o en inglés arrays.

2Y en otros lenguajes compilados como .

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82