У меня есть следующая функция в C ++:
double* solveSystemOfEquatationWithAugmentedMatrix(double **matrix, size_t rows)
На быстрой части у меня есть простой [[Double]]
что должно пройти
Я попробовал следующий разговор:
let array = UnsafeMutablePointer<UnsafeMutablePointer<Double>>.allocate(capacity: matrix.count)
Я попытался выполнить каждый внутренний указатель и выделить емкость для каждого внутреннего указателя, но не повезло … в каждой внутренней строке даже нет функции выделения.
Что такое элегантный и быстрый способ сделать такой разговор и перейти на c ++?
Я считаю, что было бы лучше создать оболочку ObjectiveC вокруг вашего матричного буфера. Таким образом, вы будете иметь доступ непосредственно к его памяти и сможете использовать его в кратчайшие сроки.
Вам нужно будет использовать свой заголовок, чтобы контролировать, какой доступ вам нужен к классу, но вот пример:
@interface Matrix : NSObject
@property (nonatomic, readonly) int rowCount;
@property (nonatomic, readonly) int columnCount;
- (double)elementAt:(int)row column:(int)column;
- (void)setElementAt:(int)row column:(int)column to:(double)value;
- (instancetype)initWithRowCount:(int)rowCount columnCount:(int)columnCount;
@end
So we have a basic constructor which accepts number of rows and number of columns as an input. You might actually need only one parameter. And the implementation:
#import "Matrix.h"
@interface Matrix ()
@property (nonatomic) double *buffer;
@property (nonatomic) double *solvedBuffer; // Not sure what this is and how you wish to serve it
@property (nonatomic) int rowCount;
@property (nonatomic) int columnCount;
@end
@implementation Matrix
- (void)dealloc {
[self freeBuffer];
}
- (instancetype)initWithRowCount:(int)rowCount columnCount:(int)columnCount {
if((self = [super init])) {
self.rowCount = rowCount;
self.columnCount = columnCount;
[self generateBuffer];
}
return self;
}
- (double)elementAt:(int)row column:(int)column {
return self.buffer[column*self.rowCount + row];
}
- (void)setElementAt:(int)row column:(int)column to:(double)value {
self.buffer[column*self.rowCount + row] = value;
}
- (void)generateBuffer {
if(self.rowCount > 0 && self.columnCount > 0) {
int size = sizeof(CGFloat)*self.rowCount*self.columnCount;
self.buffer = malloc(size);
memset(self.buffer, 0, size); // Set it all to zero
}
}
- (void)freeBuffer {
if(self.buffer) {
free(self.buffer);
self.buffer = nil;
}
}
- (void)solveSystem {
self.solvedBuffer = solveSystemOfEquatationWithAugmentedMatrix((double **)self.buffer, self.rowCount);
}
@end
Ничего особенного на самом деле. У нас есть доступ к буферу, возможность его сгенерировать и мы должны освободить его вручную, когда закончим.
Я добавил метод «решить систему», который я не уверен, что вы ожидаете в качестве вывода, поэтому вам нужно будет создать интерфейс для него самостоятельно.
В любом случае, если это проект XCode, вы просто создаете новый файл и выбираете ObjectiveC. Xcode попросит вас создать промежуточный заголовок, который вам нужно подтвердить. Затем найдите этот соединительный заголовок и добавьте #import "Matrix.h"
или какими бы ни были ваши имена файлов, и этот объект будет вам доступен в Swift. Что касается части C, вы можете видеть, что все должно быть довольно простым. Если вам действительно нужно выставить C ++, то просто переименуйте ваш Matrix.m
в Matrix.mm
и Xcode должен сделать все остальное за вас.
Также будьте осторожны, если ваша матрица должна быть столбцом или мажорной строкой Доступ может измениться на self.buffer[row*self.columnCount + column]
в другом случае 2 способами.
Других решений пока нет …