Как узнать, заполнен ли массив указателей в C ++ / C - PullRequest
0 голосов
/ 07 августа 2011

Предположим, у меня есть функция

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]

} ​​

Ответы [ 5 ]

4 голосов
/ 07 августа 2011

Это невозможно. pa не заполнено , потому что это не массив. Это указатель, который, по соглашению, указывает на первый элемент массива. Но его тип просто pointer to double, и он не имеет информации о том, указывает ли он на один двойной тип или массив из 1, 10, 100 или 1000 элементов.

«Традиционным» решением было бы передать два параметра, указатель и размер массива:

void foo(double* pa, size_t arraysize)
{
    if (arraysize == 100) {
        ...
    }
    else {
        ...
    }
}
1 голос
/ 07 августа 2011

Исходя из вашего предыдущего вопроса , в сочетании с этим вопросом, я думаю, что вам может понадобиться просто перегрузка, см. Здесь:

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, чтобы не дублировать код.

1 голос
/ 07 августа 2011

Q: Как foo () узнает, является ли pa [] массивом 100?

В общем, вы должны СКАЗАТЬ это. Например:

void
foo (double *pa, int len)
{
  if (len == 100)
    ...
  else
    ...

Однако, если вы программировали на C ++, вы могли бы использовать контейнер STL, такой как вектор:

void foo (vector<double> & pa)
{
  if (pa.size() == 100)
    ...
1 голос
/ 07 августа 2011

Учитывая информацию в параметрах функции foo(), невозможно выяснить:

  • количество элементов, которые «залиты»
  • общее количество элементов в массиве, на которое указывает pa

Чтобы выполнить это, вам нужно будет передать дополнительные параметры в функцию foo(), которые определяют размер всего массива и количество заполненных элементов.

0 голосов
/ 07 августа 2011

Вы не можете. Единственное, что foo() знает pa, это то, что это указатель, является ли он нулевым указателем или нет, и если он не нулевой, на что он указывает. Он не может определить, указывает ли он на один объект или на первый элемент массива.

Если возможно, вам, вероятно, следует foo(), поэтому вызывающий должен передать дополнительную информацию:

void foo(double *pa, size_t count) {
    /* ... */
}

(Примечание: вы должны объявить тип возврата foo.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...