gpt4 book ai didi

c# - 在 for 循环中随机生成一个 int 值。 7 次迭代后,它返回一个非常大的负数。为什么是这样?

转载 作者:行者123 更新时间:2023-11-30 16:45:47 24 4
gpt4 key购买 nike

下面的代码根据用户是否选择"is"来旋转轮子 10 次或 1 次。

旋转方法采用 0-100 之间的数字,并根据该数字将过滤器旋转一定量。为了测试机器,我想生成一个 0-99 之间的随机数。我觉得这个方法应该可以做到。然而,7次之后,产生的随机数是-2.147483465E+09,直到运行结束。输出,例如:

 89
20
1
58
78
39
90
-2.147483465E+09
-2.147483465E+09
-2.147483465E+09

这可能与垃圾收集有关吗?该方法未将“sUVFilter”更改为 0,这些是当我将它设置为 rand.Next(); 时它获得的值;

如有任何帮助或信息,我们将不胜感激!多谢。这是有问题的代码。

    private void RotateFilterWheel()
{
List<float> filterValuesList = new List<float>();
int timesToRotate = 1;
int success = 0;
Random rand = new Random();

MessageBoxResult result = MessageBox.Show("Rotate filter 10 times?", "Rotate Filter", MessageBoxButton.YesNo);
if (result == MessageBoxResult.Yes)
{
timesToRotate = 10;
}

for (int x = 0; x < timesToRotate; x++)
{

int sUVFilter = rand.Next(99);
_instDrvr.SetSpectroAutoUVFilterPosition(sUVFilter, ref success);
filterValuesList.Add(sUVFilter);
Thread.Sleep(5000);
}
listBox.ItemsSource = filterValuesList;
}

来自评论:

screenshot

最佳答案

    _instDrvr.SetSpectroAutoUVFilterPosition(sUVFilter, ref success);

那才是你程序中真正的麻烦制造者。我们对它的了解还不够多,除了它看起来像是在操作马达。所以你可能正在使用一些公司的库来做这件事,这样的代码通常是不受管理的。可能是 COM 组件,可能正在使用 pinvoke。

诊断是它破坏了你的方法的堆栈。有不止一种方法可以做到这一点。一种简单的方法是破坏 32 位代码中 EBP 处理器寄存器的值,以及 64 位代码中 RSP 寄存器的值。易于检查,使用 Debug > Windows > Registers 并仔细检查寄存器在调用前后是否具有完全相同的值。

它可以很容易地破坏堆栈帧,特别是由于 ref success 参数。它传递一个指向您的成功变量的指针,该变量存储在堆栈帧中。让它轻松写入超过 4 个字节,这将导致您的方法的其他局部变量随机更改它们的值。除了您在调试器中看到的明显奇怪的值之外,这种内存损坏更难诊断。

这就是所有可以猜测的,您几乎肯定需要电机 Controller 制造商或软件供应商的帮助才能解决此问题。

关于c# - 在 for 循环中随机生成一个 int 值。 7 次迭代后,它返回一个非常大的负数。为什么是这样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41467514/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com