X-Authentication-Warning: delorie.com: mail set sender to djgpp-bounces using -f From: "Alex Vinokur" Newsgroups: comp.os.msdos.djgpp Subject: Re: Trouble of using very large arrays Date: Thu, 22 Apr 2004 20:10:08 +0300 Lines: 131 Message-ID: References: NNTP-Posting-Host: 82.166.217.90 X-Trace: news.uni-berlin.de 1082653814 9944043 I 82.166.217.90 ([79865]) X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 6.00.2800.1106 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1106 To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com "Hans-Bernhard Broeker" wrote in message news:c68e70$96gqq$1 AT ID-231750 DOT news DOT uni-berlin DOT de... > Mok-Kong Shen wrote: > > > I have difficulty in using very large arrays. In a > > simple program I could have 'unsigned int a[70000][2]' > > without problem but with 'unsigned int a[80000][2]' the > > program aborts without even the code being changed to > > access the increased new part of the array. Why is > > this so? Thanks in advance. > > You don't provide all the necessary details for anyone to be sure, but > this very strongly feels like you're blowing the stack. Don't make > large variables like this automatic (i.e. local to some function). > The usual recommended solution is to use the heap instead of the > stack, i.e. use 'new' or malloc(), depending on what language you're > working in, or make such variables static. > [snip] Here is a sample. ------ C code : BEGIN ------ /* File foo.c */ #include #include #include #include int main(int argc, char** argv) { int columns; int rows; unsigned int* a; int i, j; if (argc < 3) { printf ("USAGE : %s \n\n", argv[0]); return 1; } rows = atoi (argv[1]); columns = atoi (argv[2]); printf ("Rows - %u, Columns - %u\n", rows, columns); a = (unsigned int*)malloc (rows * columns * sizeof (unsigned int)); if (a == NULL) { printf ("Failure : Unable to allocate storage\n"); return 1; } printf ("Success : the storage allocated\n"); memset (a, 0, columns * rows * sizeof (unsigned int)); /* --- Sample --- */ printf ("\nSample\n"); printf ("------\n\n"); #define TEST_ROW_NO 3 #define TEST_COL_NO 0 assert (TEST_COL_NO < columns); assert (TEST_ROW_NO < rows); a[TEST_ROW_NO * columns + TEST_COL_NO] = 100; for (i = 0; i <= (TEST_ROW_NO + 1); i++) { for (j = 0; j <= (TEST_COL_NO + 1); j++) { printf ("a[%d][%d] = %d\n", i, j, a[i * columns + j]); } printf ("\n"); } /* ---------------*/ return 0; } ------ C code : END ------ ------ Compilation & Run : BEGIN ------ $ gcc -W -Wall foo.c $ a USAGE : a $ a 10000000 3 Rows - 10000000, Columns - 3 Success : the storage allocated Sample ------ a[0][0] = 0 a[0][1] = 0 a[1][0] = 0 a[1][1] = 0 a[2][0] = 0 a[2][1] = 0 a[3][0] = 100 a[3][1] = 0 a[4][0] = 0 a[4][1] = 0 $ a 100000000 3 Rows - 100000000, Columns - 3 Failure : Unable to allocate storage ------ Compilation & Run : END -------- -- Alex Vinokur mailto:alexvn AT connect DOT to http://mathforum.org/library/view/10978.html