Гибкие члены массива на iOS в Objective-C++

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

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

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

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


person griotspeak    schedule 08.04.2011    source источник
comment
Почему так много языковых тегов? Если вы хотите получить ответ на языке Objective C++, пометьте его как таковой и только как таковой.   -  person unwind    schedule 08.04.2011
comment
Извиняюсь, я подумал, что это связано, поэтому может быть полезно, если пометить их все.   -  person griotspeak    schedule 08.04.2011


Ответы (2)


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

ОБНОВИТЬ

Я хочу иметь список времени начала заметок (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, тогда просто используйте это.

person justin    schedule 08.04.2011
comment
Я хочу иметь список времени начала заметок (uint64_t) и перебирать их, чтобы увидеть, какое из них играет. я собирался добавить переменную count в структуру, чтобы отслеживать количество элементов в гибком массиве. - person griotspeak; 08.04.2011
comment
о, мой, это очень сильный ответ! Мне нужно немного больше изучить C++, чтобы понять его, но это не ваша проблема. - person griotspeak; 08.04.2011
comment
да, шаблоны позволяют указывать (среди прочего) тип и числовые аргументы для объектов и функций. это позволяет вам очень легко создавать эффективные/универсальные/многоразовые/типобезопасные программы. это очень простой пример использования шаблона. Темы шаблонов и приложения могут быть чрезвычайно сложными (например, см. www.boost.org для более сложного использования). удачи - person justin; 09.04.2011

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

person rlibby    schedule 08.04.2011