Как получить количество используемых элементов массива структур в C? - PullRequest
2 голосов
/ 05 декабря 2011

Скажи, что у меня есть:

struct a b[4];
//i filled some elements of b

Мне нужно знать количество непустых элементов b. Поскольку я не уверен, имеет ли b ровно 4 непустых элемента, есть ли способ сделать это?

Ответы [ 6 ]

3 голосов
/ 05 декабря 2011

нет способа получить эту информацию.Вы должны следить за количеством элементов, которые вы используете сами.

Как правило, разработчики C используют другое целое значение рядом с массивом:

struct a b[4];
int      b_count;

увеличивает счетчик каждый раз, когда вы заполняетеэлемент в массиве.

Вы можете обернуть все это в структуру, чтобы счетчик был рядом с массивом.это позволяет вам возвращать массив вместе со счетчиком из функции:

struct array {
    struct a values[4];
    int      count;
};
struct array b;
2 голосов
/ 05 декабря 2011

Есть два обычных способа сделать это.

Первый - иметь какое-то значение часового, которое указывает, что элемент массива не используется.Например, если вы храните количества в целом числе, вы можете использовать значение -1, чтобы указать, что оно не используется.

В качестве более подходящего примера для вашей ситуации:

struct a {
    int inUse;
    // all other fields in structure
};

и установите inUse в элементе массива на 1 или 0 в зависимости от того, используется ли этот элемент массива.

Вторым является сохранение дополнительной информации вне массива дляуказать, какие элементы были использованы.Это может быть карта, если информация об использовании была редкой, или просто счетчик, если вы могли гарантировать, что активные элементы будут смежными в начале.

Для карты вы можете использовать:

struct a b[4];
int inUse[4];    // shows inUse indication for each element.

Для более простой вариации счета:

struct a b[4];
int inUseAtStart;   // 0 thru 4 shows how many elements are in use,
                    //   starting at b[0].
1 голос
/ 05 декабря 2011

Вам нужно будет отслеживать, сколько элементов массива вы используете при его заполнении.Обратите внимание, что вам придется (== необходимо) сделать это, потому что в c нет проверки границ для массивов, поэтому вы должны следить за тем, чтобы не превысить границы массива (вы заканчиваетес неопределенным поведением, если вы этого не сделаете), при этом вы можете легко отслеживать, сколько элементов вы использовали.

1 голос
/ 05 декабря 2011

Нет такого пустого или непустого различия в C. То, что вы описываете как пусто , может относиться к неинициализированным переменным.

0 голосов
/ 05 декабря 2011

Одна вещь, которую вы можете сделать, это пометить следующий элемент после последнего вставленного элемента. Например, вы использовали 2 элемента, тогда вы можете пометить третий элемент конкретными данными, такими как -1.

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

0 голосов
/ 05 декабря 2011

C не будет создавать никаких накладных расходов в своих массивах и, следовательно, не будет хранить никакой дополнительной информации, включая количество элементов.Для этого есть приличный шаблон c ++ std :: vector, если вы не хотите делать это сами (что может раздражать), и если вы хотите использовать c ++, просто произнесите:)

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