假设我有功能
foo(double * pa)
其中pa
从[0]到[100]填充
要么
pa
仅填充[0]。
我的功能执行以下操作:
foo(double * pa)
{
IF(pa是100的数组)THEN x [0到100] = pa [0到100]
ELSE x [0到100] = pa [0]
}
答案 0 :(得分:4)
那是不可能的。 pa
不是填充,因为它不是数组。它是一个指针,按照惯例,它指向数组的第一个元素。但它的类型只是pointer to double
,它没有关于它是指向单个double,还是1,10,100或1000个元素的数组的信息。
“传统”解决方案是传递两个参数,指针和数组的大小:
void foo(double* pa, size_t arraysize)
{
if (arraysize == 100) {
...
}
else {
...
}
}
答案 1 :(得分:1)
鉴于foo()
函数参数中的信息,无法找到:
pa
为了实现这一目标,您需要将其他参数传递给foo()
函数,该函数说明总数组有多大,以及填充了多少元素。
答案 2 :(得分:1)
问:foo()如何知道pa []是否是100的数组?
一般来说,你必须告诉它。例如:
void
foo (double *pa, int len)
{
if (len == 100)
...
else
...
但是,如果您使用C ++进行编码,则可以使用STL容器,例如vector:
void foo (vector<double> & pa)
{
if (pa.size() == 100)
...
答案 3 :(得分:1)
根据您的previous question,结合这个问题,我认为您可能想要的只是一个过载,请看这里:
void foo_impl(double * x)
{
// common functionality here
}
void foo(double * pa)
{
double x[100];
std::copy(pa, pa + 100, x);
foo_impl(x);
}
void foo(double pa)
{
double x[100];
std::fill(x,x+100,pa);
foo_impl(x);
}
这样,您可以使用指针调用foo,其中假定指向具有至少100个值的数组。或者您可以使用单个值来调用它。将通用功能放在foo_impl
中的两个函数之间,这样就不会重复代码。
答案 4 :(得分:0)
你做不到。唯一foo()
知道pa
的是它是一个指针,无论它是否为空指针,如果它是非空的,它指向的是什么。它无法判断它是指向单个对象还是指向数组的第一个元素。
如果可能,您应该foo()
,因此呼叫者必须传递其他信息:
void foo(double *pa, size_t count) {
/* ... */
}
(注意:你应该声明foo
的返回类型。)