2012-01-26 12 views
6

Tengo un problema de matriz que quiero superar, si cambio el valor de const int "are" a 2048 el programa funciona bien pero en 8192 o incluso en 4096 (solo 130,000 elementos) no funciona y se rompe ¿Cómo puedo solucionar esto?Límites de tamaño de matriz

#include <iostream> 
#include <fstream> 
#include <windows.h> 

#pragma warning (disable : 4820 4619 4668 4101) 

HANDLE ghEvents; 

const int arc = 2048; 
const int are = 8192; 

struct DataStructure_init { 

    int main_seq[are][32]; 
    int main_seq2[are][32]; 
    int main_seq3[are][32]; 
    int main_lim[are]; 

}; 

struct DataStructure_trus { 
    int net[arc]; 
    int r6[arc]; 
    int thr[arc]; 
}; 

int ftrus (unsigned char cmain[],int array_inst[],DataStructure_trus& va); 
int finit (DataStructure_trus va,DataStructure_init& in); 

using namespace std; 

int main() 
{ 
    unsigned char cmain[are]; 
    int array_inst[64]={0}; 
    DataStructure_trus va; 
    DataStructure_init in; 
    ftrus(cmain,array_inst,va); 
    finit(va,in); 

    cin.get(); 
} 



int finit (DataStructure_trus va,DataStructure_init& in) 
{ 

    int nb=0,flag=0,lock=0; 

    for(int i=0;i<are;i++){ 

     for(int j=0;j<24;j++){ 
     in.main_seq[i][j]=va.thr[(i*24)+j]; 
     } 

    } 

    return 0; 
} 



int ftrus (unsigned char cmain[],int array_inst[],DataStructure_trus& va) 
{ 

    int g=0; 
    ifstream in("C:\\Dev-Cpp\\DCS\\Decom\\trus.txt", ios::binary); 
    unsigned char c; 
    while(in.read((char *)&c, 1)) 
    {  
      cmain[g]=c; 
      if(cmain[g]==' ' && cmain[g-1]=='t' && cmain[g-2]=='e' && cmain[g-3]=='n')  {array_inst[1]=g+1;} 
      else if(cmain[g]==' ' && cmain[g-1]=='r' && cmain[g-2]=='h' && cmain[g-3]=='t') {array_inst[9]=g+1;array_inst[21]=g-7;} 
      g++; 
    } 
    array_inst[29]=g-2; 

    for(int i=0;i<64;i++){va.r6[i]=0;} 

    for(int i=array_inst[1];i<array_inst[21];i++){ 
     if(cmain[i]=='1'){va.net[va.r6[1]]=1;va.r6[1]++;} 
        else {va.net[va.r6[1]]=0;va.r6[1]++;} 
    } 

    for(int i=array_inst[9];i<array_inst[29];i++){ 
     if(cmain[i]=='1'){va.thr[va.r6[9]]=1;va.r6[9]++;} 
        else {va.thr[va.r6[9]]=0;va.r6[9]++;} 
    } 


    return 0; 
} 
+0

interesante que se escribe "_just_ 130.000 elementos". ¿Sobre qué base asumes que esto no es mucho? –

+0

Entonces, ¿puedo hacer algo como esto crear un puntero en la estructura de datos y asignar el espacio dinámicamente en la principal? –

+0

http://en.cppreference.com/w/cpp/container/vector http://jcatki.no-ip.org/fncpp/Resources –

Respuesta

2

Usted no tiene que poner las matrices en la pila en main(), puede igual de bien asignarlos de forma estática antes de entrar en la función. Eso los pondrá en un área que no está limitada por el tamaño de pila predeterminado.

unsigned char cmain[are]; 
int array_inst[64]={0}; 
DataStructure_trus va; 
DataStructure_init in; 

int main() { 
    ftrus(cmain,array_inst,va); 
    finit(va,in); 
    cin.get(); 
} 
+0

esto funciona de maravilla, declarando la estructura de datos fuera de la principal, incluso con "son" como 20,000 el programa se ejecuta sin una falla. –

5

asignar la matriz de forma dinámica, ya que a menudo hay límites en la cantidad de datos que puede tener en la pila (que es donde las variables locales automáticos suelen terminar):

unsigned char* cmain = new unsigned char[are]; 
+0

Tenía miedo de hacer eso porque mi programa es mucho más grande y se cuelga mucho, ¿qué sucede si no eliminé la memoria y mi programa se bloquea antes de eso? ¿El procesador podría desasignar la memoria? –

+1

@Gambit: Haga que su programa no se cuelgue. –

+0

@GambitKing: toda la memoria asignada por un proceso se libera cuando finaliza. Por lo tanto, un bloqueo del programa libera automáticamente su memoria. – thiton

1

Usted está poniendo el estructura de datos en la pila en main, y es bastante grande. Puede aumentar el tamaño de la pila (depende de su sistema) o asignar la estructura en el montón con new o malloc.

1

Puede comenzar asignando DataStructure_* que no está en la pila. Por ejemplo, anteponiendo la palabra clave static.

static DataStructure_trus va; 
static DataStructure_init in; 
+0

... lo que dará como resultado un enorme ejecutable. La solución correcta aquí es usar el montón. –

+0

@MatteoItalia, es por eso que "comienza con". Este es un intento de minimizar los cambios. –

+0

@LightnessRacesinOrbit, ahora puede estar equivocado al sentirse orgulloso de su ingenioso comentario. –

3

Lo que todos los demás dijeron: estás tratando de asignar muchas cosas en la pila. A lote.

En su lugar, de forma dinámica a asignar el búfer de memoria ... mediante el uso de un contenedor estándar para la gestión de la memoria:

std::vector<unsigned char> cmain(are); 
+0

Cada vez que uso vectores, mis programas se ejecutan el doble de lento, aunque sé que es mi implementación, ese es el problema. –

+0

Entonces estás usando vectores incorrectamente. Cuando se "reserva" la capacidad como sea posible, el uso del vector tiene la misma velocidad que el de las matrices. Los contenedores estándar son el enfoque correcto aquí. Ellos se encargan de la asignación y de la limpieza para usted. Y son gratis. –

+0

Además, si habilita las optimizaciones, debería ejecutarse tan rápido como con una matriz regular de estilo C, ya que, una vez que las llamadas 'operator []' están en línea, el código generado debería ser el mismo. –