1000 * 1000 * 4 (vd là mãng integer) gần = 4MB, tràn stack là chắc chắn. Vào Project Options, chỉnh lại stack size hay dùng dynamic alloc memory (new, malloc)
Mình viết chương trình trên MVC2005 bằng ngôn ngữ C. Khi khai báo mảng 2 chiều kích thước 100x100(ma trận vuông) thì chương trình chạy bình thường, nhưng khi tăng kích thước lên 1000x1000 (thậm trí nhỏ hơn kích thước này) thì máy báo lỗi Stack overflow. Các bác có kinh nghiệm giúp mình xử lý với! Chân thành cảm ơn!
NEVER GIVE UP! ! !
1000 * 1000 * 4 (vd là mãng integer) gần = 4MB, tràn stack là chắc chắn. Vào Project Options, chỉnh lại stack size hay dùng dynamic alloc memory (new, malloc)
Cậu này gan ghê, hồi đó tui chơi cái int [100][100] đã lo muốn chết :-ss. Cậu dám chơi tới 1000x1000 :-o. Cấp phát bộ nhớ động như anh TQN nói là oke đó
@TQN: em chả bao giờ chỉnh cái size của stack cả ++
Keep moving forward!
... Retired ...
Cảm ơn bác TQN nhé! em làm theo gợi ý của bác và đúng là chuơng trình đã làm việc với [1000000][1000000] lận, nhưng vài lần chạy thì có vấn đề. Em post đoạn code lên đây bác nào rỗi thì chạy thử giúp em nhé.
@nhc1987: em chả gan gì đâu nhưng đang làm bài toán về mạng nơ ron cần cái ma trận to to nên liều đại thôi bác ạ!![]()
C Code:
#include "stdafx.h" #include "stdio.h" #include"conio.h" #include "stdlib.h" #include "time.h" #include "windows.h" #include "malloc.h" double realrandom(int n) { } int _tmain(int argc, _TCHAR* argv[]) { long i,j,s,n,a,b,N; double *J,f; for (i=0;i<N;++i) for (j=0;j<N;++j) { f = realrandom(n); b = a%2; if(b == 1) s = 1; else s = -1; f = s*f; *(J + N*i + j) = f; } return 0; }
NEVER GIVE UP! ! !
Vài lần chạy có vấn đề ? Vấn đề gì ?
Đọc code cậu tui thấy cậu chỉ truy xuất trong ma trận N x N, thì cấp làm gì cho lớn thế (x 1000000) ?
Đã được chỉnh sửa lần cuối bởi TQN : 16-11-2007 lúc 02:28 PM.
Nên dùng cấp phát bộ nhớ động là tốt nhất
NEVER GIVE UP! ! !
Có vấn đề là đúng rồi. Nó bị phân mảnh thôi . Này nhé khi cậu dùng calloc thì buộc nó phải tìm cho ra vùng nhớ LIÊN TIẾP để cấp phát cứ như thế sau hai 3 lần chạy thì bộ nhớ cậu bị phân mảnh hết, hay đúng hơn là bị băm nát hết. Thành thử SIZE thì lớn hơn lượng yêu cầu cần cấp phát, nhưng để tìm đúng lượng yêu cầu (Có thể gọi là quá đáng - vì dùng ko hết này) thì khó khăn do 2 cái từ Liên Tiếp nó gây nên.
Mô phật em chả hiểu anh dùng cái gì mà để dư khủng khiếp thế kia. Lãng phí quá đáng.1000000*N*N
Trường hợp này có thể dùng List. Nếu thấy cần.
NEVER GIVE UP! ! !
Memory allocate hơi bị lớn nên các hàm quản lý memory của VC++6 RTL không cấp được. Cậu đang build ở mode DEBUG, chuyển qua build ở mode Release để dùng trực tiếp HeapAlloc API của Windows, nhớ kiểm tra exception hay NULL pointer trả về cho biến J khi calloc.