2010-07-16 3 views
3

구조체에 HD 페이지를 표시하려고합니다. page_size가 상수가 아니기 때문에 아래 코드는 작동하지 않습니다. 내가 구축하고 무작위 페이지의 배열에 접근하고 있기 때문에 내가 크기 PAGE_SIZE의 고정 길이 구조체로 페이지를 처리 ​​할 수 ​​있다면변수를 사용하여 구조체 멤버 배열의 크기를 지정할 수 있습니까?

int page_size = 4096; 

struct page { 

    char data[page_size]; 

    /* some methods */ 
} 

, 그것은 좋은 것입니다. 가능한 경우 프로그램 시작시 구성 파일에서 page_size를 읽거나 OS에서 가져옵니다 (예 : Windows의 경우 GetDiskFreeSpace()). 분명히 현실적인 페이지 크기는 적지 만이를 악용 할 방법을 생각할 수는 없습니다.

도움을 주시면 감사하겠습니다.

프랭크

+2

C 또는 C++을 사용하고 있습니까? C++은 이런 종류의 많은 가능성을 가지고 있습니다. –

+0

#define page_size 4096을 사용하지 않는 이유는 무엇입니까? –

+0

@Brian : C 또는 C++ ... –

답변

4

아니요. 당신이 알아 낸대로, 당신은 할 수 없습니다. 컴파일러는 데이터 구조의 크기를 신뢰할 수 있고 지속적으로 파악하여 작업을 수행해야합니다.

페이지 데이터가 내 struct의 유일한 콘텐츠가 아니라고 가정합니다. 텍스트와 함께 거기에 페이지에 대한 헤더/관리 정보가있을 것입니다.

일반적인 해결책은 구조체가 실제 텍스트를 가리키는 char *을 포함하는 것입니다. 그 텍스트는 메모리 크기가 malloc() 'd이거나 calloc()이 될 수 있습니다. 아아, 이것은 구조체를 움직이는 작업을 할 때마다 구조체와 함께 외부 텍스트를 이동하는 것을 기억해야한다는 것을 의미하며 구조체를 제거하면 메모리를 관리하여 메모리를 관리합니다. 일반적인 C 두통.


편집

이런 종류의 일을 할 수있는 분별있는 "표준"방법이 있습니다.

typedef char *page_ptr; 
int page_size = discover_page_size(); 
int max_page_count = discover_max_page_count(); 
int pages_stored = 0; 
page_ptr *page_pointers = calloc(max_page_count, sizeof(page_ptr)); 
char *pages = calloc(max_page_count * page_size, sizeof(char)); 
page_pointers[0] = pages; 
int i; 
for (i=1; i<max_page_count; i++) { 
    page_pointers[i] = page_pointers[i-1] + page_size; 
} 

지금 당신은 당신은 페이지 당 하나의 포인터의 오버 헤드가

read(filedesc, page_pointers[page_count++], page_size); 

또는

memmove(page_pointers[69], page_pointers[42], page_size); 

같은 물건을, 페이지의 배열로 page_pointers 처리 할 수 ​​있습니다 : 여기 제안입니다 (틀림없이 받아 들일 만하다), 페이지는 물리적으로 연속적으로 메모리에있다. 뭘 더 물어볼 수 있니? :)

+0

안녕하세요, 감사합니다. 다른 데이터 멤버는 없으며 페이지에 몇 가지 메서드 만 있습니다. 페이지 배열을 만들면 연속적인 문자 영역 (예 : 16,384)이 메모리에 있습니다. –

+0

구조체에 데이터 멤버가 하나만 포함되어 있으면 구조체를 사용하는 것이 적합하지 않습니다. 'char [] []'을 어떻게 사용합니까? –

+0

각 페이지에서 사용할 수있는 방법을 사용하는 것이 매우 편리합니다. 하지만 추가 유연성을 위해, 나는 그 편리함 중 일부를 포기해야 할지도 모르겠다는 것을 깨닫기 시작했다 ... –

2

당신이 std::vector를 사용할 수없는 이유 크기가 런타임에 결정하려면?

int page_size = 4096; //or any variable 

class page{ 

    std::vector<char> PAGE; 
    public: 

    page():PAGE(page_size){} 
}; 
+0

나는이 대답을 완전히 놓쳤다. 나는 내 것을 제거하고 이것을 upvote. – Default

0

C 및 C++에서는 컴파일 시간 상수가 배열 길이가 필요합니다. C99은 C에 variable length arrays을 도입했으나 구조에서 사용할 수 있는지 확실하지 않습니다.

1

[C는 ++]

당신은 할 수 :

int page_size = 4096; 

struct page 
{ 
    char *pData; 
    page() : pData(new char[page_size]) 
    { 
    } 
    ~page() 
    { 
     delete[] pData; 
    } 

    /* some methods */ 
} 

대신.

+1

오른쪽, 이니셜 라이저 목록을 제외하고 – oscode

+0

@ 스티븐 잭슨 완료. – JLWarlow

+0

감사합니다. 연속적인 페이지 배열 (예 : 페이지 * ps = 새 페이지 [64])에 사용되는 메모리가 필요하거나 프로그램의 일부분을 다시 생각해야합니다. 이 솔루션은 이것을 보장하지 않을 것입니다. –

-1

당신은 그냥 당신이 원하는 텍스트 만약 당신이 PAGE_SIZE

+0

OP에서 "가능하면 프로그램 시작시 구성 파일에서 page_size를 읽거나 OS에서 가져오고 싶습니다 (예 : Windows의 GetDiskFreeSpace()).). " 즉,'page_size'는 실행시에만 결정될 수 있습니다. – kennytm

+0

그는 런타임에 크기를 결정하기를 원합니다. (나를 때려) – oscode

0

을 사용자 정의 할 수 있습니다

#define PAGE_SIZE 4096 

struct page { 

    char data[PAGE_SIZE]; 

    /* some methods */ 
} 

그리고 사용의 autoconf automake에 사용할 수있는 가장 쉬운 방법은 내가 C를 묻는 이유 그건 아마

struct page { 

    std::string data; 

    /* some methods */ 
} 

입니다 또는 C++에서 사용할 수 없기 때문에.

관련 문제