Управление динамически размещаемыми массивами внутри пользовательской структуры - PullRequest
0 голосов
/ 25 октября 2018

Я хотел бы определить пользовательскую структуру, которая содержит два динамически размещаемых целочисленных массива a и b.Чтобы выделить память для массивов и инициализировать массивы значениями, я написал функцию «конструктор» initp.Мой подход представлен ниже.

Пользовательская структура с именем pair:

typedef struct {
    ...
    int  l;  // length of compositions
    int  k;  // no. of elements in compositions
    int *a;  // composition 1
    int *b;  // composition 2
} pair;

Функция для инициализации пользовательской структуры:

int initp(..., int l, int k, int a[], int b[], pair *f) {
    ...
    f->l = l;
    f->k = k;

    // allocate composition arrays
    f->a = (int *) calloc(l, sizeof(int));
    f->b = (int *) calloc(l, sizeof(int));

    // initialise composition arrays
    for (int i = 0; i < k; i++) {
        f->a[i] = a[i];
        f->b[i] = b[i];
    }
}

Вызов функции вОсновная программа:

// initialise pairs
pair f1, f2;
initp(..., 10, 2, (int[]){3, 4}, (int[]){7, 6}, &f1);
initp(..., 10, 1, (int[]){4},    (int[]){9},    &f2);

Моя задача написать «элегантный» код.Поэтому у меня есть следующие вопросы:

  1. Можно ли избежать указания номера "нет"?элементов в массивах a и b переданы в initp?Это параметр k.В приведенных выше примерах это 2 и 1.
  2. Можно ли избежать "явного" приведения с (int[]) в вызове функции?
  3. Пожалуйста, дайте мне знать, если у вас есть общие комментариии критика по улучшению качества кода.

1 Ответ

0 голосов
/ 25 октября 2018

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

Нет.

Альтернатива: создание макроса INITP(l, a, b, f) с помощью макрокоманды определяет, что a, b действительно являются массивами, их элементы массива рассчитывают, гарантируют, что их счетчикиравняется и затем вызывает initp().

Я не фанат этого подхода, но он выполним - с ограничениями.

Примечание: для размер информация,рассмотрим size_t против int.


Можно ли избежать "явного" приведения с (int []) при вызове функции?

С (int[]){3, 4}, (int[]) не является приведением.Это просто форма составного литерала , которая требуется для его формирования.


, если у вас есть общие замечания и критика по поводу улучшения качества кода.

  1. Для рабочего кода рассмотрим Просмотр кода для более глубокого анализа.

  2. Я бы назначил каждый массивпо очереди - как правило, быстрее или быстрее, чем чередование.

     memcpy(f->a, a, sizeof f->a[0] * k);
     memcpy(f->b, b, sizeof f->b[0] * k);
    
  3. Обработка ошибок выделения.

  4. Создание initp() компаньона, подобного void uninitp(pair *f).

  5. Улучшение распределения для ясности, обзора и обслуживания.

    // f->a = (int *) calloc(l, sizeof(int));
    f->a = calloc(l, sizeof f->a[0]);
    
  6. const, restrict соображений.

Хммм, это слишком полный обзор, поэтому закончим сейчас.

...