|
dd님 조언감사합니다.
염치불구하고 한가지만 어 여쭙겠습니다.
님의 말씀대로 사이즈를 계산하여 코딩하여 컴파일 하니 에러가 발생하지 않습니다.
그런데 실행을 시켜보면 메모리 참조 에러가 발생합니다.
(제 코딩이 잘못된것 같애요.... ㅠㅠ)
// 선언부
int AAA = 10;
int BBB = 10;
typedef struct _tag_
{
int ***data;
make(int cnt) {
data = new int**[cnt]; <----- 요기
for(int i=0;i<cnt;i++){
data[i] = new int*[AAA];
for(int j=0;j<AAA;j++){
data[i][j] = new int[BBB];
}
}
}
}TTAG;
// 소스
TTAG *tag;
tag->make(10);
이렇게 실행하였습니다.
tag를 포인터로 선언하지 않으면 실행은 잘 되는데...
공유메모리를 사용할 때 포인터형이 되야 하거든요...
MapViewOfFile(...)파일에서 리턴형이 포인터 형이라서요....
조언부탁드립니다....
dd 님이 쓰신 글 :
: 3차원 배열이면 아래 소스대로 하자면 사이즈 계산이 대충 이렇네요.
: 총사이즈 = cnt * AAA * BBB * sizeof(int)
: 예를 들면 이렇게 할 수 있네요.
:
: int shared_size = cnt * AAA * BBB * sizeof(int);
: typedef struct _tag_ {
: int * array;
: } TTAG;
: int & array(int i, int j, int k) { return TTAG.array[i*AAA*BBB + j*BBB + k] }
:
: hFileMap = CreateFileMapping(INVALID_HANDLE_VALUE, // 대상 파일의 핸들값
: NULL, // 보안정보 관련(default null)
: PAGE_READWRITE, // Access Type
: 0, // FileMap Object size(high)
: --------- --> sizeof(shared_size), // FileMap Object size(low)
: MMFileName); // FileMap Object Name
:
:
: newhuni 님이 쓰신 글 :
: : 안녕하세요...
: : 오늘도 고수님들께 조언을 구하고자 글을 올립니다. ^^;;;
: :
: : 공유메모리를 사용하여 두개 이상의 프로세스에서 데이타를 교환하고 있습니다.
: : 하나의 구조체를 생성하여 공유메모리를 구성하였는데.
: : 프로그램 설치환경(시스템 구성)에 따라 데이타의 양이 많이 다릅니다.
: : (적게는 수메가, 많게는 수백메가에 다다릅니다.)
: :
: : 그래서 공유메모리를 가변적으로 구성하고싶습니다.
: : 생각하는것은 외부에 INI파일을 만들어 INI파일에 데이타의 크기를 저장하고,
: : 실행할때 이 값을 읽어와 공유메모리를 구성하고싶습니다.
: : ---------------------------------------------------------------------------------------
: :
: : 현재 구조체의 데이타 변수(3차원 배열)를 동적으로 할당하는 (아래와 같은)방법으로 접근하고 있습니다.
: :
: : int AAA = 10;
: : int BBB = 10;
: : typedef struct _tag_
: : {
: : int ***data;
: : make(int cnt) {
: : data = new int**[cnt];
: : for(int i=0;i<cnt;i++){
: : data[i] = new int*[AAA];
: : for(int j=0;j<AAA;j++){
: : data[i][j] = new int[BBB];
: : }
: : }
: : }
: : }TTAG;
: :
: :
: : 그런데 처음 공유메모리를 생성하는 부분에서 구조체의 크기를 줘야 하는데...
: : 여기서 부터 막힙니다. 동적으로 할당하다 보니 구조체의 크기가 고정이지 않아
: : 크기 자체를 어떻게 줘야 할지... 모르겠습니다.
: :
: : // Memory Mapped File Create.
: : hFileMap = CreateFileMapping(INVALID_HANDLE_VALUE, // 대상 파일의 핸들값
: : NULL, // 보안정보 관련(default null)
: : PAGE_READWRITE, // Access Type
: : 0, // FileMap Object size(high)
: : --------- --> sizeof(SharedData), // FileMap Object size(low)
: : MMFileName); // FileMap Object Name
: : if(hFileMap == NULL) // Create fail
: : {
: : ShowMessage("Unable to create file mapping !");
: : return;
: : }
: :
: : 위와 같이 접근하는게 틀린가요???
: : 다른방법으로 공유메모리를 가변적으로 생성할 수 있을까요???
: :
: : 고수님의 조언부탁드립니다...
|