C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[48827] Re:Re:Re:공유메모리의 크기를 가변적으로 하고 싶습니다.
dd [] 2406 읽음    2007-04-09 16:03
공유메모리는 new라는게 의미가 없고 한 번 잡으면 그걸 그대로 사용해야하는거 같은데요.
다른 말로 make()함수에서 new...하는건 공유메모리가 아닌 일반 메모리를 사용하도록 하는게 되네요.
공유메모리를 잡으셨으면 구조체 포인터에 공유메모리 주소를 할당하여 그대로 사용하면 됩니다.
음. 다시 말하면 CreateFileMapping로 잡은 공유 메모리가 있고 그 포인터가 x라면
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] }
이 구조체를 사용한다고 할 때
TTAG * tag = x;
이렇게 포인터 할당만 하면 이미 tag가 공유메모리에 잡힌것과 다름 없는걸로 생각하면 될거 같습니다.
그럼 (*tag)(3,4,5) 라는 값은 배열로 치면 [3][4][5]인덱스를 갖는 값이 되지요..
(다시 말하지만 new는 안씁니다.)


newhuni 님이 쓰신 글 :
: 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;
: : : }
: : :
: : : 위와 같이 접근하는게 틀린가요???
: : : 다른방법으로 공유메모리를 가변적으로 생성할 수 있을까요???
: : :
: : : 고수님의 조언부탁드립니다...

+ -

관련 글 리스트
48815 공유메모리의 크기를 가변적으로 하고 싶습니다. newhuni 1283 2007/04/09
48818     Re:공유메모리의 크기를 가변적으로 하고 싶습니다. dd 2591 2007/04/09
48825         Re:Re:공유메모리의 크기를 가변적으로 하고 싶습니다. newhuni 1462 2007/04/09
48827             Re:Re:Re:공유메모리의 크기를 가변적으로 하고 싶습니다. dd 2406 2007/04/09
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.