Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
函数调用后,c#变量似乎超出范围_C# - Fatal编程技术网

函数调用后,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调用这些函数是什么导致事情崩溃。