Как передать переменное число аргументов в функцию с переменным числом - PullRequest
3 голосов
/ 16 января 2011

У меня есть переменная функция с сигнатурой:

- (id)initWithNumVertices:(NSUInteger)inCount, ...;

Но я не могу понять, как построить часть многоточия из переменной числа вершин.Как это можно сделать?

РЕДАКТИРОВАТЬ: извините, я не спрашивал, как написать эту функцию, я прошу способ вызвать ее, используя неизвестное числопеременные.Функция принимает структуры, а не объекты.

Если число аргументов известно, я могу сделать это:

[[MyObject alloc] initWithNumVertices:4, v[0], v[1], v[2], v[3]];

Но как я могу вызвать это, когда число вершин неизвестно?

Ответы [ 4 ]

4 голосов
/ 16 января 2011

Я не думаю, что можно вызывать функцию с переменным числом аргументов, если число аргументов не известно во время компиляции.Если вы хотите избежать затрат на использование NSArray, стандартный способ передачи нескольких структур C в метод будет использовать стандартные массивы C.

- (id)initWithVertices:(Vertex *)vertices count:(NSUInteger)count;

NSIndexPath s -indexPathWithIndexes:length:пример, где этот шаблон также используется, есть и другие, он довольно распространен в Какао.

1 голос
/ 16 января 2011

Редактировать: Просто используйте собственный массив Си.Вариаичный метод здесь вам не поможет.


В вашем случае, поскольку у вас есть неопределенное количество аргументов, вам придется переписать его в следующем виде:

- (id)initWithVertices:(vertex)firstVertex;

, который запускает цикл while до тех пор, пока не достигнет вершины, указанной как недопустимой (это будет ваша точка останова), примерно так:

vertex currentVertex, invalidVertex = // some invalid value, like {-1, -1}
while ((currentVertex = va_arg(args, vertex) != invalidVertex) {
    // initialization code with the current vertex
    // when we hit 'invalidVertex', which will be at the end of the list, stop
}  

Код, подобный этому, должен быть запущен так:*

[[MyObject alloc] initWithVertices:firstVertex, secondVertex, thirdVertex, nullVertex];

nullVertex должен находиться в конце списка, чтобы указать последнюю из допустимых вершин (так же, как метод NSArray s arrayWithObjects: должен иметь nil в концесписка).

0 голосов
/ 16 января 2011

Если вы этого еще не сделали, посмотрите на libffi (`man ffi '):

ОПИСАНИЕ Интерфейс сторонней функции предоставляет механизм, с помощью которого функция может генерировать вызов другой функции во время выполнения.не требуя знания интерфейса вызываемой функции во время компиляции.

Вы сможете вызывать objc_msgSend(), используя это, если я правильно понимаю.

0 голосов
/ 16 января 2011

Вы спрашиваете, как разделить аргументы?

[[YourObject alloc] initWithNumVertices:7, 8, 9, 10];

РЕДАКТИРОВАТЬ |О, я думаю, я понимаю, что вы спрашиваете.Вы хотите вызвать этот метод динамически, например, с помощью objc_msgSend() или с помощью NSInvocation?Не обращайте внимания на мой ответ, если это так.

...