C#P/调用无效**指针传递 我使用C++编写的WiLAPI DLL,使用DLIMLPOUNT访问USB ADC/DAC转换器的值。 唯一的问题是: long ZGetBufferADC(long typeDevice, long numberDSP, void **buffer, long *size)

C#P/调用无效**指针传递 我使用C++编写的WiLAPI DLL,使用DLIMLPOUNT访问USB ADC/DAC转换器的值。 唯一的问题是: long ZGetBufferADC(long typeDevice, long numberDSP, void **buffer, long *size),c#,c++,pinvoke,void-pointers,C#,C++,Pinvoke,Void Pointers,我已经把它翻译成 [DllImport("Zadc.dll")] public static extern Int32 ZGetBufferADC(Int32 typeDevice, Int32 numberDSP, out IntPtr buffer, out Int32 size); 我这样称呼这个函数 Int32 err = ZGetBufferADC(typeDevice, numberDSP, out pBuffer, out sizeBufferADC); IntPtr p

我已经把它翻译成

[DllImport("Zadc.dll")]
public static extern Int32 ZGetBufferADC(Int32 typeDevice, Int32 numberDSP, out IntPtr    buffer, out Int32 size);
我这样称呼这个函数

Int32 err = ZGetBufferADC(typeDevice, numberDSP, out pBuffer, out sizeBufferADC);
IntPtr pBuffer;
Int16 pBuffer16ADC; 
pBuffer16ADC = (Int16)pBuffer;
volt0 = resolutionADC0 * (pBuffer16ADC[pointerADC]) / amplifyADC0;
然后我需要在C中访问生成的pBuffer,就像在C++中一样:

short *pBuffer16ADC = (short*) pBuffer
volt0 = resolutionADC0 * (pBuffer16ADC[pointerADC]) / amplifyADC0;
其中pointerADC是Int32,指向ADC转换器的当前值,我设法正确地获得了它的w/o问题

那么我如何在c#中实现这种结构呢?我试着定义这样的变量

Int32 err = ZGetBufferADC(typeDevice, numberDSP, out pBuffer, out sizeBufferADC);
IntPtr pBuffer;
Int16 pBuffer16ADC; 
pBuffer16ADC = (Int16)pBuffer;
volt0 = resolutionADC0 * (pBuffer16ADC[pointerADC]) / amplifyADC0;
但这是一个错误

Cannot apply indexing with [] to an expression of type 'short'
任何帮助都将不胜感激!如果需要其他信息,请询问我,我会尽快提供。 这个问题快让我发疯了一个星期了:(
谢谢!

大概
大小
是以字节为单位测量的。如果相反,
大小
是元素的数量,那么很明显如何调整以下内容

首先,在执行以下操作时调用函数:

Int32 err = ZGetBufferADC(typeDevice, numberDSP, out pBuffer, out sizeBufferADC);
然后声明一个将缓冲区复制到其中的数组

short[] buffer = new short[sizeBufferADC/Marshal.SizeOf(typeof(short))];
最后复制缓冲区:

Marshal.Copy(pBuffer, buffer, 0, buffer.Length);

这就是你需要做的一切。

大概
大小
是以字节为单位测量的。如果相反,
大小
是元素的数量,那么很明显如何调整以下内容

首先,在执行以下操作时调用函数:

Int32 err = ZGetBufferADC(typeDevice, numberDSP, out pBuffer, out sizeBufferADC);
然后声明一个将缓冲区复制到其中的数组

short[] buffer = new short[sizeBufferADC/Marshal.SizeOf(typeof(short))];
最后复制缓冲区:

Marshal.Copy(pBuffer, buffer, 0, buffer.Length);


这是你需要做的所有事情。

< <代码> ItpTR缓冲器由<代码> ZGETBuffDeCuc< <代码>使用,使用<代码> ItpTrp= MalSal.Read ItPtRR(缓冲器); >代码> PbFuff16Adc= MalSal.RealtId16(p);< C++ >代码,假设C++代码为“代码>短*PbFuff16ADC=(短*))*你的C++代码片段与函数定义不匹配。这是一个问题。如果我应用你的代码,那么索引就会出现同样的错误。但是,当我省略了索引程序编译得好,但是Marshall。.Locals显示p变量是负数(-2359241)。对于第二条注释:
code short*pBuffer16ADC=(short*)
pBuffer(pBuffer前面没有星号)它是如何用C++编写的,假设pHuffic定义为Wuff*pBuffy;我可以在什么地方上传代码吗?它不太大,而且容易阅读。也许我缺少了一些东西。我不知道亚历克斯是如何得出这个结论的。你大概通过了<代码>和pBuff16AdC/<代码>函数。这是双指针。填充< <代码> ZGETBuffDeCuc< /Calp>,使用<代码> ItpTrp= MalSal.Read ItPPTR(缓冲区); >代码> PbFuff16Adc= MalSal.RealtId16(p);< /Cord> >假设C++代码为“代码>短*PbFuff16ADC=(短*))*你的C++代码片段与函数定义不匹配。这是一个问题。如果我应用你的代码,那么索引就会出现同样的错误。但是,当我省略了索引程序编译得好,但是Marshall。.Locals显示p变量是负数(-2359241)。对于第二条注释:
code short*pBuffer16ADC=(short*)
pBuffer(pBuffer前面没有星号)它是如何用C++编写的,假设pHuffic定义为Wuff*PpHuffy;我可以在什么地方上传代码吗?它不太大,而且容易阅读。也许我缺少了一些东西。我不知道亚历克斯是如何得出这个结论的。你大概通过了<代码>和PbFuff16ADC < /代码>。这是双指针。谢谢你,这是工作。完美无瑕:)然而,值得注意的是,在C中,它是
short[]buffer
,这可能会让人感到困惑)但是这个想法很棒,如此简单和稳定。谢谢。很高兴这有帮助。最近C++太多,因此语法错误。现在修好了。也许我应该用var!!
Marshal.Copy
…它的性能非常糟糕,因为我的缓冲区不断变化,并且在每个计时器周期中复制它的成本很高。我想如果我可以用
Marshal.ReadIntPtr
代替,但我不知道需要什么偏移量。我尝试了
Marshal.ReadIntPtr(pBuffer,pointerADC*sizeof(short))
,pBuffer是IntPtr,pointerADC是16位数组的索引,如下所示:
pBuffer16ADC[pointerADC]
其中
short[]pBuffer16ADC=new short[sizeBufferADC]16位字的大小。给定函数的接口,你不能做很多事情。我希望C++/CLI混合模式包装器的性能会更好。非常感谢,它工作得非常完美:)但是,值得注意的是,在C#中,它是
short[]buffer
,这可能会让人感到困惑)但是这个想法很棒,非常简单和稳定。谢谢。很高兴这有帮助。最近C++太多,因此语法错误。现在修好了。也许我应该用var!!
Marshal.Copy
…它的性能非常糟糕,因为我的缓冲区不断变化,并且在每个计时器周期中复制它的成本很高。我想如果我可以用
Marshal.ReadIntPtr
代替,但我不知道需要什么偏移量。我尝试了
Marshal.ReadIntPtr(pBuffer,pointerADC*sizeof(short))
,pBuffer是IntPtr,pointerADC是16位数组的索引,如下所示:
pBuffer16ADC[pointerADC]
其中
short[]pBuffer16ADC=new short[sizeBufferADC]16位字的大小。给定函数的接口,你不能做很多事情。我希望C++/CLI混合模式包装器的性能会更好。