2013-07-18 2 views
6

void 포인터를 사용하여 C에서 기본 큐 구조를 구현했습니다. 절차는 다음과 같다 :void *를 사용한 C 대기열 구현 - 좋은 또는 나쁜 연습?

  • 는 구조를 초기화 - I 변수 타입의 크기가 큐
  • 푸시 저장되도록 설정 - I 변수에 대한 포인터가 저장되는 전달 큐는 잡고
  • front - 구조체는 앞에있는 요소에 void *를 반환합니다. 포인터를 잡을 수도 있고 memcpy() 로컬 복사본을 가지고있을 수도 있습니다.

구조체 자체는 다음과 같습니다

struct queue 
{ 
    void* start; //pointer to the beginning of queue 
    void* end;  //-||- to the end 
    size_t memsize; //size of allocated memory, in bytes 
    size_t varsize; //size of a single variable, in bytes 
    void* initial_pointer;  //position of the start pointer before pop() operations 
}; 

시작과 끝은 현재 할당 된 메모리 블록 내에서 어떤 위치를 가리 단지 무효 포인터. 큐에 요소를 밀어 넣으면 끝 포인터를 varsize만큼 증가시킵니다. 내가 pop()하면 끝 포인터도 varsize만큼 감소시킵니다. 내가 여기에 기능 코드를 게시한다고 생각하지 않습니다

, 그것은 100 개 라인 이상입니다.

는 질문 :이 나쁜 관행 좋은 또는 간주됩니다? 왜 (안)?

참고 : 난 그냥이 일의 질에 대해 부탁 해요 C에서 큐를위한 많은 다른 옵션이 있다는 것을 알고 있어요.

편집 : 구현은 여기에 있습니다 : HTTP : 당신은 종류와 크기를 모르는 경우 // 89.70.149.19의 /stuff/queue.txt

+2

메모리 크기에 size_t를 사용하십시오. –

+0

'void *'를 사용하여 제네릭 코드를 작성하는 것이 좋습니다. –

+0

@RanEldan 감사합니다. 여기에서 수정했습니다. – szczurcio

답변

8

그것은 void *를 사용하는 OK입니다 (공백을 제거) (실제로 C 표준 라이브러리는 동일한 접근법을 따르므로 일부 예제에서는 memcpy()qsort() 함수를 참조하십시오). 그러나 큐에 저장된 요소의 크기를 지정하는 데 size_t (또는 부호가있는 데이터 형식이 필요한 경우 ssize_t)을 사용하는 것이 좋습니다.

+1

랜 엘던 (Ran Eldan)은 이미 언급했듯이 나는 그것을 시정했습니다. OK, 의견을 보내 주셔서 감사합니다. 나는 실제로 그것을하는 것이 직관적이라고 생각합니다. 단지 "추한"이라고 주장하는 사람들을 만났습니다. – szczurcio

+2

@szczurcio 중요한 것은 사전에 형식을 모르는 경우에는 다른 것을 할 수 없다는 것입니다. 그렇게한다면 더 나은 유형 안전을 위해 어떤 방법으로도'void * '를 사용하지 마십시오. –

2

구현에 대해 충분히 알려주지 않았습니다. 사용자 데이터 항목에 대한 void* 잘, 당신은 C.

에 많은 다른

을 할 수 없어하지만 난 강력하게 당신이 개별 항목을 관리하는 데 사용하는 내부 목록 요소 유형,

struct list_item { 
    struct list_item* next; 
    void* data; 
}; 
같은 것을 가지고 있다고 의심 그런 경우이며, 당신의 startend 포인터 등의 요소를 가리키는 경우

, 당신은 결정적 struct queue 선언에 요소 유형을 사용해야합니다

struct queue 
{ 
    struct list_item* start; //pointer to the beginning of queue 
    struct list_item* end;  //-||- to the end 
    size_t memsize; //size of allocated memory, in bytes 
    size_t varsize; //size of a single variable, in bytes 
    struct list_item* initial_pointer;  //position of the start pointer before pop() operations 
}; 

이 작업을 수행하려면 사용자에게 struct list_item의 정의를 노출 할 필요조차 없습니다.

+0

무슨 뜻인지 잘 모르겠습니다. start와 end는 현재 할당 된 메모리 블록 내의 어떤 위치를 가리키는 단지 void 포인터입니다. 큐에 요소를 밀어 넣으면, 끝 포인터를 varsize만큼 증가시킵니다. 만약 내가 pop(), 나는 단지 varsize하여 끝 포인터를 감소시킵니다. – szczurcio

+0

편집 : 내 질문에 코드 링크를 추가했습니다. – szczurcio

+0

@szczurcio는 큐의 매우 비 전형적인 구현이며, 일반적인 요소는 여기에서 설명하는 것처럼 동적 요소가있는 것입니다. 참조 할 수 있도록 설명에 설명에 추가해야합니다. 나는이 대답을 삭제할 것이고, 그것은 당신에게별로 도움이되지 않을 것이다. –

관련 문제