(Ayuda) Array de strings.

Iniciado por S++, 10 Junio 2015, 19:16 PM

0 Miembros y 1 Visitante están viendo este tema.

S++

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?

ivancea96

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.

S++

#2
Hola, gracias por los consejos.
Cambié el código:
Código (cpp) [Seleccionar]
#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.

engel lex

deben ser constantes si lo declaras de esa forma, si no, debes usar "new"

Código (cpp) [Seleccionar]
string *L= new string[l];
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

rir3760

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:
Código (cpp) [Seleccionar]
*L++
Debido a la prioridad de los operadores se evaluá así:
Código (cpp) [Seleccionar]
*(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
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