Hola, estoy empezando en la programación y quise ejecutar el siguiente código:
Citar1. #include <iostream>
2. #include <stdlib.h>
3. #include <string>
4. using namespace std;
5. void main()
6. {
7. bool apagado = false;
8. int l = 1;
9. int a = 1;
10. int *A = &a;
11. int *L = &l;
12. string libros[l];
13. string autores[a];
14. string entrada;
15. for (int *L = &l; apagado = false; *L++)
16. {
17. cout << "Ingrese un libro o ingrese " << "-1 " << "para finalizar el programa: ";
18. getline(cin, entrada);
19.
20. if (entrada == "-1")
21. {
22. apagado = true;
23. break;
24. }
25. else
26. {
27. libros[*L] = entrada;
28. }
29.
30. cout << endl << "Ingrese un autor: ";
31. string entradaAutor;
32. getline(cin, entradaAutor);
33. entradaAutor = autores[*A];
34. }
35. cout << endl << "Gracias por utilizar el programa." << endl << endl;
36. system("pause");
37.
38.}
El problema es que me marca error en las lineas 12 y 13.
Qué debería modificar para poder ejecutar el programa sin errores?
Cuando tengas un error, cópianoslo. Es más rápido.
A parte de ese error que comentas, que no sé qué podría ser, te comento algunas otras cosas:
Preferible que pongas int main, en vez de void main.
usas stdlib.h. Ya que estás usando C++, a las librerías .h estándar, basta que les quites el .h y les añadas una 'c' al inicio, para ser de C++. (cstdlib)
Ese for nunca va a hacer nada. La condición apagado=false es una asignación, estás asignándole a apagado el valor false. El operador para ver si ambas aprtes son iguales es ==, dos sígnos igual.
En ese for, estás accediendo a libros[*L], que es correcto. El problema es que el tamaño de libros[] es 1. Es un arreglo de 1 elemento. Cuando *L sea 2, puedes generar un error.
Hola, gracias por los consejos.
Cambié el código:
#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
int main()
{
int l = 1;
int a = 1;
int *L = &l;
int *A = &a;
string libros[l];
string autores[a];
string entrada;
int almacenar;
for (*L = 1;; *L++)
{
cout << "Ingrese un libro o ingrese " << "-1 " << "para finalizar el programa: ";
getline(cin, entrada);
if (entrada == "-1")
{
almacenar = l;
break;
}
else
{
libros[l] = entrada;
cout << endl << "Ingrese el autor del libro " << '"' << libros[l] << '"' << ": ";
getline(cin, entrada);
autores[a] = entrada;
*A++;
cout << endl;
}
}
for (*L = 1; l < almacenar; *L++)
{
cout << "El libro numero " << *L << " es: " << libros[l] << "." << endl;
cout << "Su autor es: " << autores[a] << "." << endl << endl;
}
system("pause");
return 0;
}
Acá está la lista de errores:
Error 1 error C2057: expected constant expression
Error 4 error C2057: expected constant expression
Error 6 error C2133: 'autores' : unknown size
Error 3 error C2133: 'libros' : unknown size
Error 2 error C2466: cannot allocate an array of constant size 0
Error 5 error C2466: cannot allocate an array of constant size 0
7 IntelliSense: expression must have a constant value
8 IntelliSense: expression must have a constant value
Por lo que entiendo, el problema es que en la linea 11 y 12, los valores de lo que está entre corchetes no son valores constantes, pero esa es la idea; que el usuario pueda agregar la cantidad de información que quiera y este mismo establezca un limite.
deben ser constantes si lo declaras de esa forma, si no, debes usar "new"
string *L= new string[l];
Otro error se encuentra en los indices para acceder a los arrays (si estos para empezar fueran los correctos) ya que en C y C++ el primer elemento de un array tiene el indice 0 y el ultimo N-1.
Parece ser un ejercicio para practicar con punteros ya que las variables "L" y "A" apuntan a "l" y "a" pero si el objetivo es incrementar estas ultimas (eso sugiere el ultimo bucle) el incremento esta mal ya que, por ejemplo:
*L++
Debido a la prioridad de los operadores se evaluá así:
*(L++)
Con ello el resultado de la expresión se descarta y se incrementa la dirección en memoria (el puntero).
Lo mejor por sencillo es rescribir el programa utilizando las clases vector y string.
Un saludo