Лучший способ конвертировать 2D вектор в тип C (для анклава SGX)

Я пытаюсь написать анклав SGX, который принимает 2D-вектор типа int (представляющий изображение в градациях серого), но edger8r принимает только типы C.

Я знаю об этом и об этом, но кто-то может привести пример того, как преобразовать тип, такой как:

vector< vector <int> > ImagePixels;

в тип C, чтобы я мог передать его в анклав SGX?

1 ответ

Решение

std::vector имеет data() метод, который даст вам простой указатель на свои данные. Однако вам нужно будет что-то сделать с этим вторым слоем векторов, поэтому вам нужно создать временный массив, который будет хранить список простых указателей из внутреннего вектора.

#include <algorithm>
#include <iostream>
#include <vector>


extern "C" int my_c_function(int **double_pointer, int rows, int cols) {
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            printf("%d ", double_pointer[i][j]);
        }
        printf("\n");
    }
}


int main() {
    std::vector<std::vector<int>> ImagePixels{{1, 2, 3}, {4, 5, 6}};

    // transform a vector of vectors into a vector of pointers
    std::vector<int*> ptrs(ImagePixels.size());
    std::transform(begin(ImagePixels), end(ImagePixels), begin(ptrs),
        [](std::vector<int> &inner_vec) {
            return inner_vec.data();
        });

    my_c_function(ptrs.data(), ImagePixels.size(), ImagePixels[0].size());
}

Пример из жизни: https://onlinegdb.com/BJvb3yG3f

Тем не менее, если у вас есть контроль над всем кодом, я бы предложил использовать плоскую структуру, где вы просто сохраняете всю картинку в срез std::vector<int> строка за строкой. Вы можете даже сделать простую обертку вокруг std:: vector, чтобы упростить манипулирование такой структурой:

class image {
public:
    image(int rows = 0; int cols = 0)
        : rows_{rows}, cols_{cols}, data_(rows * cols) {}

    int &operator ()(int row, int col) {
        return data_[row * cols_ + col];
    }

    int *data() { return data_.data(); };

    // needs a few more utilities and constant versions of the methods
private:
    std::vector<int> data_;
    int rows_;
    int cols_;
};

Тогда вы можете сделать:

image im(3, 2);
// set pixels
im(0, 0) = 1;
im(0, 1) = 2;
int *d = im.data(); // a plain pointer to an array of data
Другие вопросы по тегам