C# 内部变量的范围';如果';内部声明';对于循环';函数内部

C# 内部变量的范围';如果';内部声明';对于循环';函数内部,c#,global-variables,nested-loops,local-variables,C#,Global Variables,Nested Loops,Local Variables,我正在Atmel Studio 6.2中编程我的机器人,我正在编程一个函数,返回白色表面上黑线的位置,我的机器人可以用8个模拟光传感器检测到。我已经彻底研究了C#中变量的作用域,但是,我无法找出我在下面这段非常简单的代码中犯了什么错误或误解了什么。调用下面的函数时 这项工作: char linePosDigital(int threshold) { char linePos = 0; if(analog_read(0) < threshold) linePos +=

我正在Atmel Studio 6.2中编程我的机器人,我正在编程一个函数,返回白色表面上黑线的位置,我的机器人可以用8个模拟光传感器检测到。我已经彻底研究了C#中变量的作用域,但是,我无法找出我在下面这段非常简单的代码中犯了什么错误或误解了什么。调用下面的函数时

这项工作:

char linePosDigital(int threshold)
{   
    char linePos = 0;

    if(analog_read(0) < threshold) linePos += pow(2, 0);
    if(analog_read(1) < threshold) linePos += pow(2, 1);
    if(analog_read(2) < threshold) linePos += pow(2, 2);
    if(analog_read(3) < threshold) linePos += pow(2, 3);
    if(analog_read(4) < threshold) linePos += pow(2, 4);
    if(analog_read(5) < threshold) linePos += pow(2, 5);
    if(analog_read(6) < threshold) linePos += pow(2, 6);
    if(analog_read(7) < threshold) linePos += pow(2, 7);

    return linePos;
}
char linePosDigital(int阈值)
{   
char-linePos=0;
如果(模拟_读取(0)<阈值)linePos+=功率(2,0);
如果(模拟_读取(1)<阈值)linePos+=功率(2,1);
如果(模拟_读取(2)<阈值)linePos+=功率(2,2);
如果(模拟_读取(3)<阈值)linePos+=功率(2,3);
如果(模拟_读取(4)<阈值)linePos+=功率(2,4);
如果(模拟_读取(5)<阈值)linePos+=功率(2,5);
如果(模拟_读取(6)<阈值)linePos+=功率(2,6);
如果(模拟_读取(7)<阈值)linePos+=功率(2,7);
返回线路POS;
}
这不起作用:

char linePosDigital(int threshold)
{   
    char linePos = 0;

    for(int i=0; i<8; i++)
    {
        if(analog_read(i) < threshold) linePos += pow(2, i);
    }

    return linePos;
}
char linePosDigital(int阈值)
{   
char-linePos=0;

对于(int i=0;i好的,各位,我终于解决了这个问题。我创建了一个用于确定p^q的函数,并用内置函数pow()替换了这个函数。这解决了这个问题,所以我猜pow()函数出了问题-我仍然觉得很奇怪,特别是因为它是C(+)的一部分,我猜?无论如何:非常感谢你的帮助和耐心!:)

你说的“不工作”是什么意思?你收到错误消息了吗?我用一个内置函数调用该函数,该函数将十进制输入打印为机器人LCD上的二进制表示形式(print_binary(linePosDigital(650))。因此,机器人(使用工作功能时)打印8个0和1,其中0表示白色,1表示黑色。但是,调用非工作函数时,结果不正确。例如,当工作函数返回10000000时,非工作函数返回01111111,当工作函数返回11000000时,非工作函数返回10111110。t是什么模拟读取功能的目的?@sovemp,目的是读取从光敏电阻接收的模拟输入。输入电压以10位格式表示,范围从0到1023。@Gabriel作为旁注:与执行
linePos+=pow(2,i);
不同,您可以使用
linePos=(char)以更好的方式设置位标志(1 c/c++中的
pow
函数将
double
float
作为其输入,并将该类型作为其输出返回。如果您尝试使用该返回值在
char
变量中添加该返回值来设置位,则该函数将无法正常工作。我很惊讶您没有收到编译器错误或至少警告关于那件事。
#include <pololu/orangutan.h>

char linePosDigital1(int n[8], int threshold)
{   
    char linePos = 0;

    if(n[0] < threshold) linePos += pow(2, 0);
    if(n[1] < threshold) linePos += pow(2, 1);
    if(n[2] < threshold) linePos += pow(2, 2);
    if(n[3] < threshold) linePos += pow(2, 3);
    if(n[4] < threshold) linePos += pow(2, 4);
    if(n[5] < threshold) linePos += pow(2, 5);
    if(n[6] < threshold) linePos += pow(2, 6);
    if(n[7] < threshold) linePos += pow(2, 7);

    return linePos;
}

char linePosDigital2(int n[8], int threshold)
{
    char linePos = 0;

    for(int i=0; i<8; i++)
    {
        if(n[i] < threshold) linePos += pow(2, i);
    }

    return linePos;
}

int main()
{
    int n[8];

    n[0] = 800;
    n[1] = 800;
    n[2] = 800;
    n[3] = 800;
    n[4] = 800;
    n[5] = 800;
    n[6] = 200;
    n[7] = 200;

    while(1)
    {
        clear();
        print_binary(linePosDigital1(n, 650));
        delay(1000);
        clear();
        print_binary(linePosDigital2(n, 650));
        delay(1000);
    }
}