Я разрабатываю приложение 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?
Спасибо, Маттиас.
Отлично! Большое спасибо, Роберт. Я не понимаю его полностью, но он отлично работает. – user2156649
Добро пожаловать, @ user2156649. Пожалуйста, не стесняйтесь задавать любые вопросы по этому поводу; Я сделаю все возможное, чтобы ответить. – Verticon
Есть еще одна проблема ... с управлением памятью. Загрузочный файл функции C() вызывается многопоточным Swift. Таким образом, многие файлы могут обрабатываться одновременно. В Swift я использую NSOperationQueue. Мой вопрос: безопасен ли поток malloc? Часто это работает без проблем, но иногда я получаю ошибку «malloc: *** для объекта: недопустимый указатель, удаленный из бесплатного списка ***, установить точку останова в malloc_error_break для отладки». – user2156649