Гибкие члены массива на iOS в Objective-C ++ - PullRequest
0 голосов
/ 08 апреля 2011

Я работаю над некоторым базовым аудиокодом, и у меня есть проблема, которая может быть решена с помощью массива переменных в структуре - а-ля Flexible Array Members. Немного оглядываясь по сторонам, я вижу, что существует много диалогов о переносимости и жизнеспособности гибких массивов участников.

Насколько я понимаю, Objective-C совместим с C99. По этой причине я считаю, что Flexible Array Members должны быть хорошим решением. Я также вижу, что Flexible Array Member не очень хорошая идея в C ++.

Что делать в Objective-C ++? Технически я не буду использовать его в Objective-C ++. Я пишу обратные вызовы, которые основаны на C и C ++ ... Это похоже на точку зрения.

В любом случае, я могу (должен ли я) сделать это? Если нет, есть ли другой метод с такими же результатами?

Ответы [ 2 ]

1 голос
/ 08 апреля 2011

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

0 голосов
/ 08 апреля 2011

не беспокойся. это не совместимо это грязно и подвержено ошибкам. У c ++ были решения, которыми легче управлять задолго до того, как эта функция существовала. что вы прикрепляете к концу своей структуры? обычно вы просто используете что-то вроде std :: vector, std :: array или array фиксированного размера.

UPDATE

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

хорошо, тогда массив фиксированного размера должен подойти, если у вас фиксированная полифония. вам не понадобится более одного такого массива в большинстве синтезаторов iOS. Конечно, размеры массива 'предстоящие заметки' могут варьироваться в зависимости от синтезатора приложения? пробник? секвенсор? живой ввод?

template <size_t NumNotes_>
class t_note_start_times {
public:
    static const size_t NumNotes = NumNotes_;
    typedef uint64_t t_timestamp;

    /*...*/

    const t_timestamp& timestampAt(const size_t& idx) const {
        assert(this->d_numFutureNotes <= NumNotes);
        assert(idx < NumNotes);
        assert(idx < this->d_numFutureNotes);
        return this->d_startTimes[idx];
    }
private:
    t_timestamp d_presentTime;
    size_t d_numFutureNotes; // presumably, this will be the number of active notes,
                             // and values will be compacted to [0...d_numFutureNotes)
    t_timestamp d_startTimes[NumNotes];
};

// in use       
const size_t Polyphony = 16;
t_note_start_times<Polyphony> startTimes;
startTimes.addNoteAtTime(noteTimestamp); // defined in the '...' ;)
startTimes.timestampAt(0);

Если вам нужен массив динамического размера, который может быть очень большим, используйте вектор. если вам нужен только один экземпляр этого и максимальная полифония равна (скажем) 64, то просто используйте это.

...