Объясните этот синтаксис массива C - PullRequest
0 голосов
/ 16 ноября 2010

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

1)

AudioBufferList *bufferList;

        bufferList = (AudioBufferList *) malloc (
                                                 sizeof (AudioBufferList) + sizeof (AudioBuffer) * (channelCount - 1)
                                                 );

Строка 1, здесь я понимаю. Что я не понимаю, так это все, начиная с sizeof. Единственное значение, которое я точно знаю, что это здесь, это channelcount. Что здесь делает sizeof и какие значения размера могут AudioBufferList и AudioBuffer передавать ему? Есть постоянные значения или что-то?

2)


 bufferList->mNumberBuffers = channelCount;

        // initialize the mBuffers member to 0
        AudioBuffer emptyBuffer = {0};
        size_t arrayIndex;
        for (arrayIndex = 0; arrayIndex < channelCount; arrayIndex++) {
            bufferList->mBuffers[arrayIndex] = emptyBuffer;
        }

        // set up the AudioBuffer structs in the buffer list
        bufferList->mBuffers[0].mNumberChannels  = 1;
        bufferList->mBuffers[0].mDataByteSize    = totalFramesInFile * sizeof (AudioUnitSampleType);
        bufferList->mBuffers[0].mData            = soundStructArray[audioFile].audioDataLeft;

        if (2 == channelCount) {
            bufferList->mBuffers[1].mNumberChannels  = 1;
            bufferList->mBuffers[1].mDataByteSize    = totalFramesInFile * sizeof (AudioUnitSampleType);
            bufferList->mBuffers[1].mData            = soundStructArray[audioFile].audioDataRight;
        }

Что делает ->?

Что означает size_t? Также mBuffers является какой-то системной константой?

Ответы [ 4 ]

3 голосов
/ 16 ноября 2010

Это не объективный C, а всего лишь C

sizeof, возвращающий размер типа данных (статический компилятором)

ссылка в википедии:

1 голос
/ 16 ноября 2010

Это почти исключительно синтаксис c, и если вы запутались в этом коде, вы должны получить хорошую ссылку на c.Вместо объяснения различных битов, я могу порекомендовать отличный справочник: Справочное руководство CA.

0 голосов
/ 22 октября 2015

Начиная с предложенных выше замечательных комментариев и прочтений, которые необходимо изучить, возможно, не лишним будет упомянуть, что код, который вы пытаетесь понять, представляет собой CoreAudio код, API, который полностью написано в обычный C , хотя сам по себе далеко не простой.

Дополнительная литература, которую вы можете найти полезной для чтения, может быть:

Адамсон / Авила: Обучение основному аудио Практическое руководство по программированию звука для Mac и iOS

ISBN-13: 978-0321636843

ISBN-10: 0321636848

Надеюсь, это поможет вам в обучении.

0 голосов
/ 16 ноября 2010

Как отмечали несколько других авторов, это больше C, чем Objective-C.Может быть полезным поиск хорошего учебника по C (книга C & R всегда хороший выбор).Однако, чтобы ответить на несколько ваших вопросов:

Что я не понимаю, так это все, начиная с "sizeof".Единственное значение, которое я точно знаю, что это здесь, это "channelcount".Что здесь делает sizeof и какие значения размера могут передавать AudioBufferList и AudioBuffer?Существуют ли постоянные значения или что-то еще?

sizeof - это оператор C (несмотря на то, что он выглядит как функция), который возвращает размер в байтах данного типа данных.malloc - это функция, которая выделяет память, поэтому в этой строке в основном говорится: «выделите достаточно памяти для AudioBufferList, AudioBuffer и необходимых мне каналов и верните указатель на выделенную область памяти».

Что делает "->"?

Он получает член структуры через указатель.В C структура похожа на объект Objective-C: она имеет членов , которые в основном похожи на переменные экземпляра в Objective-C.В Objective-C, если вы хотите вызвать метод myValue, вы должны сделать [obj myValue];в C, если у вас есть указатель на структуру и вы хотите получить значение my_value, вы должны сделать obj->my_value, что в основном совпадает с (*obj).my_value, что говорит "получить объект, на который указывает obj, и найдите в нем элемент my_value ".

Что означает" size_t "?

size_t является распространенным типом данных C.На большинстве платформ он «определен по типу» как unsigned int или unsigned long и используется для представления размеров объектов независимо от платформы.

Также есть "mBuffers "какая-то системная константа?

Нет;это член (помните, вроде как переменная экземпляра) bufferList, который, вероятно, является типом данных AudioBufferList.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...