Как разыграть из unsigned long в void *? - PullRequest
4 голосов
/ 01 августа 2011

Я пытаюсь pwrite некоторые данные с некоторым смещением файла с заданным дескриптором файла.Мои данные хранятся в двух векторах.Один содержит unsigned long с, а другой char с.

Я думал о создании void *, который будет указывать на битовую последовательность, представляющую мои unsigned long s и char s, и передавать ее в pwrite вместе с накопленным размером.Но как я могу разыграть unsigned long до void*?(Я думаю, я могу выяснить для символов).Вот что я пытаюсь сделать:

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);
}

Кроме того, если вы считаете, что моя идея не подходит, я буду рад прочитать предложения.

Ответы [ 4 ]

6 голосов
/ 01 августа 2011

Вы не можете осмысленно привести unsigned long к void *. Первый является числовым значением; последний является адресом неуказанных данных. Большинство систем реализуют указатели как целые числа со специальным типом (который включает в себя любую систему, с которой вы можете столкнуться в повседневной работе), но фактическое преобразование между типами считается вредным.

Если вы хотите записать значение unsigned int в свой файловый дескриптор, вы должны взять адрес значения с помощью оператора &:

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

Вы можете перебирать свой вектор или массив и записывать их один за другим с этим. В качестве альтернативы, может быть быстрее написать их массово, используя непрерывную функцию памяти std::vector:

std::vector<unsigned int> myVector = ...;
unsigned int *allMyIntegers = &myVector[0];
pwrite(fd, allMyIntegers, sizeof(unsigned int) * myVector.size(), ...);
3 голосов
/ 01 августа 2011
unsigned long i;
void* p = (void*)&i;
2 голосов
/ 01 августа 2011

Можно разыграть, используя следующий код:

unsigned long my_long;
pwrite(fd, (void*)&my_long, ...);
1 голос
/ 01 августа 2011

Как это:

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().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...