【发布时间】:2015-02-04 15:07:39
【问题描述】:
虽然我不太习惯在 C# 中使用不安全的上下文,但我知道有时我可能不得不使用它。
为了解决这个问题,为了将字节值写入 IntPtr,我可以从安全的上下文中编写以下内容:
for (int i = 0; i < counter; i++)
{
System.Runtime.InteropServices.Marshal.WriteByte (data, i, 0);
}
如何在不安全的环境中做同样的事情?
更具体地说,我实际上是在尝试将浮点值写入一个 Intptr 变量,该变量实际上是一个浮点数组指针。我没有看到任何能够在安全上下文中使用 System.Runtime.InteropServices 处理写入浮点数据的重载。
我尝试了以下但得到错误:
malloc: *** 对象 0x17e9eca4 错误:已释放对象的校验和不正确 - 对象可能在被释放后被修改。
var data = (float*)buffer.FloatChannelData;
for (int i = 0; i < buffer.FrameLength; i++)
{
data [i] = 0.0f;
*data++ = 0.0f; // also tried this but got the same error
}
非常感谢您的帮助。
其他详情:
我正在尝试将数据写入 Xamarin.IOS 中的 AudioPCMBuffers。我认为缓冲区包含一个浮点数组,但正如 @Passant 在 cmets 中指出的那样,它实际上包含一个指向帧长度浮点数组的指针数组。他同样的前提适用,无论是从安全还是不安全的上下文中,我都希望能够将数据写入缓冲区。一个例子会很有帮助。感谢并为您的困惑道歉
【问题讨论】:
-
郑重声明,我使用 C# 已经有十多年了,我从来不需要使用
unsafe块。 -
@Mann 我也很高兴在安全的环境中工作。关于如何在安全的环境中解决问题的任何建议?即将浮点值写入浮点数组指针
-
闻起来像 AVAudioPCMBuffer,我想知道为什么我们必须猜测它。这不是一个浮点数组,它是一个指向 frameLength 浮点数组的指针数组(它们的 channelCount)。因此,如果那是准确的,那么您确实会破坏 bejeezus 的内存。
-
@Passant 你完全正确地认为这是一个 AVAudioPCMBuffer。我从来没有打算让你猜测任何事情。相反,我试图尽可能缩小问题范围,以使问题非常具体。我将编辑问题以包含此详细信息。随意提供有关如何访问指针数组的解决方案。
标签: ios .net c#-4.0 mono xamarin.ios