Общие редактируемые функции в C, использующие void * - PullRequest
0 голосов
/ 16 сентября 2010

Я попадаю в какую-то проблему.

Мне нужно написать такую ​​функцию, как memcpy(void*, const void*), чья подпись должна быть:

void arrayCopy(void *dest, int dIndex, const void *src, int sIndex, int len)

Я заметил, что во многих реализациях memcpy, мы приводим void * к char *, но я думаю, что это не мой случай, так как функцию arrayCopy необходимо было использовать для массивов многих типов, включая structs.

. Итак,Как я могу это сделать?

РЕДАКТИРОВАТЬ: исходный код может быть что-то вроде этого:

#include <stdio.h>
#include <string.h>

void arrayCopy(void *, int, const void *, int, int, size_t);

int main(void)
{
    int i;
    int dest[10] = {1};
    int src [] = {2, 3, 4, 5, 6};

    arrayCopy(dest, 1, src, 0, 5, sizeof(int));

    for (i=0; i<10; i++) printf("%i\n", dest[i]);

    return 0;
}

void arrayCopy(void *dest, int dIndex, const void *src, int sIndex, int len, size_t size)
{
    char *cdest = (char*) dest;
    const char *csrc = (char*) src;
    int i;

    len *= size;

    if (dest == src)
    {
        printf("Same array\n");
    }else
    {
        cdest += (dIndex * size);
        csrc += (sIndex * size);
        for (i=0; i<len; i++)
            *cdest++ = *csrc++;
    }
}

Спасибо.

Ответы [ 3 ]

2 голосов
/ 16 сентября 2010

Функция должна иметь информацию о размере элемента, например:

void *arrayCopy(void *dest, size_t di,const void *src, size_t si, size_t num, size_t esize)
{
  char *cdest = (char*) dest;
  const char *csrc = (char*) src;
  return memcpy( &cdest[esize*di], &csrc[esize*si], esize*num );
}
...
arrayCopy(dest, 1, src, 0, 5, sizeof*src);
2 голосов
/ 17 сентября 2010

Вы не можете работать с объектами типа void.Стандарт не позволяет этого.Поэтому вам нужно отбросить пустоту, и лучший тип для использования - unsigned char.Стандарт гарантирует, что unsigned char может получить доступ ко всем битам любого другого типа, представленного в вашей системе.

2 голосов
/ 16 сентября 2010

"char *" - это просто набор байтов, все в C, в конечном счете, является байтами - вы можете привести указатель на любую структуру данных в char * (вам также необходимо знать размер в памяти структуры)

...