将泛型数组的元素传递给泛型函数
Passing an element of a generic array to a generic function
我们有一个包含指向泛型数组的指针的数组,以及一个泛型函数数组,我们想将 func_ptarrs
中的函数 i
应用于数组 i
中的每个元素。
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
?
你需要这个,
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;
}
我们有一个包含指向泛型数组的指针的数组,以及一个泛型函数数组,我们想将 func_ptarrs
中的函数 i
应用于数组 i
中的每个元素。
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
?
你需要这个,
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;
}