Программирование на интерфейс говорит: «Мне нужна эта функциональность, и мне все равно, откуда она».
Рассмотрим (на Java) интерфейс List
по сравнению с ArrayList
и LinkedList
конкретных классов. Если все, о чем я забочусь, это то, что у меня есть структура данных, содержащая несколько элементов данных, к которым я должен обращаться через итерацию, я бы выбрал List
(и это 99% времени). Если я знаю, что мне нужно вставить / удалить постоянное время с любого конца списка, я бы выбрал конкретную реализацию LinkedList
(или, более вероятно, использовать интерфейс Queue ). Если я знаю, что мне нужен произвольный доступ по индексу, я бы выбрал конкретный класс ArrayList
.
Вы на правильном пути. Однако нет «гибкой структуры». Вы хотите использовать элемент гибкого массива (avail с C99) в struct
:
typedef struct {
int age;
size_t name_size; // size of the array, not length of the name!
char name[]; // Flexible array member
} Structure;
int main(void) {
Structure *one = malloc(sizeof(*one) + SIZE_OF_NAME_ARRAY);
}
Примечание. Я добавил поле name_size. C не сохраняет размер выделенных массивов, поэтому вам может понадобиться это для безопасной копирования / сравнения и т. Д. (Предотвратите переполнение буфера).
Использование *one
делает этот термин независимым от используемого фактического типа. Размер такой структуры такой, как если бы в элементе были нулевые элементы. Тем не менее, он будет правильно выровнен, поэтому он может отличаться от того же struct
без массива.
Также обратите внимание, что вы должны изменить выделенный размер, если используете другой, чем массив char
, чтобы что-то вроде sizeof(element_type) * ARRAY_SIZE
. Это не обязательно для char
s, так как их размер определяется стандартом как 1
.
Мое предположение: гибкая структура была бы той, которая могла бы обрабатывать любой возраст и любое имя.
Поле unsigned int
обрабатывало бы любой возраст (в пределах разумного).
Поле char *
будет обрабатывать любое имя.
Сама структура была бы:
struct nameAge { unsigned int age; char * pName; };
экземпляр структуры был бы:
struct nameAge myNameAge;
Установка поля age
:
myNameAge.age = ageValue;
Установка поля name
будет:
myNameAge.name = malloc( numCharactersInName+1 );
strcpy( myNameAge.name, nameString );
Как код, полученный для ageValue для возраста и / или символов для NameString, соответствует программисту принять решение / реализации.
signed short
все еще будет более чем достаточным? (Для астрономических возрастов даже uint32_t
будет слишком маленьким, otoh).
– too honest for this site
29 August 2015 в 19:14