2015-11-17 4 views
2

Я разрабатываю приложение OS X Swift для разбора cvs-файлов. Он успешно работает в Objective-C. Затем я перешел на Swift и для улучшения производительности я разработал механизм синтаксического анализа/импорта в C. Он в 5 раз быстрее, чем в Swift или Objective-C - хорошо. Но у меня есть проблема обмена данными между C и Swift - особенно с Struct:Быстрый доступ к C Struct

BridgingHeader:

#include "ToolBoxC.h" 

ToolBoxC.h:

void loadFile(const char *fileName, const char *delimiters, const char *xRegex, int xRegexColumn, int xColumn, int yColumn, int xRow, int yRowShift, bool collectStrings); 

typedef struct { 

        char **headerArray; 
        int numberHeaderRows; 
        char **dateArray; 
        int numberDateRows; 
        int **valueArray; 
        char ***stringArray; 
        int numberValueRows; 
        int numberValueColums; 
     } FileStruct; 

typedef struct { 

        FileStruct fileContent[10000]; 
} FilesStruct; 

struct FilesStruct filesContent; 

ToolBoxC.c:

struct FileStruct { 

    char **headerArray; 
    int numberHeaderRows; 
    char **dateArray; 
    int numberDateRows; 
    int **valueArray; 
    char ***stringArray; 
    int numberValueRows; 
    int numberValueColums; 
}; 

struct FilesStruct { 

    struct FileStruct fileContent[10000]; 
}; 

void loadFile(const char *fileName, const char *delimiters, const char *xRegex, int xRegexColumn, int xColumn, int yColumn, int xRow, int yRowShift, bool collectStrings) { 

// some stuff 

    struct FileStruct fileContent; 

    fileContent.headerArray = headerArray; 
    fileContent.numberHeaderRows = numberHeaderRows; 
    fileContent.dateArray = dateArray; 
    fileContent.numberDateRows = numberDateRows; 
    fileContent.valueArray = valueArray; 
    fileContent.stringArray = stringArray; 
    fileContent.numberValueRows = numberValueRows; 
    fileContent.numberValueColums = numberValueColumns; 

    filesContent.fileContent[numberFiles] = fileContent; 

return; 
} 

Все проанализированные данные хранятся в struct FilesStruct filesContent. Разбор начинается с вызова функции loadFile() с параметрами из Swift. Это прекрасно работает. Также синтаксический анализ в порядке. Но как я могу получить доступ к данным в struct FilesStruct filesContent от Swift?

Спасибо, Маттиас.

ответ

2

Попробуйте это:

ToolBoxC.h

#include <stdbool.h> 

struct FileStruct { 
    char **headerArray; 
    int numberHeaderRows; 
    char **dateArray; 
    int numberDateRows; 
    int **valueArray; 
    char ***stringArray; 
    int numberValueRows; 
    int numberValueColums; 
}; 

extern struct FileStruct **loadedFiles; 

void loadFile(const char *fileName, const char *delimiters, const char *xRegex, int xRegexColumn, int xColumn, int yColumn, int xRow, int yRowShift, bool collectStrings); 

Метод ToolBoxC.c

#include <stdlib.h> 
#include "ToolBoxC.h" 

#define MaxFiles 10000 

struct FileStruct **loadedFiles; 

void loadFile(const char *fileName, const char *delimiters, const char *xRegex, int xRegexColumn, int xColumn, int yColumn, int xRow, int yRowShift, bool collectStrings) { 

    static int nextIndex = 0; 

    if (loadedFiles == 0) 
     loadedFiles = malloc(MaxFiles * sizeof(*loadedFiles)); 

    struct FileStruct *file = malloc(sizeof(struct FileStruct)); 
    file->numberDateRows = xRow; 

    loadedFiles[nextIndex++] = file; 
} 

Swift Тест

func loadFilesTest() -> Void { 
    for var i:Int32 = 0; i < 10; ++i { 
     loadFile("", "", "", 0, 0, 0, i, 0, true) 
    } 
    for var j = 0; j < 10; ++j { 
     let pointer = UnsafePointer<FileStruct>(loadedFiles[j]) 
     print("Number of date rows = \(pointer.memory.numberDateRows)") 
    } 
} 
+0

Отлично! Большое спасибо, Роберт. Я не понимаю его полностью, но он отлично работает. – user2156649

+0

Добро пожаловать, @ user2156649. Пожалуйста, не стесняйтесь задавать любые вопросы по этому поводу; Я сделаю все возможное, чтобы ответить. – Verticon

+0

Есть еще одна проблема ... с управлением памятью. Загрузочный файл функции C() вызывается многопоточным Swift. Таким образом, многие файлы могут обрабатываться одновременно. В Swift я использую NSOperationQueue. Мой вопрос: безопасен ли поток malloc? Часто это работает без проблем, но иногда я получаю ошибку «malloc: *** для объекта: недопустимый указатель, удаленный из бесплатного списка ***, установить точку останова в malloc_error_break для отладки». – user2156649