Dev - C++ - Error a media ejecución

 
Vista:
sin imagen de perfil
Val: 3
Ha disminuido su posición en 6 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Error a media ejecución

Publicado por Oriol (2 intervenciones) el 26/06/2019 16:59:06
Buenas tardes,

Estoy empezando en la programación y me he encontrado con un problema. En un curso hicimos un programa que genera números al azar sin que se repitan (trabajo en subvenciones y adapté el programa para que sirviera en mi trabajo, por eso veréis cosas de subvenciones en el código).

La sorpresa fue cuando quise ejecutar el programa en mi casa (windows 8.1) y el programa se me cierra en medio de la ejecución. Os dejo el código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <vector>
 
using namespace std;
int main(int argc, char** argv) {
 
	int total;
	int a_revisar;
	int i;
	vector<int> v;
	vector<int> v_aux;
	int random_number;
 
 
cout<<"Escribe el numero de trabajadores presentados a subvencion"<<endl;
cin>>total;
 
a_revisar = total/10;
 
cout<<"Tienes que revisar los siguientes "<<a_revisar<<" casos"<<endl;
 
srand(time(NULL));
 
for(i=0; i<a_revisar; i++){
 
	random_number = rand()%total+1;
 
	if(v_aux[random_number] != 1){
 
		v_aux.push_back(random_number);
 
		v_aux[random_number] = 1;
 
		v.push_back(random_number);
 
	}else{
		i--;
	}
}
 
 
for(i=0; i<a_revisar; i++){
 
	cout<<v<<endl;
}
 
	return 0;
}

El código compila correctamente y al ejecutarse, me sale el cout de cuantos trabajadores presento, hago el cin del número, me dice que tengo que revisar X trabajadores y justo después me salta un error que dice:

[i]Proyecto1.exe dejó de funcionar
El programa dejó de funcionar correctamente por un problema. Windows cerrará el programa y le notificará si existe alguna solución.


Es raro porque todos los demás programas que traje del curso sí que me funcionan, algunos con las cuatro mismas librerías que este.

Si alguien me puede ayudar, se lo agradeceré.

Saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alfil
Val: 4.344
Oro
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Error a media ejecución

Publicado por Alfil (1444 intervenciones) el 26/06/2019 21:12:08
El programa falla por que en los bucles trata de acceder a posiciones del vector que no están definidas o no existen.

Para poder ayudarte sería necesario conocer la lógica o propósito del programa, algo así como un enunciado bien explicado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 3
Ha disminuido su posición en 6 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Error a media ejecución

Publicado por Oriol (2 intervenciones) el 27/06/2019 16:22:22
Te cuento. En mi trabajo, presentamos muchos trabajadores a una subvención. Es imposible repasar la documentación de todos y cada uno de ellos, porque suelen ser unos 1.500. Entonces, se me pide que repase la documentación de un 10% de los trabajadores totales que presentaré a subvención. Por eso quiero que me saque total/10 números al azar y que estos no se repitan.

He intentado solventar lo que me decías de que le pedía al programa que buscara en posiciones que no existían, pero me sigue ocurriendo lo mismo.... he provado decirle que pusiera 0 en todas las posiciones de v_aux de este manera:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <vector>
 
using namespace std;
int main(int argc, char** argv) {
 
	int total;
	int a_revisar;
	int i;
	vector<int> v;
	vector<int> v_aux;
	int random_number;
 
 
cout<<"Escribe el numero de trabajadores presentados a subvencion"<<endl;
cin>>total;
 
a_revisar = total/10;
 
cout<<"Tienes que revisar los siguientes "<<a_revisar<<" casos"<<endl;
 
srand(time(NULL));
 
for(i=0; i<total; i++){
 
	v_aux[i]=0;
 
}
 
for(i=0; i<a_revisar; i++){
 
	random_number = rand()%total+1;
 
	if(v_aux[random_number] != 1){
 
		v_aux.push_back(random_number);
 
		v_aux[random_number] = 1;
 
		v.push_back(random_number);
 
	}else{
		i--;
	}
}
 
 
for(i=0; i<a_revisar; i++){
 
	cout<<v[i]<<endl;
	}
 
	return 0;
}

Muchas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Alfil
Val: 4.344
Oro
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Error a media ejecución

Publicado por Alfil (1444 intervenciones) el 27/06/2019 16:34:31
El programa tal cual lo has planteado no tiene ningún sentido. Lo primero que debes decidir es que tipo de información (resultado) quieres obtener, ¿150 números (el 10% de 1500) del 1 al 1500 sin que se repitan?.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Error a media ejecución

Publicado por Tom (65 intervenciones) el 27/06/2019 18:18:10
La primera vez que haces:

if(v_aux[random_number] != 1){

v_aux no tiene ningún tamaño asignado, por tanto random_number puede estar fuera de rango.

Según la doc del operador [] que deberías haber leído antes de empezar a escribir código a lo loco:

http://www.cplusplus.com/reference/vector/vector/operator[]/

"Portable programs should never call this function with an argument n that is out of range, since this causes undefined behavior."
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar