@synthesize-ing массив C структур в Objective C 2.0

Когда ejabberd запускается, он использует несколько портов (некоторые для XMPP, другие для дополнительных функций ejabberd, другие для Erlang). Обратите внимание, что некоторые порты могут быть в IPv6:

tcp        0      0 0.0.0.0:42859           0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:4560            0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:epmd            0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:5280            0.0.0.0:*               LISTEN     
tcp6       0      0 [::]:epmd               [::]:*                  LISTEN     
tcp6       0      0 [::]:xmpp-client        [::]:*                  LISTEN     
tcp6       0      0 [::]:xmpp-server        [::]:*                  LISTEN    

Может быть, у вас есть другая предыдущая установка ejabberd, которая там мешала? Или другой XMPP сервер?

6
задан ELLIOTTCABLE 6 February 2009 в 15:23
поделиться

5 ответов

Править: Peter Hosey указал, что массив в C не является тем же самым как указателем. (см. этот документ для деталей). Это объяснило бы ошибку, которую Вы видите и сделали бы код, который я отправил неправильно.

Другой ТАК вопрос, что ссылки gs на в его ответе предлагают обходное решение, которое я скопировал в контексте этого вопроса:

// PlayerState.h:
@interface PlayerState : NSObject 
{
    AudioQueueBufferRef           _buffers[3];
}

@property(readonly) AudioQueueBufferRef * buffers;


// PlayerState.m:
@implementation PlayerState

@dynamic buffers;
- (AudioQueueBufferRef *)buffers { return _buffers; }

@end

Это позволило бы Вам доступу buffers как будто это был указатель на массив AuidoQueueBufferRef объекты.

2
ответ дан 9 December 2019 в 22:40
поделиться

@synthesize buffers сбои для компиляции следующим образом: "ошибка: синтезируемое свойство 'буферы' нужно или назвать тем же как совместимый ivar или должно явно назвать ivar"

Попытка:

@synthesize buffers = _buffers;
4
ответ дан 9 December 2019 в 22:40
поделиться
1
ответ дан 9 December 2019 в 22:40
поделиться

Почему Вы переводите структуру в объект Objective C? Objective C является строгим надмножеством C, таким образом, можно просто использовать данную структуру как есть с Objective C.

[РЕДАКТИРОВАНИЕ] В ответ на Ваши комментарии, компилятор жалуется на mBuffers объявление из-за правил о том, что допустимо как размер статического массива. Правила в C немного более строги, чем правила в C++. Как легкая фиксация, просто измените строку

static const int kNumberBuffers = 3;

в

#define kNumberBuffers 3

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

1
ответ дан 9 December 2019 в 22:40
поделиться

Вы можете либо иметь три буфера ivars (buffer0, buffer1, buffer2), либо сделать его указателем на AudioQueueBufferRefs и отдельно выделить память для хранения трех AudioQueueBufferRefs. Или вы используете NSArray или NSData, если вам нужно переменное количество буферов.

Но, возвращаясь к более широкому контексту, вам, вероятно, не понадобится отслеживать AudioQueBufferRefs. Если вы выберете все три буфера, вы получите указатели на них в аудио очереди вызовов.

У меня есть некоторый аудиокод, который записывает и воспроизводит аудио, и он вызывает AudioQueueAllocateBuffer() и AudioQueueEnqueueBuffer() и после этого практически забывает о буферах.

Если вы пытаетесь написать какао-обертку для AudioQueue, не делайте этого.

Редактирование: Но чтобы ответить на ваш первоначальный вопрос: Вы не можете иметь массив в качестве свойства, потому что это не тип "Plain Ol' Data". Смотрите "Declared Properties" в документации Objective-C 2.0 в Xcode, и это: http://www.fnal.gov/docs/working-groups/fpcltf/Pkg/ISOcxx/doc/POD.html

0
ответ дан 9 December 2019 в 22:40
поделиться