Пределы размера массива - PullRequest
6 голосов
/ 26 января 2012

У меня проблема с массивом, которую я хочу преодолеть, если я изменю значение const int "are" на 2048, программа работает нормально, но при 8192 или даже при 4096 (всего 130 000 элементов) она не работает и ломается. Как мне обойти это?

#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;
}

Ответы [ 5 ]

5 голосов
/ 26 января 2012

Выделите массив динамически, поскольку часто существуют ограничения на количество данных, которые вы можете иметь в стеке (где обычно заканчиваются автоматические локальные переменные):

unsigned char* cmain = new unsigned char[are];
3 голосов
/ 26 января 2012

То, что все остальные сказали: вы пытаетесь разместить много вещей в стеке.A lot .

Вместо этого динамически выделяйте буфер памяти ... используя стандартный контейнер для управления памятью:

std::vector<unsigned char> cmain(are);
2 голосов
/ 26 января 2012

Вам не нужно помещать массивы в стек в main (), вы также можете распределить их статически перед входом в функцию. Это поместит их в область, которая не ограничена размером стека по умолчанию.

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();
 }  
1 голос
/ 26 января 2012

Вы можете начать с выделения DataStructure_* не в стеке. Например, добавив ключевое слово static.

static DataStructure_trus va; 
static DataStructure_init in;
1 голос
/ 26 января 2012

Вы помещаете структуру данных в стек в main, и она довольно велика.Вы можете либо увеличить размер стека (зависит от вашей системы), либо выделить структуру в куче с помощью new или malloc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...