【发布时间】:2020-12-17 15:33:43
【问题描述】:
我有一个函数,它接收一个指向双精度的指针 并对它做一些事情。假设我有一个指向浮点数的指针 它是通过 malloc 或 calloc 创建的。我如何将此指针传递给函数 正确吗?我尝试通过 (double *)var 进行简单转换,但这并没有达到我的预期。
#include <stdio.h>
#include <stdlib.h>
void TestFunc(double *x, long arr_size)
{
long i;
for (i=0; i<arr_size; ++i)
x[i] = (double)i;
}
int main()
{
long i;
long n = 10;
float *x = (float *)calloc(sizeof(float), n);
TestFunc((double *)x, n);
for (i=0; i<n; ++i)
printf("%f\n", x[i]);
return 0;
}
我也尝试过使用指针算法而不是索引:
void TestFunc(double *x, long arr_size, size_t size)
{
long i;
for (i=0; i<arr_size; ++i)
{
*x = (double)i;
x += size;
}
x -= size*arr_size;
}
int main()
{
long i;
long n = 10;
float *x = (float *)calloc(sizeof(float), n);
TestFunc((double *)x, n, sizeof(float *));
for (i=0; i<n; ++i)
printf("%f\n", x[i]);
return 0;
}
第一种方法的结果是:
0.000000
0.000000
0.000000
1.875000
0.000000
2.000000
0.000000
2.125000
0.000000
2.250000
第二个的输出全为零,而我希望是 0.0,...,9.0。有什么建议吗?
编辑:目标是使以下代码更短。这是一个 Python 扩展,我想安全地处理各种数据类型。
if (typenum == NPY_FLOAT)
_array_from_one(data, y, dim, float, CName##_Float);
else if (typenum == NPY_DOUBLE)
_array_from_one(data, y, dim, double, CName##_Double);
else if (typenum == NPY_LONGDOUBLE)
_array_from_one(data, y, dim, long double, CName##_Long_Double);
else
{
if (typenum == NPY_BYTE)
_array_to_double(data, y, dim, char, CName##_Double);
else if (typenum == NPY_UBYTE)
_array_to_double(data, y, dim, unsigned char, CName##_Double);
else if (typenum == NPY_SHORT)
_array_to_double(data, y, dim, short, CName##_Double);
else if (typenum == NPY_USHORT)
_array_to_double(data, y, dim, unsigned short, CName##_Double);
else if (typenum == NPY_INT)
_array_to_double(data, y, dim, int, CName##_Double);
else if (typenum == NPY_UINT)
_array_to_double(data, y, dim, unsigned int, CName##_Double);
else if (typenum == NPY_LONG)
_array_to_double(data, y, dim, long, CName##_Double);
else if (typenum == NPY_ULONG)
_array_to_double(data, y, dim, unsigned long, CName##_Double);
else if (typenum == NPY_LONGLONG)
_array_to_double(data, y, dim, long long, CName##_Double);
else if (typenum == NPY_ULONGLONG)
_array_to_double(data, y, dim, unsigned long long, CName##_Double);
else {
PyErr_Format(PyExc_TypeError,
"Invalid data type.",
VarToString(FuncName));
return NULL;
}
typenum = NPY_DOUBLE;
}
这两个宏的定义是:
#define _array_from_one(x, y, dim, type, f) ({ \
long i; \
type *out = (type *)malloc(sizeof(type)*dim); \
for (i=0; i<dim; ++i) out[i] = (*f)(((type *)x)[i]); \
y = out; \
})
#define _array_to_double(x, y, dim, type, f) ({ \
long i; \
double *out = (double *)malloc(sizeof(double)*dim); \
for (i=0; i<dim; ++i) \
out[i] = (*f)((double)((type *)x)[i]); \
y = out; \
})
这很有效,允许我安全地传递浮点数、双精度数和长双精度 numpy 数组,同时保持精度,并将所有整数类型转换为双精度并处理它们,但它很难看。这个问题开头的代码旨在缩短和清理它。欢迎提出任何建议!
【问题讨论】:
-
你不能这样做,因为
float不是double。 -
是的,我明白这一点,我目前的解决方案是拥有单独的功能。但是,实际代码是针对 Python 包的,我希望安全地处理大量类型的 numpy 数组(char、int、short、long、long long、float、double、long double 和它们的无符号对应物)。每个函数有 13 个别名意味着相当多的函数!