Ayuda con error en c++ , return raro

Iniciado por strancok, 18 Julio 2019, 09:22 AM

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

strancok

Hola a todos, quisiera que me colaboraran para poder encontrar mi error al ejecutar este codigo. Al compilarlo no muestra errores ni advertencias y de hecho funciona bien cuando defino la variable cantidadClientes = 2, con ese valor realiza exactamente lo que deseo que haga, pero con un valor de 1 (aqui falla al ingresar el primer nombre) o 3 (aqui falla al ingresar el tercer nombre), sencillamente no me deja ingresar el nombre del cliente y se sale del codigo arrojando return value 3221225477 y no return 0 como se indica.

Adicional, tambien observe que sale este mensaje al depurar el codigo, Program received signal SIGSEGV segmentation fault.

Soy algo principiante con este lenguaje, espero me puedan colaborar. De antemano gracias por su atencion.

Codigo


#include <iostream>
#include <string>

using namespace std;


int main()
{
int cantidadClientes;

cout << "Cantidad de clientes: ";
cin >> cantidadClientes;

string cliente[cantidadClientes];
int cantidadArticulos[cantidadClientes];
double precioUnitario, subtotal[cantidadClientes], total;

for (int i = 1; i <= cantidadClientes; i++)
{
cout << "Nombre del cliente #"<< i << ": ";
cin >> cliente[i];

cout << "Cantidad de articulos comprados: ";
cin >> cantidadArticulos[i];

for (int j = 1; j<= cantidadArticulos[i]; j++)
{
cout << "Precio unitario del articulo #" << j << " $";
cin >> precioUnitario;
cout << endl;

subtotal[i] = subtotal[i] + precioUnitario;
}

total = total + subtotal[i];
}

for (int k = 1; k <= cantidadClientes; k++)
{
//total = total + subtotal;
cout << "Nombre   " << cliente[k] << " Cantidad Articulos:   " << cantidadArticulos[k] << "  Total Cliente:   " << subtotal[k] << endl;

}

cout << "Total:   " << total;

return 0;
}





Esto es lo que se supone deberia hacer pero solo funciona cuando el numero de clientes es 2, 4 y asi... no se el porque ---->


Eternal Idol

Los elementos de un array estan numerados de 0 en adelante, ejemplo:

int an_arr[3];
an_arr[0] = 1;
an_arr[1] = 2;
an_arr[2] = 3;
an_arr[3] = 4; // Mal, estamos accediendo a memoria que no pertenece al array.


PD. Presta atencion a los warnings:
warning C4700: uninitialized local variable 'total' used
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

strancok

Cita de: Eternal Idol en 18 Julio 2019, 16:40 PM
Los elementos de un array estan numerados de 0 en adelante, ejemplo:

int an_arr[3];
an_arr[0] = 1;
an_arr[1] = 2;
an_arr[2] = 3;
an_arr[3] = 4; // Mal, estamos accediendo a memoria que no pertenece al array.


PD. Presta atencion a los warnings:
warning C4700: uninitialized local variable 'total' used

No me sale ningun warning almenos con este compilador, editare y adjuntare imagenes de lo que sale tanto cuando compilo como cuando ejecuto el codigo

Eternal Idol

Cita de: strancok en 18 Julio 2019, 18:35 PM
No me sale ningun warning almenos con este compilador, editare y adjuntare imagenes de lo que sale tanto cuando compilo como cuando ejecuto el codigo

Punto para el VC++ que si lo hace, la variable total tiene un valor indeterminado (deberias inicializarlo a cero) cuando la usas.

El problema principal es que accedes mal a los arrays como te comente antes, ejemplo si cantidadClientes es 3:

Código (c++) [Seleccionar]
for (int i = 1; i <= cantidadClientes; i++)
{
cin >> cliente[i];
...


Tu codigo accedera a cliente[1], cliente[2] y cliente[3].
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

@XSStringManolo

No uses devcpp no te lo recomiendo. La interfaz es muy clara pero te va a dar problemas una y otra vez. Usa codeblocks. Si no te gusta la interfaz usa el notepadc++ para escribir código y copias y pegas.

strancok

#5
CitarPunto para el VC++ que si lo hace, la variable total tiene un valor indeterminado (deberias inicializarlo a cero) cuando la usas.

El problema principal es que accedes mal a los arrays como te comente antes, ejemplo si cantidadClientes es 3:

Código (c++) [Seleccionar]
for (int i = 1; i <= cantidadClientes; i++)
{
cin >> cliente[i];
...


Tu codigo accedera a cliente[1], cliente[2] y cliente[3].

Entiendo, entonces el valor correcto para entrar al array, en caso de ser 3 clientes deberia ser con i < cantidadClientes ?? para que pase por las posiciones 0 = 1 , 1 = 2 y 2 = 3 ??

y seguire el consejo de cambiar de compilador, solamente instale ese porque era el de turno para utilizar

MAFUS

Piénsalo de esta forma, de hecho es así como funciona:

Un array es un conjunto de elementos del mismo tipo puestos uno detrás de otro en la memoria.

El identificador de un array, su nombre, te devuelve su posición de memoria de inicio (apunta al primero elemento). Supongamos que hemos llamado a un array mi_array:
Siendo que mi_array tiene una dirección de inicio, supongamos, que es la 100 entonces el primer elemento empieza en 100. Siendo así 100+0 es la dirección del primer elemento o, en notación de arrays, mi_array[0] es la dirección del primer elemento.

Si nos vamos a la siguiente posición de memoria encontraremos el segundo elemento: 100+1 será el segundo elemento, lo que en notación de arrays sería mi_array[1].

Ahora supongamos que el array es de tres elementos. Hasta ahora hemos accedido a los dos primeros. Para acceder al tercer elemento, y siguiendo con el planteamiento anterior, se encontraría en la posición 100+2, o lo que es lo mismo en notación de arrays mi_array[2].

Y es por esto que los arrays empiezan con el índice 0 y terminan con un índice una unidad menos que su número de elementos.

strancok

Listo, tenian toda y la entera razon, estaba utilizando mal los arrays, ya les entendi y corregi mi error y ahora funciona tal y como deberia. Les agradezco mucho la ayuda.

asi quedo el for para lo que necesitaba


for (int i = 0; i < cantidadClientes; i++)
{
           .
           .
           .


y ya inicialice la variable total en 0 tambien. Si tienen alguna otra sugerencia seria de gran ayuda.

@XSStringManolo

Un string es un array de varios char. Un vector son varios array.
La ventaja del vector sobre el array es que es dinámico, es decir, su tamaño se cambia automáticamente, por lo que no necesitas indicarlo tú. Esto lo hace utilizando varios arrays. Cuando un array se rellena y necesitas guardar algo más, el vector crea automáticamente un nuevo array con el doble de tamaño, copia y pega el contenido que tenías en el array que estaba lleno sobre el nuevo array y añade también el nuevo contenido.
El resultado de esto es que todos los elementos del vector están contiguos en memoria. Como resultado de esta implementación un vector al final no deja de ser un array. A parte, string y vector forman parte de los contenedores de la STL Standart Template Library. Prácticamente todos los contenedores que forman parte de la biblioteca de plantillas estandar, puede usar los mísmos métodos fácilmente con el operador punto.
.size(), .append(), etc.

El libro apress learn c++ for game development da un buen repaso y teoría a este tipo de cosas.