2012-01-26 75 views
6

Tôi có vấn đề về mảng mà tôi muốn khắc phục, nếu tôi thay đổi giá trị của const int "là" thành 2048 chương trình chạy tốt nhưng ở 8192 hoặc thậm chí ở 4096 (chỉ 130.000 phần tử), nó không hoạt động và phá vỡ. Làm thế nào để tôi có được xung quanh này?Giới hạn kích thước mảng

#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

Thú vị mà bạn viết "_just_ 130.000 yếu tố". Trên cơ sở nào bạn cho rằng điều này không nhiều? –

+0

Vì vậy, tôi có thể làm một cái gì đó như thế này tạo ra một con trỏ trong cấu trúc dữ liệu và phân bổ không gian động trong chính? –

+0

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

Trả lời

2

Bạn không phải đặt các mảng trên ngăn xếp trong main(), bạn cũng có thể phân bổ chúng tĩnh trước khi nhập hàm. Điều đó sẽ đặt chúng trong một khu vực không bị giới hạn bởi kích thước ngăn xếp mặc định.

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

điều này làm việc kỳ diệu, tuyên bố cấu trúc dữ liệu bên ngoài chính, ngay cả với "là" là 20.000 chương trình thực hiện mà không có trục trặc. –

5

Phân bổ mảng động, vì thường có giới hạn về bao nhiêu dữ liệu bạn có thể có trên stack (đó là nơi các biến cục bộ tự động thường kết thúc):

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

Tôi đã sợ làm điều đó vì chương trình của tôi lớn hơn nhiều và treo rất nhiều, điều gì sẽ xảy ra nếu tôi chưa xóa bộ nhớ và chương trình của tôi bị treo trước đó, bộ vi xử lý có cấp phát bộ nhớ không? –

+1

@Gambit: Làm cho chương trình của bạn không bị lỗi. –

+0

@GambitKing: Tất cả bộ nhớ được cấp phát bởi một quá trình được giải phóng khi nó kết thúc. Vì vậy, một chương trình sụp đổ tự động giải phóng bộ nhớ của bạn. – thiton

1

Bạn đang đặt cấu trúc dữ liệu trên ngăn xếp trong main và nó khá lớn. Bạn có thể tăng kích thước ngăn xếp (tùy thuộc vào hệ thống của bạn), hoặc phân bổ cấu trúc trên heap với new hoặc malloc.

1

Bạn có thể bắt đầu với phân bổ DataStructure_* không có trong ngăn xếp. Ví dụ: bằng cách thêm từ khóa static.

static DataStructure_trus va; 
static DataStructure_init in; 
+0

... sẽ dẫn đến việc thực thi rất lớn. Giải pháp đúng ở đây là sử dụng heap. –

+0

@MatteoItalia, đó là lý do tại sao "bắt đầu bằng". Đây là một nỗ lực để giảm thiểu các thay đổi. –

+0

@LightnessRacesinOrbit, bây giờ bạn có thể bị hiểu lầm vì tự hào về nhận xét dí dỏm của bạn. –

3

Những gì mọi người khác nói: bạn đang cố gắng phân bổ nhiều nội dung trên ngăn xếp. A .

Thay vào đó, động phân bổ bộ nhớ đệm ... bằng cách sử dụng một container tiêu chuẩn cho quản lý bộ nhớ:

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

Bất cứ khi nào tôi sử dụng vectơ, các chương trình của tôi chạy gấp hai lần, tôi biết việc triển khai thực hiện của tôi là vấn đề. –

+0

Sau đó, bạn đang sử dụng vectơ không chính xác. Khi bạn sử dụng đúng dung lượng 'dự trữ 'càng tốt, việc sử dụng véc-tơ có tốc độ giống như của các mảng. Thùng chứa tiêu chuẩn là cách tiếp cận chính xác ở đây. Họ chăm sóc phân bổ và dọn dẹp cho bạn. Và chúng miễn phí. –

+0

Ngoài ra, nếu bạn bật tối ưu hóa, nó sẽ chạy nhanh như với một mảng kiểu C thông thường, vì, một khi các lệnh 'operator []' được gạch chân, mã được tạo nên giống nhau. –

Các vấn đề liên quan