|
- 답변이 달리지 않아 잘 모르겠지만 참고 글이라도 달아봅니다.
vector 를 분석해 본적이 없어서 확실히 저것이 어떠한 구조로 메모리에
저장이 되는지 모르겠습니다. 그리고 이 것이 빌더 코드 인가요? 아니면
아래 코드를 여러 컴파일러에서 동시에 사용하실 생각으로 제작하신 코드 인지요?
우선, 빌더에서, 사용을 한다는 가정하게 몇가지 분기를 적어보겠습니다.
이 곳에서, kalamazu 님이 판단하시기에 이러한 구조다 라는 것의 번호를
집어주시면, 그 방법에 대해서 다시한번 자세히 말씀 드리겠습니다.
1. 가변 메모리. (AnsiString 같은..)
가변 메모리의 경우, 파일로 저장을 할 수는 있어도, 그 것을 다시 꺼내올 때
메모리 Alloc 문제가 발생할 수 있습니다. 따라서 저장시에는 다음과 같은 순서
형태로 저장이 되어야 합니다.
[총 Index][크기(1번객체)][데이터(1번객체)][크기(2번객체)][데이터(2번객체)] ...
총 Index 만큼 반복하되, size 를 읽어 메모리를 확보한 후, 데이터를 꺼내올 수 있습니다.
2. 포인터
만약, 포인터 주소만을 가지고 있는 형태면, 그것을 저장할 시 포인터가 가르키고
있는 값을 저장하고, 포인터 형식의 주소를 함께 저장합니다.
[총 Index][포인터 크기][크기(1번객체)][데이터(1번객체)][크기(2번객체)][데이터(2번객체)] ...
포인터 형태까지 정해놓아야 한다면, 정수로 저장한 후 if 등의 분기에 따라 해당 define 된
포인터 객체를 동적으로 생성할 수 있습니다.
데이터를 꺼내면서, 포인터를 지정해 줄 수 있는 방법입니다.
3. 포인터가 없는 정적인 크기의 메모리
이 경우, 바로 vector 를 메모리에 밀어 넣어버리면 됩니다.
4. vector 가 지원하는 함수 사용
vector가 지원하는 파일 저장용 함수가 있으면 그것을 대용으로 사용하시면 됩니다.
(어떠한 함수가 있는지는 모르겠습니다)
스트림으로 밀어넣으실 때는, 빌더의 경우에는 TMemoryStream 이나 TFileStream 을
사용하시면 됩니다. 3번 같은 경우에는 그냥 vector 형의 메모리 그대로 밀어넣으시면
되고, 1, 2번의 경우에도 위에서 설명드린 연산 후, 밀어넣으실 수 있습니다.
cuperido
kalamazu 님이 쓰신 글 :
: 안녕하세요.
: 문제가 생길때마다 매번 여기와서 해결을 했는데........... 이번에도...... ^^;;
:
:
: 다음 아래와 같이 벡터들을 생성 했는데 이 벡터들을 바이너리 파일에 쓰는 방법에 있어 아직 지식이 짧아 질문 드립니다.
:
: 아래 코드에 보면 vector< vector<int>> variable_node, check_node 로 두개의 바이너리 벡터를 생성했는데 이 variable_node 와 check_node 벡터를 벡터의 특성을 그대로 유지하며 바이너리 파일로 저장을 해야하는데 어떻게 해야할지 몰라서요.
: 고수님들의 조언을 부탁드립니다.
: 꾸벅.
: ==================================================================================
:
: #예제코드
: #ifdef __BORLANDC__
: #pragma argsused
: #endif
:
: #include <iostream> //<---For 'cin' and 'cout'
: #include <fstream> //<---To open a file stream
: #include <vector> //<---Check this by yourself why..
: #include <algorithm> //<---To call methods 'random_shuffle',
: using namespace std;
:
:
: int main(int argc, char* argv[])
: {//<---Begin of main()
:
: char* OutputFileName;//<--- The binary file name to which binary vectors are stored.
: //OutputFileName=argv[1]
: if(!argv[2])
: {OutputFileName="test.bin";}//<---Default binary Output File Name.
: else
: {OutputFileName=argv[1];}
:
: vector< vector<int> > variable_node;
: vector<int> vn_temp;
:
: int N=1000;
: int N_i;
:
: for(int i=0; i<N;i++)
: {
: N_i=(10 + (7*i))%10;
:
: for(int j=0; j<N_i; j++)
: {
: vn_temp.push_back(1+(i%10));
: }
:
: variable_node.push_back(vn_temp);
: vn_temp.clear();
: }
:
:
:
: vector< vector<int> > check_node;
: vector<int> cn_temp;
:
: int M=500;
: int M_i;
:
: for(int i=0; i<M ;i++)
: {
: M_i=(5 + (7*i))%5;
:
: for(int j=0; j<M_i; j++)
: {
: cn_temp.push_back(1+(i%10));
: }
:
: variable_node.push_back(cn_temp);
: cn_temp.clear();
: }
:
:
: ofstream LdpcSparse(OutputFileName, ios::out&& ios::binary);//<-- Output file stream.
:
:
: /*
: 여기까지가 variable_node 와 check_node를 생성하는 예제였습니다.
: 이제 제가 해야될일은 위에서 생성된 variable_node와 check_node가
: vector< vector<int> >로 정의된 벡터구조를 그대로 가지면서
: OutputFileName이란 이름으로 binary 파일로 저장해야 하는데 어떻게 해야할지 모르겠습니다.
: 인터넷에서 자료를 찾아 이리저리 뒤지고 있지만 쉬이 나오지 않네요.
:
: string의 경우 "<<" operator 로 쉽게 저장이 되던데...
: 벡터의 경우 위에서 정의된 Output file stream 인 LdpcSparse를 다음과 같이 사용할수 있는
: 방법 없을까요? 이렇게요
: LdpcSparse << variable_node;
: LdpcSparse << check_node;
: 마치 스트림을 다루던것처럼요.
:
: 많은 조언 부탁드립니다.
: 꾸벅..
:
:
: 추신: 으흑....operator의 길은 멀고도 험하구나...
: */
:
: }//<---End of main()
|