Schnelle Zeigerprobleme mit MACH_TASK_BASIC_INFO

7

Ich versuche, eine ObjC-Stackoverflow-Antwort in Swift und fehlgeschlagen zu konvertieren. Es sieht so aus, als ob ich ein UnsafeMutablePointer<mach_msg_type_number_t> übergebe, wenn ich ein inout mach_msg_type_number_t weitergeben sollte und ich mein Problem nicht lösen kann. Soweit ich die Swift-Pointer-Dokumentation verstehe (nicht viel) sollten diese austauschbar sein.?

Weitere Informationen unten.

Hier ist das Ziel C:

%Vor%

und hier ist so weit wie ich in Swift (viele Zeilen für eine einfachere Typprüfung)

%Vor%

Die task_info Signatur lautet:

%Vor%

und der Fehler in der letzten Zeile ist:

%Vor%     
tobygriffin 18.12.2014, 22:26
quelle

4 Antworten

10

Bei der Interaktion mit C-Funktionen können Sie sich nicht auf die Fehlermeldungen des Compilers verlassen. Teilen Sie den Parameter nach Parametern auf, klicken Sie auf den Befehl, bis Sie wissen, mit was Sie arbeiten. Die Typen, mit denen Sie beginnen, sind:

  • task_name_t : UInt32
  • task_flavor_t : UInt32
  • task_info_t : UnsafeMutablePointer<Int32>
  • UnsafeMutablePointer<mach_msg_type_number_t> : UnsafeMutablePointer<UInt32>
  • kern_return_t - Int32

Es gibt ein kniffliges Swift-Bit und einen Bug in deinem Code, der hier im Weg steht. Erstens muss der Parameter task_info_out ein UnsafeMutablePointer<UInt32> sein, muss aber auf eine Instanz von mach_task_basic_info zeigen. Wir können das umgehen, indem wir ein UnsafeMutablePointer<mach_task_basic_info> erstellen und es zum Zeitpunkt des Aufrufs in ein anderes UnsafeMutablePointer einschließen. Der Compiler verwendet Typinferenz, um zu wissen, dass der Wrapping-Zeiger als% untergeteilt werden soll. co_de%.

Zweitens rufen Sie UInt32 (den Zeiger auf sizeof(mach_task_basic_info_t) ) auf, wenn Sie mach_task_basic_info aufrufen sollten, damit Ihre Byteanzahl zu niedrig ist, um die Datenstruktur zu halten.

Bei weiteren Untersuchungen wurde das etwas komplizierter. Der ursprüngliche Code dafür war falsch, da sizeinfo(mach_task_basic_info) auf die Konstante size initialisiert werden sollte. Leider ist das ein Makro, keine einfache Konstante:

%Vor%

Swift importiert diese nicht, also müssen wir es selbst neu definieren. Hier ist Arbeitscode für all das:

%Vor%     
Nate Cook 19.12.2014, 04:33
quelle
21

Ich habe ein bisschen gebraucht, um die Antwort von Airspeed Velocity auf die neueste schnelle Syntax zu aktualisieren (Swift 3, Beta 6), aber hier ist, was ich habe:

%Vor%

Ich hoffe, das ist hilfreich.

    
Jerry 19.08.2016 22:46
quelle
7

Nates Antwort ist ausgezeichnet, aber es gibt eine Feinabstimmung, die Sie machen können, um es zu vereinfachen.

Erstens, anstatt den task_basic_info -Zeiger zuzuweisen / freizugeben, können Sie die Struktur auf dem Stapel erstellen und dann withUnsafeMutablePointer verwenden, um einen Zeiger direkt darauf zu bekommen, den Sie übergeben können.

%Vor%     
Airspeed Velocity 22.04.2015 12:08
quelle
1

Airspeed Velocity Antwort in Swift 3 ...

%Vor%     
zackpep 03.04.2017 19:24
quelle

Tags und Links