Verwenden Sie C Struct in Objective C

Lesezeit: 4 Minuten

Benutzer-Avatar
Paul Simmons

In einem Xcode-Projekt habe ich eine C-Datei mit Funktionen, die kompiliert und funktioniert

Ich möchte meinen C-Code in Struct(s) verpacken, wie kann ich sie in Objective-C aufrufen?

  • @Jonathan Sterling: Es ärgert mich auch. Es ärgert mich auch, wenn Leute von Xcode oder Cocoa als Sprache oder Objective-C als Framework sprechen.

    – Traumlax

    31. Januar 2010 um 20:06 Uhr

  • Übrigens, danke an @Perspx für die Behebung dieser Probleme. Lassen Sie uns nun diese Diskussion fallen lassen und zur Beantwortung von Pauls Frage übergehen. 🙂

    – Jonathan Sterling

    31. Januar 2010 um 20:22 Uhr

  • Können Sie bitte ein Beispiel dafür geben, was Sie mit “C-Code, der in eine Struktur eingeschlossen ist” meinen?

    – VoidPointer

    31. Januar 2010 um 22:51 Uhr

  • Weißt du, was mich mehr ärgert als all das? Xcode und Objective-C!

    – matt

    1. Februar 2010 um 1:48 Uhr

  • Wenn Sie C verwenden möchten, schauen Sie sich vielleicht an extern

    – Matej

    9. März 2013 um 10:26 Uhr

Benutzer-Avatar
Luca Matteis

Objective-C ist eine echte Obermenge von C. Alles, was Sie in C tun können, kann in Objective-C identisch ausgeführt werden. Sie müssen sie sich also wirklich nicht als unterschiedliche Sprachen vorstellen; Objective-C ist einfach “C plus etwas mehr Zeug”.

// this struct is compatible with C and Obj-C
struct fruit {
    int a;
};

int main()
{
    struct fruit apple;
    apple.a = 1;

    return 0;
}

Dann kann jede C- oder Objective-C-Quelldatei auf diese Struktur zugreifen. Es gibt keine zusätzlichen Komplikationen, die durch Objective-C eingeführt werden.

  • +1 für treffende Definition. Mag “C plus noch ein paar Sachen”..kann “C für Apple” sein

    – DD_

    21. Januar 2013 um 8:53 Uhr

  • Wenn ich eine Struktur definieren und in der gesamten Anwendung verwenden möchte – in welcher Datei muss ich sie definieren? Codierungsstandards weise

    – Gal Marom

    29. Juli 2014 um 11:40 Uhr

  • Sollte dies in einer .h-Datei definiert werden, wenn ich die Struktur in der gesamten Anwendung in anderen Dateien verwenden möchte?

    – SolveSoul

    21. Juni 2017 um 13:39 Uhr

Deklarieren Sie Funktionszeiger, fügen Sie sie Ihrer Struktur hinzu und rufen Sie sie dann auf, es ist nur C.

Beispiel:

//Typedef 2 function pointers, first takes and returns int,
// second takes and returns double
typedef int    (*FuncPtrInt)   (int);
typedef double (*FuncPtrDouble)(double);

// create structure to store function pointers
struct ABC
{
    FuncPtrInt    applyA;
    FuncPtrDouble applyB;
};

// create some functions to use with structure
int incrFuncA(int num) { return ++num; }
double decrFuncB(double num) { return --num; }
double multiplyFuncB(double num) { return num*num; }

// try it out
void testStruct()
{
    struct ABC abc;
    abc.applyA = incrFuncA;
    abc.applyB = decrFuncB;

    NSLog(@"increment: %d",abc.applyA(3));
    NSLog(@"decrement: %f",abc.applyB(3.5));

    abc.applyB = multiplyFuncB;

    NSLog(@"multiply: %f",abc.applyB(3.5));
}

Ausgabe:

2010-02-01 10:36:22.335 x[11847] increment: 4
2010-02-01 10:36:22.336 x[11847] decrement: 2.500000
2010-02-01 10:36:22.336 x[11847] multiply: 12.250000

Wenn Sie eine Struktur mit Funktionen haben möchten, bei denen Funktionen auf der Struktur arbeiten, müssen Sie standardmäßig den Zeiger auf diese Funktion übergeben (ähnlich wie es C++ tut):

Definieren:

struct ClassABC;
typedef int (*FuncPtrClassABC)(struct ClassABC *);
typedef int (*FuncPtrClassABCInt)(struct ClassABC *, int);

int incrFunc(struct ClassABC * abc);
int decrFunc(struct ClassABC * abc);
int addFunc(struct ClassABC * abc, int num);
int subtractFunc(struct ClassABC * abc, int num);

struct ClassABC
{
    int i;
    FuncPtrClassABC    increment;
    FuncPtrClassABC    decrement;
    FuncPtrClassABCInt add;
    FuncPtrClassABCInt subtract;
};

Wie Sie sehen können, könnten diese Funktionen eigenständig sein, Sie würden immer noch das ClassABC übergeben:

int incrFunc(struct ClassABC * abc) { return ++(abc->i); }
int decrFunc(struct ClassABC * abc) { return --(abc->i); }
int addFunc(struct ClassABC * abc, int num)
{ abc->i += num; return abc->i; }
int subtractFunc(struct ClassABC * abc, int num)
{ abc->i -= num; return abc->i; }

Initialisierungshilfsfunktion:

void initClassABC(struct ClassABC * abc)
{
    abc->i = 0;
    abc->increment = incrFunc;
    abc->decrement = decrFunc;
    abc->add = addFunc;
    abc->subtract = subtractFunc;
}

Verwendungszweck:

struct ClassABC cabc;
initClassABC(&cabc);

cabc.add(&cabc,4);
NSLog(@"add: %d", cabc.i);

cabc.decrement(&cabc);
NSLog(@"decrement: %d", cabc.i);

cabc.subtract(&cabc,2);
NSLog(@"subtract: %d", cabc.i);

Ausgabe:

2010-02-01 10:56:39.569 x[12894] add: 4
2010-02-01 10:56:39.569 x[12894] decrement: 3
2010-02-01 10:56:39.569 x[12894] subtract: 1

Genießen

  • Im zweiten Fall könnten die Funktionen eigenständig sein, aber da Sie Code in Strukturen einschließen wollten, ist dies eine Möglichkeit, dies zu tun.

    – stefanB

    1. Februar 2010 um 0:06 Uhr

  • Sie könnten in diesem Fall object-c++ verwenden. Ich denke, Sie können einfach c++-Strukturen verwenden, bei denen Methoden Zugriff auf Strukturvariablen haben, wie in c++ class/struct.

    – stefanB

    1. Februar 2010 um 0:13 Uhr

1354950cookie-checkVerwenden Sie C Struct in Objective C

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy