我在c ++中有下一个函数:
double* solveSystemOfEquatationWithAugmentedMatrix(double **matrix, size_t rows)
在迅速的部分,我有简单的[[Double]]
必须通过
我试过下一次谈话:
let array = UnsafeMutablePointer<UnsafeMutablePointer<Double>>.allocate(capacity: matrix.count)
我试图遍历每个内部指针并为每个内部指针分配容量,但没有运气......每个内部行甚至没有分配函数。
什么是优雅而快速的方式来进行这样的对话并传递给c ++?
我相信最好在矩阵缓冲区周围创建一个ObjectiveC包装器。通过这种方式,您可以直接访问其内存,并且仍然可以在swift中使用它。
您需要使用标题来控制对类所需的访问权限,但这是一个示例:
@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]
。