2011-08-01 3 views
4

주어진 파일 설명자가있는 파일의 오프셋에서 일부 데이터를 pwrite에 보내려고합니다. 내 데이터는 두 개의 벡터로 저장됩니다. 하나는 unsigned longs이고 다른 하나는 char입니다. 부호없는 long에서 void *로 캐스팅하는 방법?

나는 나의 unsigned long들과 char의를 나타내는 비트 시퀀스를 가리키는 void * 구축을 생각하고, 축적 된 크기와 함께 pwrite에 전달합니다. 하지만 unsigned longvoid* 번으로 캐스팅 할 수 있나요? (나는 그 다음 문자를 알아낼 수 있다고 생각한다). 여기에 내가 할 노력하고있어 무엇 :

void writeBlock(int fd, int blockSize, unsigned long offset){ 
    void* buf = malloc(blockSize); 
    // here I should be trying to build buf out of vul and vc 
    // where vul and vc are my unsigned long and char vectors, respectively. 
    pwrite(fd, buf, blockSize, offset); 
    free(buf); 
} 

을 또한, 당신이 내 위의 생각은 좋지 않다 생각한다면, 나는 제안을 읽을 수있을 것입니다. 그것은 다음과 같은 코드를 사용하여 캐스팅 될 수

답변

6

unsigned long을 의미가있는 void *으로 전송할 수 없습니다. 전자는 숫자 값입니다. 후자는 지정되지 않은 데이터의 주소입니다. 대부분의 시스템은 포인터를 특별한 유형의 정수로 구현하지만 일상적인 작업에서 만날 가능성이있는 시스템을 포함하지만 유형 간의 실제 변환은 유해한 것으로 간주됩니다. 싶은 것은 당신의 파일 기술자에 unsigned int의 값을 기록하는 경우

, 당신은 & 연산자를 사용하여 값의 주소을해야합니다을 통해

unsigned int *addressOfMyIntegerValue = &myIntegerValue; 
pwrite(fd, addressOfMyIntegerValue, sizeof(unsigned int), ...); 

당신은 루프를 할 수있는 당신의 벡터 또는 배열을 만들고 하나씩 작성하십시오. 또는, std::vector의 연속 메모리 기능을 사용하여 한꺼번에를보다 빨리 작성할 수 있습니다 그들은 downvoting하는 이유를 잘 할 것이라고 답변을 downvoting있어 누구든지

std::vector<unsigned int> myVector = ...; 
unsigned int *allMyIntegers = &myVector[0]; 
pwrite(fd, allMyIntegers, sizeof(unsigned int) * myVector.size(), ...); 
+0

설명 할 수 있습니다. –

+0

-1로 무슨 일이 벌어지고 있습니까? +1 – TravisG

+0

답변 해 주셔서 감사합니다. 나에게 남은 유일한 문제는 unsinged longs와 chars의 조합을 필요로하고 buf를 효율적으로 관리해야한다는 것을 감안할 때 buf를 빌드하는 방법이다. 따라서 buf를 빌드 한 다음 입출력을 최소화하기 위해 pwrite에 전달해야한다. – Pirooz

2

: 이것처럼

unsigned long my_long; 
pwrite(fd, (void*)&my_long, ...); 
3
unsigned long i; 
void* p = (void*)&i; 
0

:

std::vector<unsigned long> v1; 
std::vector<char>   v2; 

void * p1 = reinterpret_cast<void*>(&v1[0]); 
void * p2 = reinterpret_cast<void*>(&v2[0]); 

쓰기 v1.size() * sizeof(unsigned long)v2.size() 크기.

관련 문제