bekomme es mit withCString nicht hin

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Rabattcode für die heise MacDev 2020: Macoun20

Aufgrund der Corona-Krise: Die Veröffentlichung von Stellenangeboten und -gesuchen ist bis 31.12.2020 kostenfrei. Das beinhaltet auch Angebote und Gesuche von und für Freischaffende und Selbstständige.

  • bekomme es mit withCString nicht hin

    Hallo,

    ich brauche für eine C-Funktion einer C-Library einen ganz normalen C-String

    C-Quellcode

    1. void function doIt(char* s) {
    2. doSomethingWith(s);
    3. }


    dies klappt mit withCString, wie ich gelernt habe.

    Quellcode

    1. var s = "Beispiel"
    2. s.withCString { ( ptr: UnsafePointer<Int8>) -> Void in
    3. // Do something with ptr
    4. doIt( ptr)
    5. }
    was ich aber nicht hinbekomme, ist es, das Encoding noch zu verändern. es gibt zwar die entsprechenden Funktionen:

    Quellcode

    1. func withCString<Result, TargetEncoding>(encodedAs targetEncoding: TargetEncoding.Type, _ body: (UnsafePointer<TargetEncoding.CodeUnit>) throws -> Result) rethrows -> Result where TargetEncoding : _UnicodeEncoding
    2. func withCString<Result, Encoding>(encodedAs targetEncoding: Encoding.Type, _ body: (UnsafePointer<Encoding.CodeUnit>) throws -> Result) rethrows -> Result where Encoding : _UnicodeEncoding
    aber ich werde aus der Dokumentation nicht schlau und bekomme es nicht hin. Was sollen diese Erklärungen bedeuten?

    Gruß und danke,

    fiveyears
  • Hallo!

    Ich wollte das aus Interesse mal ausprobieren. Klappte leider nicht.

    Quellcode

    1. void function doIt(char* s) {
    2. doSomethingWith(s);
    3. }

    Mit function klappt das bei mir nicht.
    Zudem muss der Parametertyp bei mir const char* sein, damit ich in Swift mit UnsafePointer<Int8> arbeiten kann und nicht
    UnsafeMutablePointer<Int8> erwartet wird, was mit withCString nicht kompatibel ist.
    Folgender Swift-Code läuft bei mir:

    Quellcode

    1. let s = "Beispiel"
    2. let res = s.withCString { (ptr: UnsafePointer<Int8>) -> Result<Any, Error> in
    3. return Result() {
    4. doIt(ptr)
    5. return 1
    6. }
    7. }
    In meiner C-Funktion gebe ich die übergebenen Daten nur mit printf aus.

    Mein Versuch, das mit Encoding zu machen führt zu Fehlermeldungen.

    Quellcode

    1. let res2 = s.withCString(encodedAs: Unicode.UTF16)
    2. {
    3. (ptr: UnsafePointer<Int16>) -> Result<Any, Error> in
    4. return Result() {
    5. doIt3(ptr)
    6. return 1
    7. }
    8. }

    Quellcode

    1. void doIt3(const short* s);
    Fehlermeldung in Zeile 2 des obigen Swiftcodes verstehe ich nicht mehr.

    Quellcode

    1. Cannot convert value of type '(UnsafePointer<Int16>) -> Result<Any, Error>' to expected argument type '(UnsafePointer<_>) -> _'

    Wenn ich es mit UTF8 statt UTF16 und der entsprechenden C-Funktion versuche, bekomme ich fast die gleiche Meldung.
    Offenbar liegt es an den strengen Typsicherheit und den manchmal nicht leicht verständlichen Typen.

    Vielleicht hat jemand anders hier eine Erklärung.