2010-06-29 7 views
9

Duplicar posible:
Segmentation fault on large array sizescrear un gran matriz en C++

Hola a todos

Estoy tratando de crear una gran variedad en el VS 2010 utilizando C++.

Cuando trato de crear una matriz, como a continuación

int dp[4501][4501] 
or 
int dp[1000][1000] 

Se inició una excepción "desbordamiento de pila" Entonces cambio a:

int dp[100][100] 

todo está bien.

Entonces, si quiero crear una gran matriz como la anterior, ¿qué debo hacer?

Best Regards,

Respuesta

6

Póngalo en theheap.

+0

Excepto que no use directamente 'new' ni' malloc'. – GManNickG

+3

No hay nada explícitamente incorrecto con ellos, especialmente en el nivel de comprensión hacia dónde se dirige. –

+0

no hay nada explícito en ellos, pero "new int [4501] [4501]" está mal, que es lo que GMan quiso decir. –

5

Debe utilizar la asignación dinámica:

typedef std::vector<int> int_vector; 
int_vector dp(10000); 

Una matriz doble se puede simular matrices de anidación:

typedef std::vector<int_vector> int_double_vector; 
int_double_vector dp(4501, int_vector(4501)); 
+1

No me gusta typedef usado así. ¿Por qué? Simple: su 'int_array' es en realidad un * int * ** vector **, y su' int_double_array' no tiene nada que ver con ** ** ** ** ** **. (Además, tengo que hacer * dos * búsquedas para descubrir qué es en realidad.) Estilo malo, en mi humilde opinión. Utilice typedef's solo para cosas realmente complejas o crípticas, e incluso solo si sus declaraciones son frecuentes a lo largo de su código. (Iteradores para mapas de vectores de pares, o indicadores de función vienen a la mente.) Para declaraciones usadas dos o tres veces, son una herramienta de ofuscación. – DevSolar

+0

@Dev: Creo que estás leyendo demasiado. :) ¿Contento? El doble significa dos, y solo por coincidencia es el tipo de coma flotante de doble precisión llamado doble, no permita que se interponga en el camino de las definiciones en inglés. El código es para humanos – GManNickG

+1

La frase int_double_vector _really_ apesta. Deberías hacer algo como 2d_int_vector en su lugar. Aparte de eso, no hay ningún problema con typedef, es mejor que trabajar con std :: vector > :: iterator ... – ypnos

9

Uso asignación dinámica o la STL. Hubo un hilo reciente sobre una pregunta muy similar. Ver this.

1

Su pila se ha desbordado con demasiados bits. Debes drenarlos. Preferiblemente sobre un montón de otros bits. Sugiero/F67108864. La/F significa "F'ing infierno por qué es la pila tan pequeña en comparación con el montón?". El 67108863 es arbitrario.

+4

Necesitamos etiquetas para las respuestas. Etiquetas como * enfoque gracioso pero equivocado * –

0

Si desea evitar new[], o evitar el uso de std::vector, haga que la matriz sea global. Esto pondrá la matriz en el montón y el desbordamiento de la pila no ocurrirá.

+1

Por favor, no hay variables globales. En este caso, hay infinitamente mejores soluciones ('vector' no es la única clase de contenedor). – Philipp

+1

@Philipp: las variables globales son útiles en ciertas circunstancias. Y si coloca la variable global en el espacio de nombres (o crea un miembro global estático en una estructura o clase), entonces no hay absolutamente nada de malo en ellos. Otra solución es hacer variable (declarada dentro de la función) estática. – SigTerm

+0

Las variables globales generalmente causan más problemas de los que resuelven. Y definitivamente no son una solución si lo único que quieres es la asignación de heap. – Philipp

0

Su declaración se ve un poco como si dp se usará como matriz. En ese caso, una clase de matriz dedicada (densa) como boost::numeric::ublas::matrix es la solución más simple, más fácil y más local que un vector de vectores. Si la matriz está escasamente poblada, use una clase de matriz dispersa en su lugar.

0

Así que si quiero crear una gran matriz como arriba, ¿qué debo hacer?

Evite utilizar la pila para estos casos (en otras palabras, evite crear matrices como estas que no se asignan al montón cuando se trabaja dentro de una función). Solo para hacerte una idea, mi pila local de subprocesos tiene solo 16 kilobytes de tamaño. 4501 * 4501 * 4 (suponiendo 4 bytes por int) = ~ 81 megabytes.

considerar algo como esto en su lugar:

typedef vector<int> Row; 
typedef vector<Row> Matrix; 
Matrix dp(4501, Row(4501)); 

Si desea crear una matriz de 10x50:

Matrix dp(10, Row(50)); 

Se puede usar esta al igual que la matriz DP normales no se había desbordado la pila. Este se asignará y se desasignará automáticamente a/desde el montón para que no tenga que preocuparse por el desbordamiento de la pila al usarlo.

dp[5][10] = 123; 

¡Buena suerte!

[Editar] También hay soluciones matriciales en potencia que vale la pena analizar pero que sugieren que el impulso puede ser un poco prematuro dada la naturaleza del tema.

Cuestiones relacionadas