Swift 4: передача многомерного массива в переполнение стека

У меня есть следующая функция в C ++:

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

На быстрой части у меня есть простой [[Double]] что должно пройти

Я попробовал следующий разговор:

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

Я попытался выполнить каждый внутренний указатель и выделить емкость для каждого внутреннего указателя, но не повезло … в каждой внутренней строке даже нет функции выделения.

Что такое элегантный и быстрый способ сделать такой разговор и перейти на c ++?

0

Решение

Я считаю, что было бы лучше создать оболочку 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 способами.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]