我们有一个带有指向泛型数组的指针的数组,以及一个泛型函数数组,我们希望将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
?
答案 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;
}