c++ - 将 2D vector 转换为 C 类型的最佳方法(对于 SGX enclave)

标签 c++ c vector sgx enclave

我正在尝试编写一个 SGX enclave,它接受 int 的 2D vector (表示灰度图像),但 edger8r 仅接受 C 类型。

我知道thisthis ,但是有人可以提供一个关于如何转换类型的示例吗:

vector< vector <int> > ImagePixels;

转换为 C 类型,以便我可以将其传递到 SGX enclave?

最佳答案

std::vector有一个data()方法将为您提供指向其数据的简单指针。但是,您需要对第二层 vector 执行一些操作,因此您需要创建一个临时数组来存储内部 vector 中的普通指针列表。

#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

但是,如果您可以控制整个代码,我建议使用扁平结构,只需将整个图片存储到 falt 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

关于c++ - 将 2D vector 转换为 C 类型的最佳方法(对于 SGX enclave),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49832602/

相关文章:

c++ - 使用Poco::Zip将文件附加到现有的zip文件中

c++ - 错误 C++ : does not name a type

c++ - 等待单个对象崩溃

c - 在 C 中使用 fork() 和 TCP 连接进行设计

c++ - 在类中操作 vector 时遇到问题

c++ - 在 C++ 中打印来自多个 vector 的第一个值

c++ - 稍后在构造函数中重新启动异常指令 delete this

c - 存储数据结构的有效且简单的方法是什么?

c++ - 为什么我们不对 cout 使用格式说明符?

r - 如何从字符向量中的第一个元素之后删除特定的重复元素