如何解决在 C 中,对 void* 变量进行数学运算的最有效方法是什么
假设我有一个函数:
void myfunc(void* x,void* y){
for(i=0; i<n;i++)
y[i] = x[i]+1;
}
我的目标是获取向量 x
,做一些数学运算并将其存储在 y
中。在这种情况下,我知道 x
将作为 int
数组分配的内存。
我知道我们不能直接在 x
上进行数学运算,因为它被强制转换为 void,但我很好奇绕过这个拦截器的最有效方法。我目前的方法是 memcpy
x 到 int*
温度,做我的数学,然后 memcpy
到 y
。显然,这不是一个具有多个 memcpy
的特别有效的过程。我确定有更好的方法,只是我对 C 内存分配规则了解不够,无法弄清楚。
解决方法
您可以避免 memcpy
。如果您希望使用整数或字节或任何其他类型,那么只需进行适当的转换,例如在 x
和 y
引用 int
数组的情况下:
void myfunc(void* x,void* y){
int *xp = x;
int *yp = y;
// By the way,what is n here? Maybe define it somewhere.
for(size_t i = 0; i < n; i++)
yp[i] = xp[i] + 1;
}
在这种情况下,您根本不需要将它们作为 void *
传递:
void myfunc(int* x,int* y){
// By the way,what is n here? Maybe define it somewhere.
for(size_t i = 0; i < n; i++)
y[i] = x[i] + 1;
}
一般来说,void *
仅在您不关心指向的对象的大小和类型时,或者需要根据仅在运行时才知道的不同大小/类型进行通用操作时才有用(仍然,始终使用适当的演员表)。
如果你想允许不同的类型,那么你可以这样做:
enum Type { INT,FLOAT,/* ... */ };
void myfunc(void* x,void* y,size_t n,enum Type t) {
switch (t) {
case INT: {
int *xi = x;
int *yi = y;
for(size_t i = 0; i < n; i++)
yi[i] = xi[i] + 1;
break;
}
case FLOAT: {
float *xf = x;
float *yf = y;
for(size_t i = 0; i < n; i++)
yf[i] = xf[i] + 1;
break;
}
// case ...: {
// ...
// }
}
}
请注意这在 C 中并不是真正的好习惯。如果你能够在编译时知道类型,那么无论如何只需定义不同的函数,以不同的类型作为参数,这将是最快的选择。
,如果您知道指针指向 melbourne_file_path = **'/Users/adi/Documents/Top250.csv'**
melbourne_data = pd.read_csv(melbourne_file_path)
melbourne_data.describe()
的数组,则可以转换为该类型:
int
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。