CnUnix

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ CnUnix ] in KIDS
글 쓴 이(By): Debussy (깨구리참새()
날 짜 (Date): 1996년05월18일(토) 23시46분36초 KDT
제 목(Title): [re] 거대한 어레이...


 글을 읽어 보니 윈도우즈에서 에러가 나는건 당연한 결과입니다.

포인터 변수만 잡아두고, 그 포인터 변수가 가리키는 곳의 메모리 블럭을

할당해 주지 않았기 때문입니다. 즉, 도스에서의 malloc이나 윈도우즈 API인

GlobalAlloc등으로 메모리 할당을 하지 않아서 GP Fault가 발생한 것으로

생각됩니다. 만일 메모리 할당을 하고서도 이런 에러가 발생했다면 메모리

할당영역을 벗어난 곳에 값을 써 넣으려다 에러가 낳다고 생각할 수 밖에 없는데,

그외에도 몇가지 더 생각해본다면, 다른곳에 쓰이는 배열이 있어, 이 배열이

heap영역을 많이 차지해서 이상한 오류를 발생시킬수도 있습니다.

그러나 중요한 문제는 이것이 아니라, 글 쓰신분이 윈도우즈의 메모리 쳬제를

조금 과신한듯합니다. 배열을 직접 선언하지 못하것은, 그렇게 큰 배열을 잡으면

당연히 heap이 줄어들어 프로그램이 오동작을 보일것이고, (메모리 모델을 large

로해도 마찬가지겠죠...) 그래서 포인터로 잡아봤지만, 16bit 코드로 프로그램을

만들면 64kb를 넘는 연속한 메모리 블럭은 잡을수가 없습니다. 메모리 함수를

써서 64kb보다 큰것을 할당하면 에러는 안나지만 64kb넘는 곳을 사용할 수가

없죠.하나의 데이터 세그먼트를 넘어가게되는데 넘친 부분이 어디에 있는지

알수가 없죠. VC1.52에 보면 wimmem.h를 포함시키고 flat memory를 상용하게

해주는 함수들이 있는데, 여간 귀찮은 함수가 아니죠. 상황이 급박하면

이쪽 함수를 사용하던지 아니면 다른 방법을 사용해야 할겁니다. ( 뭐 메모리

모델을 huge로 하면 64kb이상의 무지막지한 배열도 잡을수 있구...) 

꼭 16비트 코드를 생성할 필요가 없으면 win32깔아다가 그냥 32비트컴파일러로

밀어붙이면 그냥 해결될듯...

                                   A ma chere petite Chouchou, avec les
                                   tendres excuses de son Pere pour ce 
                                   qui va suivre.
                                                             Debussy...
         
[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.