:: 게시판
:: 이전 게시판
|
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
통합규정 1.3 이용안내 인용"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
10/05/21 23:31
전체 코드 입니다.
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> #include <iostream> using namespace std; #define R 16807.0 /* multiplier */ #define M 2147483647.0 /* modulus */ #define COLUMN_MAX 500 #define ROW_MAX 250 #define NUM_ROW 3 #define NUM_COLUMN 6 double seed = 0.1; double rnd() // generate a uniform r.v seed = fmod(R * seed, M); return(seed * 4.656612875e-10); double gasdis() // generate a normal r.v static double t = 0.0; double x, v1, v2, r; if (t == 0) { do { v1 = 2.0 * rnd() - 1.0; v2 = 2.0 * rnd() - 1.0; r = v1 * v1 + v2 * v2; r = sqrt(-2.0 * log(r) / r); t = v2 * r; return(v1 * r); } else x = t; t = 0.0; return(x); } int main() double error, output, ratio, r_code[COLUMN_MAX], VAR = 1.0; int i, j, n, k, b_e = 0,a_e = 0, signal, count=0, err=0, H[ROW_MAX][COLUMN_MAX]={ int num_column = 0, num_row[COLUMN_MAX]=, message[ROW_MAX]=, temp; int code[COLUMN_MAX]=, check[COLUMN_MAX]; srand((unsigned)time(NULL)); for(i=0; i<ROW_MAX-NUM_ROW; i++) for(j=0; j<NUM_COLUMN; j++){ while(1){ temp = rand()%COLUMN_MAX; if(H[i][temp] == 0 && num_row[temp]<NUM_ROW){ H[i][temp] = 1; num_row[temp]++; break; } } temp=0; for(k=0; k<COLUMN_MAX; k++) if(H[i][k]==1){ temp++; } } for(j=0; j<NUM_ROW; j++) for(i=0; i<COLUMN_MAX; i++){ if(num_row[i]==j){ H[ROW_MAX-j-1][i] = 1; num_row[i]++; count++; if(count==NUM_COLUMN) break; } for(i=0; i<COLUMN_MAX; i++) if(num_row[i]<NUM_ROW){ H[ROW_MAX-j-1][i] = 1; num_row[i]++; count++; if(count==NUM_COLUMN) break; } count=0; }
10/05/21 23:35
배열을 그냥 사이즈로 잡아버리면 메모리 일정 크기까진 되는데 그거 넘어가면 메모리 부족으로 에러가 날겁니다. 교재 뒤쪽 보시면 동적 메모리 할당 이라고 해가지고 스택과 힙 영역에 관한 부분이 있을꺼에요
10/05/21 23:38
WizardMo진종님// 정말 죄송한데 링크 걸어주신걸 봐도 전혀 이해가 안되서 그러는데 제코드의 경우 어떤부분을 바꿔야하는지 알려주시면 안될까요.. ㅠㅠ
10/05/21 23:45
간단하게 말해서;;;
배열을 만드는 방법에는 위에처럼 만드는 방법과 다른 한가지 방법이 더 있습니다. ------------------------------- #include <stdio.h> #include <stdlib.h> int main(void) int **array; int a=5, b=5, i; array = (int **)malloc( sizeof(int) * a); //행의 수만큼 동적으로 할당함 */ for (i=0; i<a; i++){ //열의 수만큼 각 행에 동적으로 메모리 공간을 할당함 */ array[i] = (int *)malloc( sizeof(int) * b); for(i=0; i<a; i++) free(array[i]); //열에 해당하는 메모리공간 해제 free(array); //행에 해당하는 메모리 공간 해제 return 0; } ------------------------------- 이런방법이 있습니다.//<a href=http://lejewk.tistory.com/69#recentTrackback target=_blank><a href=http://lejewk.tistory.com/69#recentTrackback</a> target=_blank>http://lejewk.tistory.com/69#recentTrackback</a></a> 참조 저 소스가 일단 딱히 눈에 띄게 잘못된건 없어보이는데 배열크기를 늘렸을때 문제라면 스택영역에 배열을 잡아서 그런거 같습니다. c언어에서 일단 메모리관리 부분을 읽어보시고,,, 그다음에 malloc이라는 함수를 쓰시면 될꺼는 같습니다.
10/05/21 23:56
int main()
쉽게 말하면, 함수 안의 메모리를 할당할 때 스택이라는 걸 사용합니다. 이 때 메모리를 무한정 줄 수는 없고 컴파일러에서 적당히 크기를 잡아서, 쉽게 말하면 이 함수에는 메모리 얼마, 하는 식으로 스택 영역 크기를 조절하게 됩니다. 그래서 그 영역 크기를 넘어가는 크기의 배열을 만들면 예상치 못한 동작을 하게 됩니다. 이 문제를 해결하시려면 1. 변수를 전역 변수로 할당하시거나(현재는 int main() 안에 선언되어 있던 것을 밖으로 옮겨 전역 변수로 선언하시면 됩니다) 2. 동적 할당으로 배열을 사용하시거나 3. 컴파일러 옵션을 건드리셔서 스택 영역의 메모리 크기를 늘리시면 됩니다.
10/05/22 00:01
동적 배열이라는거 자체를 배우시고 하는데 무리가 있으시다면..
스택 영역을 늘려주면 됩니다. 프로젝트 - Properties - Linker - System 에 가셔서 Stack Reserve Size 이부분을 4000000 (4백만) 으로 고치시면 Stack의 기본영역이 4메가로 설정됩니다. (Stack의 기본은 1메가) 그리고 1000*500으로 배열을 잡으시면 2기가 영역 주소를 돌파하기 때문에.. 에러가 나는군요.. 그래서 Enable Large Address 이 옵션을 Support Address Large Than 2 Gigabytes 라고 주시면 됩니다. .NET 2003이상버전으로 하시면 되구요.. 그이하버전은 옵션조절을 잘 모르겠네요~
|