我将C#中的接口写入硬件设备。我使用PInvoke模式与API交谈。我在API指南中找到了这个:
unsigned int ADQxxx_GetData( void* adq_cu_ptr, int adqxxx_num, void** target_buffers)
我从未见过void **数据类型。那是什么意思呢?我需要一个指向获取数据的指针?为什么他们使用这个概念?有什么好处?
谢谢David和Mathew,
我发现了这个通知:
从设备收集数据。将数据从ADQ设备中的内部存储器缓冲区直接传输到每个数据通道的target_buffers.One缓冲区所指向的用户指定的缓冲区。因此,target_buffers可以是一个指针数组,具体取决于捕获设备有多少个通道。此函数旨在与函数MultiRecordSetup一起使用。
似乎当我在两个通道上录制时,我变成了一个带有两个指针的数组。所以我能够收集两个频道的数据。
所以这可能是解决方案。
答案 0 :(得分:1)
void**
是指向void*
的指针。究竟是什么意思无法从原型中辨别出来。您需要阅读该功能的文档。
例如,也许该参数用于让函数向调用者返回void*
。它必须使用C中的指针来完成,因为C仅使用pass by value。在您的C#转换中,这将是out IntPtr target_buffers
。该功能将如下翻译:
static extern uint ADQxxx_GetData(IntPtr adq_cu_ptr, int adqxxx_num,
out IntPtr target_buffers);
或许该参数用于将函数传递给预先分配的缓冲区数组。在这种情况下,您将使用IntPtr[] target_buffers
,翻译将是:
static extern uint ADQxxx_GetData(IntPtr adq_cu_ptr, int adqxxx_num,
IntPtr[] target_buffers);
最重要的是,您需要阅读此功能的文档以取得进展。
答案 1 :(得分:0)
这可能是一个无效的指针数组(但如果没有API调用的文档,则无法确定。)
C#中的等价物将是一个对象数组(因为你不知道指向的是什么类型)。
不幸的是,如果不知道缓冲区类型,您将无法编组数据 - 但它可能是一个IntPtr值数组,您已初始化它们指向{{}中某个方法返回的内存块{3}}