C - количество элементов в массиве? - PullRequest
6 голосов
/ 28 июля 2011

Предположим, что у меня есть следующая c функция:

int MyFunction( const float arr[] )
{
    // define a variable to hold the number of items in 'arr'
    int numItems = ...;

    // do something here, then return...

    return 1

}

Как мне получить numItems количество элементов в массиве arr?

Ответы [ 7 ]

11 голосов
/ 28 июля 2011

К сожалению, вы не можете получить это.В Си следующие 2 являются эквивалентными объявлениями.

int MyFunction( const float arr[] );
int MyFunction( const float* arr );

Вы должны передать размер самостоятельно.

int MyFunction( const float* arr, int nSize );

В случае char указателей, обозначающих строки, длинамассив символов определяется разделителем '\0'.

5 голосов
/ 28 июля 2011

Я изначально предложил это:

 int numItems = sizeof(arr)/sizeof(float);

Но это не будет работать , поскольку arr не определено в текущем контексте и интерпретируется как простой указатель. Так что в этом случае вам нужно будет указать количество элементов в качестве параметра . В противном случае предлагаемое утверждение будет работать в следующем контексте:

int MyFunction()
{
     float arr[10];
     int numItems = sizeof(arr)/sizeof(float);
     return numItems;// returns 10
}
5 голосов
/ 28 июля 2011

Либо вы передаете число элементов в другом аргументе, либо у вас есть какое-то соглашение в отношении элемента-разделителя в массиве.

2 голосов
/ 28 июля 2011

Как я уже сказал в комментарии, передача его в качестве другого аргумента представляется единственным решением. В противном случае вы можете иметь глобально определенное соглашение.

2 голосов
/ 28 июля 2011

Вы не можете.Номер должен быть передан MyFunction отдельно.Поэтому добавьте второй аргумент в MyFunction, который должен содержать размер.

1 голос
/ 28 июля 2011

лучше чем

int numItems = sizeof(arr)/sizeof(float);

есть

int numItems = sizeof(arr)/sizeof(*arr);
1 голос
/ 28 июля 2011

Это невозможно, если у вас нет определенного формата массива.Потому что потенциально вы можете иметь любое количество поплавков.А с const float arr[] вы передаете только базовый адрес массива функции типа float [], которая не может быть изменена.Таким образом, вы можете сделать arr[n] для любого n.

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