我有一个std :: vector,它将填充一些专有硬件的指令。我有代码来构造这个缓冲区并且操作它就好了。
问题是我需要使用另一个库(基于C)来构建类似的专有硬件指令,但是库需要我们使原始内存可用并返回指向它的指针,然后库用它来编写它命令。
我想完成类似下面的内容[伪代码,不像真正的代码]:
void* theLibraryCallback (void* clientData, unsigned int theLibrarySize)
{
std::vector<unsigned int> cmd = reinterpret_cast<std::vector<unsigned int>>(clientData);
std::vector<unsigned int>::size_type cmdSize = cmd->size();
for (int loop=0;loop<theLibrarySize; loop++)
cmd->push_back(0xdeadbeef);
return cmd->GET_RAW_POINTER_AT(sizeof(unsigned int)*cmdSize); ///<< How can I do this?
}
概念是我向向量添加值以创建空间,但另一个库直接修改它们。
如果我不能这样做,我必须考虑分配临时原始内存,用库填充它,然后将其复制到我的向量中,但如果可能的话,我想避免这种情况。
我想以某种方式做什么?
答案 0 :(得分:1)
所以有两件事:
您可以使用std::vector::data()
或&vec.front()
访问矢量的连续内存。
如果你在上面显示的代码中这样做,那么你将返回一个指向数据的指针,该指针在函数返回时消失(向量的析构函数将运行,数据将被释放) )。
答案 1 :(得分:1)
我假设clientData
是一个用户定义的值,您已将其设置为指向已在其他位置分配的vector
的指针,并确保它在C内部保持活动状态图书馆正在写信给它。如果是这样,您可以在回调中执行此操作:
void* theLibraryCallback (void* clientData, unsigned int theLibrarySize)
{
std::vector<unsigned int> *cmd = reinterpret_cast<std::vector<unsigned int> *>(clientData);
std::vector<unsigned int>::size_type cmdSize = cmd->size();
for (int loop=0;loop<theLibrarySize; loop++)
cmd->push_back(0xdeadbeef);
return &(*cmd)[cmdSize];
}
您可能需要考虑使用typedef
来使矢量访问更容易阅读:
typedef std::vector<unsigned int> uintvec;
void* theLibraryCallback (void* clientData, unsigned int theLibrarySize)
{
uintvec *cmd = reinterpret_cast<uintvec*>(clientData);
uintvec::size_type cmdSize = cmd->size();
for (int loop=0;loop<theLibrarySize; loop++)
cmd->push_back(0xdeadbeef);
return &(*cmd)[cmdSize];
}