Найти количество записей в массиве структур - PullRequest
0 голосов
/ 02 мая 2018

Предположим, у нас есть структурный массив до 50 элементов, который будет добавлен по очереди из функции записи в буфер. Как узнать текущее количество записей, сделанных в массиве, если максимальное количество элементов не было достигнуто?

typedef struct
{
    remoteInstructionReceived_t instruction;
    uint16_t parameter;
} instructionData_type;

remoteInstructionReceived_t commandBuffer[50];

Ответы [ 3 ]

0 голосов
/ 02 мая 2018

C массивы фиксированного размера: в вашем массиве всегда ровно 50 объектов. Если логика вашей программы требует, чтобы некоторые из них были «неактивными» (например, еще не написаны), вы должны отслеживать такую ​​информацию отдельно. Например, вы можете использовать переменную size_t для хранения количества «допустимых» записей в массиве.

В качестве альтернативы можно указать значение remoteInstructionReceived_t в качестве терминатора, аналогично тому, как 0 используется в качестве терминатора для строк, заканчивающихся NUL. Тогда вам не нужно было бы отдельно отслеживать «полезную длину» массива, но вы должны убедиться, что терминатор всегда следует за последним действительным элементом в нем.

В общем, отслеживание длины, скорее всего, более эффективно и более легко обслуживаемо. Я упоминаю только второй (терминатор) вариант из чувства полноты.

0 голосов
/ 04 мая 2018

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

0 голосов
/ 02 мая 2018

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

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

...