Смешивание C функционирует в классе Objective C

Хорошо, так что, видимо, проблема была в

1.ImShow Требуется кадр для отображения, и «Нет», где в моем коде я присвоил «изображению» значение

  1. Чтобы получить вывод из потока Я должен получить его кадр за кадром, я не могу просто показать весь поток

ошибка: (-215: подтверждение не выполнено) size.width> 0 & amp; & amp; size.height> 0 в функции 'imshow'

#include <stdio.h>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(int argc, char** argv )
{
 VideoCapture vcap;


 const string videoStreamAddress = "udp://<myIp>:<myPort>";

 vcap.open(videoStreamAddress);
 if(!vcap.isOpened())
 {
     printf("nope");
 }
 else
 {
     for(;;)
     {
         Mat frame;
         vcap >> frame;
         imshow("stuff", frame);
         if( waitKey(10) == 27) break;
     }
     printf("Sucsess!");

 }
return 0;
}
39
задан Alex Zavatone 8 March 2016 в 15:46
поделиться

4 ответа

Возможно сочетание методов и функций C и Objective-C. Вот простой пример, в котором API SQLite используется в приложении для iPhone: ( сайт курса )

Загрузите Zip-файл (09_MySQLiteTableView.zip)

Функции C должны быть объявлены вне @implementation в файле Objective-C (.m).

int MyCFunction(int num, void *data)
{
     //code here...
}

@implementation

- (void)MyObjectiveCMethod:(int)number withData:(NSData *)data
{
      //code here
}

@end

Поскольку функция C находится за пределами @implementation , он не может вызывать такие методы, как

[self doSomething]

, и не имеет доступа к ivars.

Это можно обойти, если функция обратного вызова принимает userInfo или параметр типа контекста , обычно типа void * . Это можно использовать для отправки любого объекта Objective-C функции C.

Как и в примере кода , этим можно управлять с помощью обычных операций Objective-C.

Кроме того, прочтите этот ответ: Смешивание функций C в классе Objective-C

49
ответ дан 27 November 2019 в 02:22
поделиться

Чтобы вызвать код Objective-C из обратного вызова C, я бы использовал что-то вроде:

void * refToSelf;
int cCallback()
{
    [refToSelf someMethod:someArg];
}

@implementation SomeClass
- (id) init
{
     self = [super init];
     refToSelf = self;
}
- (void) someMethod:(int) someArg
{
}
26
ответ дан 27 November 2019 в 02:22
поделиться

В этой ситуации я всегда находил полезным создание оболочки Obj-C поверх C API. Реализуйте то, что вам нужно для использования функций C, и создайте класс Objective-C (или два) поверх него, так что это увидит весь внешний мир. Например, в случае такого обратного вызова вы можете создать функцию C, которая вызывает методы делегирования Obj-C для других объектов.

5
ответ дан 27 November 2019 в 02:22
поделиться
-

CAN / Как мне позвонить на объективный метод на месте этого?

Вы не можете.

CAN / I должен смешивать функцию C с моим вызовом Objective-C?

Да. Напишите функцию C и используйте это в качестве обратного вызова к функции CF.

Как смешивать функцию c с методами объектов C?

Вы можете установить Self как Info указатель в вашей структуре контекста. Это будет передано обратный вызов. Затем в обратном вызове, отличайте информацию . Назад к указателю ID :

MyClass *self = (id)info;

Затем вы можете отправить Self сообщения. Вы до сих пор не можете напрямую доступа к переменным экземпляра, хотя, поскольку функция C является вне раздела @implementation . Вам придется сделать их свойствами. Вы можете сделать это с расширением класса . (Вопреки того, что говорит этот документ, вы бы не объявили бы расширение внутри @implementation , но в том же файле с ним, как правило, прямо над ним.)

8
ответ дан 27 November 2019 в 02:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: