将泛型数组的元素传递给泛型函数

时间:2015-07-01 16:53:50

标签: c generics syntax

我们有一个带有指向泛型数组的指针的数组,以及一个泛型函数数组,我们希望将i中的函数i应用于数组func_ptarrs中的每个元素。

typedef struct genarr{
    void * arr;
    int elemsize;
    int numelem;
}GENARR;

typedef void(*funcptr)(void*);

typedef unsigned char byte;

void updateall(GENARR *arrs, funcptr *func_ptarrs, int n){

    int j,i;
    for (i = 0; i < n; i++){
        for (j = 0; j < arrs[i].numelem; j++){

            func_ptarrs[i]((arrs[i].((byte*)(arr + j*arrs[i].elemsize)))); //error: expected member name

            //func_ptarrs[i]((arrs[i].arr)); //no error
        }
    }
}

在第二次尝试它指向数组开头的指针,以便它被接受,但我需要能够将数组的每个元素发送到泛型函数。

我不了解如何发送正确数量的字节并在数组中正确移动,同时将元素的指针发送到泛型函数。

也许我应该使用memcpy

1 个答案:

答案 0 :(得分:1)

你需要这个,

func_ptarrs[i](((byte*) arrs[i].arr + j * arrs[i].elemsize))

我认为这很明显,为什么它会起作用。

你也可以编写访问器宏,比如

#define ARRAY_VALUE(type, x, i (*(type *) ((x).arr + (i) * (x).elemsize))

然后你可以使用

#include <stdio.h>
#include <stdlib.h>

#define ARRAY_VALUE(type, x, i) (*(type *) ((x).arr + (i) * (x).elemsize))

typedef struct genarr
{
    void * arr;
    int elemsize;
    int numelem;
} GENARR;

int main (void)
{
    GENARR array;
    int    data[10];

    array.arr = data;
    array.elemsize = sizeof(*data);
    array.numelem = sizeof(data) / array.elemsize;

    for (int i = 0 ; i < array.numelem ; ++i)
        ARRAY_VALUE(int, array, i) = i;
    for (int i = 0 ; i < array.numelem ; ++i)
        printf("%d\n", ARRAY_VALUE(int, array, i));

    return 0;
}