函数调用后,c#变量似乎超出范围
我必须完成以下功能函数调用后,c#变量似乎超出范围,c#,C#,我必须完成以下功能 public int[] PollAllDevices() { /* Polling commands */ const byte POLL_FRONT_RADAR = 0x00; const byte POLL_REAR_RADAR = 0x01; const byte POLL_DISP = 0x02; const byte POLL_CTRL =
public int[] PollAllDevices()
{
/* Polling commands */
const byte POLL_FRONT_RADAR = 0x00;
const byte POLL_REAR_RADAR = 0x01;
const byte POLL_DISP = 0x02;
const byte POLL_CTRL = 0x03;
const byte POLL_EXP1 = 0x04;
const byte POLL_EXP2 = 0x05;
byte[] buff = new byte[32];
int[] _ret = new int[32];// { 23, 24, 25, 26, 27, 28, 29, 30 };
int i = 0;
if(API.uart_write(devPtr, new byte[1] { POLL_FRONT_RADAR }, 0, 1))
{
if (API.uart_read(devPtr, buff, 0, 1, 1000) != 0)
{
_ret[i++] = (int)buff[1];
}
}
if (API.uart_write(devPtr, new byte[1] { POLL_REAR_RADAR }, 0, 1))
{
if (API.uart_read(devPtr, buff, 0, 1, 1000) != 0)
{
_ret[i++] = (int)buff[1];
}
}
return _ret;
}
我把手表放在橱窗里了。我可以看到它一直存在,直到我调用API.uart_read,然后它在watch窗口中变为灰色,我看到了
_ret无法获取本地或参数“_ret”的值,因为它在此指令指针处不可用,可能是因为它已被优化。int[]
(只是把它作为额外信息放在那里。这不是我的问题,所以我不确定为什么会将其标记为重复。所有解决该错误的方法似乎都是围绕优化展开的,我没有启用优化。)
当我尝试写入它时,我得到一个数组越界异常。在这一点上i=0,但仅仅为了露齿而笑,我已经将其硬编码为_ret[0],我仍然得到异常。如果我把ret改成int,我可以再写一次
我已经关机了。有人能告诉我这里做错了什么吗?可能是(int)buff[1]
导致了越界异常。
尝试拆分\u ret[i++]=(int)buff[1]编码>进入
int tempVar = (int)buff[1];
_ret[i++] = tempVar;
看看会发生什么。可能是(int)buff[1]
导致了越界异常。
尝试拆分\u ret[i++]=(int)buff[1]编码>进入
int tempVar = (int)buff[1];
_ret[i++] = tempVar;
看看会发生什么。我真的不明白为什么您的阵列会因为某种原因而超出范围,但我有一个解决方案,以防出现其他解决方案:
将方法设为public void polalldevices(out\u ref){…}
,并像
int[] _ref;
PollAllDevies(out _ref);
并更改int[]_ret=new int[32]
在里面说\u ref=new int[32]
当然,如果您有使用权的话,现在您也可以将布尔值作为返回值(或其他元数据)。真的看不出为什么您的数组会因为某种原因而超出范围,但我有一个解决方案,以防出现其他解决方案:
将方法设为public void polalldevices(out\u ref){…}
,并像
int[] _ref;
PollAllDevies(out _ref);
并更改int[]_ret=new int[32]
在里面说\u ref=new int[32]
当然,现在你也可以把bool作为返回值(或其他一些元数据),如果你需要的话。一些想法
我无法访问您的API,因此我获取了您的代码并对其进行了如下修改:
byte[] buff = new byte[32];
int[] _ret = new int[32];// { 23, 24, 25, 26, 27, 28, 29, 30 };
int i = 0;
if (true)
{
if (true)
{
_ret[i++] = (int)buff[1];
}
}
if (true)
{
if (true)
{
_ret[i++] = (int)buff[1];
}
}
这当然行得通。如果是我,我会重新引入对API.uart\u write
的调用,看看会发生什么。然后,我将再次删除这些调用,并将这些调用重新引入到API.uart\u read
。这将确保它与这两个调用的交互无关
您发布的代码似乎不完整,因为我看不到任何地方如何声明devPtr
。它是对\u ret
的第二次引用还是\u ret
的值之一
因为您在方法调用结束时返回它,所以它本来会被优化掉,这甚至没有意义。编译器不会优化掉方法的返回值。一些想法
我无法访问您的API,因此我获取了您的代码并对其进行了如下修改:
byte[] buff = new byte[32];
int[] _ret = new int[32];// { 23, 24, 25, 26, 27, 28, 29, 30 };
int i = 0;
if (true)
{
if (true)
{
_ret[i++] = (int)buff[1];
}
}
if (true)
{
if (true)
{
_ret[i++] = (int)buff[1];
}
}
这当然行得通。如果是我,我会重新引入对API.uart\u write
的调用,看看会发生什么。然后,我将再次删除这些调用,并将这些调用重新引入到API.uart\u read
。这将确保它与这两个调用的交互无关
您发布的代码似乎不完整,因为我看不到任何地方如何声明devPtr
。它是对\u ret
的第二次引用还是\u ret
的值之一
因为您在方法调用结束时返回它,所以它本来会被优化掉,这甚至没有意义。编译器不会优化一个方法的返回值。 < P>我的C++函数API。UARTHARAD()试图将64个字节放入Buff中,并在步骤ReT.上。
我想。我知道这就是你在C中描述它的时候,我把Buff大到足以容纳所有64字节的事情,正如预期的那样。< /P> < P>我的C++函数API。UARTHARAD()试图把64字节放入Buff,并且它在步Ret上。
我想。我知道你会用C来描述它。当我把buff设置得足够大,可以容纳所有64字节时,一切都按预期进行。可能是@BackDoorNoBaby的重复,我想OP是说\u ret
似乎在polalldevices
中消失了(从调试器中),在调用API.uart\u read
后,@BackDoorNoBaby可能重复,我想OP是说\u ret
在调用API.uart\u read
后,polalldevices
内的\u ret
似乎消失了(从调试器中)。我已经试过了。抛出异常的是ret。我已经尝试过了。抛出异常的是ret。我已尝试将uart\U read上方的调用移动到uart\U write调用之后的调用,一切正常。当我删除对uart_write的调用而只调用uart_read时,事情也会起作用。不过我真的不知道该怎么办。我真的看不出从我的DLL调用这些函数是什么导致了问题的出现。我已经尝试将uart_read上面的调用移动到uart_write调用之后的调用,一切正常。当我删除对uart_write的调用而只调用uart_read时,事情也会起作用。不过我真的不知道该怎么办。我真的看不出从我的DLL调用这些函数是什么导致事情崩溃。