追查NaN的原因浮
我有int数组追查NaN的原因浮
public float[] Outputs;
在我的代码
某处,东西更新数组值,造成NaN的。这是一个非常偶尔的错误,我不能解决我的生活是什么导致它。
如何使用最少的代码更改进行更改以追踪它?将该阵列设置为私有并重新命名会很好,然后创建一个名为Outputs的属性,以获取和设置每次设置NaN时进行检查。然后,当NaN被设置并检索一个调用栈时,我可以轻松地引发一个异常,而不是在另一段代码尝试使用它时发现它。像这样 - 实际上编译。
我得到的错误:
"Bad array declarator: To declare a managed array the rank specifier precedes
the variable's identifier. To declare a fixed size buffer field, use the fixed
keyword before the field type."
这里是我的代码:
public float[] _outputs;
public float Outputs[int index]
{
get
{
return _outputs[index];
}
set
{
if (float.IsNaN(value))
throw new Exception("Blar blar");
_outputs[index] = value;
}
}
编辑:谢谢你的答案的人,其他人寻找答案可能需要阅读此: Why C# doesn't implement indexed properties?
您不能使用命名索引在C#中,作为一种解决方法,你可以这样做:
public class Indexer<T>
{
private T[] _values;
public Indexer(int capacity)
{
_values = new T[capacity];
}
protected virtual void OnValueChanging(T value)
{
// do nothing
}
public T this[int index]
{
get { return _values[index]; }
set
{
OnValueChanging(value);
_values[index] = value;
}
}
}
public class FloatIndexer : Indexer<float>
{
public FloatIndexer(int capacity)
: base(capacity)
{
}
protected override void OnValueChanging(float value)
{
if (float.IsNaN(value))
throw new Exception("Blar blar");
}
}
public class Container
{
public Container()
{
Outputs = new FloatIndexer(3);
}
public FloatIndexer Outputs { get; private set; }
}
...
var container = new Container();
container.Outputs[0] = 2.5f;
container.Outputs[1] = 0.4f;
container.Outputs[2] = float.NaN; // BOOM!
...
我更新这是更通用的,所以你可以重新-U它适用于各种其他类型,而不仅仅是float
。
实际上,不可能用特定名称声明索引器。你必须环绕它和使用对象:
public float this[int index] { ...}
你的情况,你可以使用一个包装类这种情况:
public class ArrayWrapper
{
public float this[int index] { ...}
public ArrayWrapper(float[] values) { .... }
}
你需要使用ArrayWrapper
-class物业使用类型。
作为替代方案(因为你需要改变的代码不那么精细),你可以使用一个扩展方法:
public static void SetFloat(this float[] @this, int index, float value) { ... }
而且使用这种方式:
targetObject.Outputs.SetFloat(0, Single.NaN);
扩展方法建议还需要'index'作为参数传入。 – James 2013-05-12 10:38:08
@James我正是这么做的,很快就忘记了。 – 2013-05-12 11:15:06
你的问题是什么? – Kenneth 2013-05-12 10:01:20
为什么不能正常工作? – 2013-05-12 10:02:18
我已将其更新以使问题更清楚。我无法获得编译的代码。 – 2013-05-12 10:03:48