Swift 4:将多维数组传递给c ++

问题描述 投票:0回答:1

我在c ++中有下一个函数:

double* solveSystemOfEquatationWithAugmentedMatrix(double **matrix, size_t rows)

在迅速的部分,我有简单的[[Double]]必须通过

我试过下一次谈话:

let array = UnsafeMutablePointer<UnsafeMutablePointer<Double>>.allocate(capacity: matrix.count)

我试图遍历每个内部指针并为每个内部指针分配容量,但没有运气......每个内部行甚至没有分配函数。

什么是优雅而快速的方式来进行这样的对话并传递给c ++?

c++ swift swift4
1个回答
1
投票

我相信最好在矩阵缓冲区周围创建一个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]

© www.soinside.com 2019 - 2024. All rights reserved.