C++“未在此范围内声明”编译错误及修改提示

Posted

技术标签:

【中文标题】C++“未在此范围内声明”编译错误及修改提示【英文标题】:C++ “was not declared in this scope” compile error and modification tips 【发布时间】:2010-12-30 15:47:10 【问题描述】:

我正在尝试修改此代码以使其在 Arduino Mega 上工作。我对C非常陌生,所以我可能犯了一些重大错误。顺便说一句,这是一个自平衡滑板。 :P

此代码取自 ATmega32(来自:[url=http://sites.google.com/site/onewheeledselfbalancing/Home/twin-wheel-self-balancing-skateboard-lightweight-version/code4]http://sites.google.com/site/onewheeledsel...t-version/code4[/url],我正在尝试使其在 Arduino Mega 上工作。

此代码是为 ATmega32 开发板编写的 http://www.active-robots.com/products/controllr/m32db.shtml

谢谢!

这是我遇到的第一个错误:

在函数'void timer_init()'中: 错误:“TCCR0”未在 这个作用域在函数'int main()'中:

有人能解释一下有什么问题吗? 我几乎是编程的初学者,但我读过很多书/网站,而且我学得也很快! ^^ 这是完整的代码(很长):

#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <math.h>

定义 CLOCK_SPEED 16000000

定义 OCR1_MAX 1023

typedef 无符号字符 u8;空白 set_motor_idle(无效);空白 初始化端口(无效);浮动级别=0;漂浮 油门踏板;浮动aa;漂浮 加速;浮动 x_acc;浮动累加器; 浮动 x_accdeg;

浮动陀螺;

float gangleratedeg;漂浮 大伙儿;浮动 ti = 2.2;

浮动整体增益;浮动增益控制; 浮动电池电压 = 24;漂浮 陀螺仪;浮动角度;漂浮 角斗士;浮动平衡扭矩;漂浮 软启动;

浮动 cur_speed;浮动周期时间= 0.0064;浮动平衡点;浮动 a0, a1, a2, a3, a4, a5, a6;//Savitzky-Golay 变量为 加速度计

int i;诠释 j;整数提示;空白 InitPorts(void) PORTC=0x00; //港口 C上拉设置为低(无输出 电压)以 DDRC=0xFF 开头; //端口C引脚全部设置为输出通过 端口C方向寄存器//PORTC |= (1

DDRA=0x00; //所有端口A引脚设置为 输入端口=0x00; //端口A输入 上拉设置为低上拉

DDRD=0xFF; //配置所有端口D引脚 作为 OCR1A 的先决条件的输出 (PinD5) 和 OCR1B (Pin D4) 工作 正确的

PORTB=0x00; //端口B上拉设置为 低(无输出电压)开始 DDRB=0xFF; //所有端口B引脚设置为 输出

/* IO: 我使用的是 ATMega32 16MHz 与外部晶体时钟。新的 OSMC 电机的计划引脚排列 控制器 PC4 板载 LED PD5/OC1A ALI -> OSMC 引脚 6 PD4/OC1B BLI -> OSMC 引脚 8 PC1 禁用 -> OSMC 引脚 4 PC2 BHI -> OSMC 引脚 7 PC3 AHI -> OSMC pin 5 PA6/ADC6 Vbatt/10 -> OSMC pin 3 PA1/ADC1 俯仰率陀螺仪 PA0/ADC0 加速度计 / void adc_init(void) / 关闭 模拟比较器,因为我们不使用它 /ACSR = (1 选择 PA0 /ADMUX = 0; ADMUX |=(1/ADCSRA = 0 | (1 等到虚假的第一次转换 完成 */ while (ADCSRA & (1

uint16_t adc_read(uint8_t 通道) /* 选择频道 / ADMUX = 渠道; ADMUX |=(1/ ADCSRA |= (1 等到 转换完成 /while (ADCSRA & (1 返回 结果 */ 返回 ADCW;

/* 每秒 156 个周期,每个周期 6.4 毫秒 在示波器上测量*/ /* 阅读所有 ADC输入并进行一些转换 */ void sample_inputs(void)

uint16_t adc0, adc1, adc2, adc3, adc4, adc5;
 gyrosum=0;   adc0 = adc_read(0); /* accelerometer pin PA0 */   accelraw

= (浮点数) adc0; 对于 (j=0; j

adc2 = adc_read(2); /* grey wire overallgain (via cutout switch)

位置 PA2*/ adc3 = adc_read(3); /* 位置杠杆拉回位置 PA3*/ adc4 = adc_read(4); /* 油门踏板位置 PA4*/ adc5 = adc_read(5); /* 位置控制杆被推 前锋位置 PA5*/ //adc6 = adc_read(6); /* 来自 OSMC 的 Vbatt 输入 (目前未使用)位置 PA6*/ //Sav Golay filter for accel only a0 = a1; a1 = a2; a2 = a3; a3 = a4; a4 = a5; a5 = a6; a6 = (浮动)加速; accsum = (浮点数) ((-2*a0) + (3*a1) + (6*a2) + (7*a3) + (6*a4) + (3*a5) + (-2*a6))/21; //保存 格雷计算

    gaincontrol = (float) gaincontrol*0.9 + 0.1*adc2/341;

//平滑任何电压尖峰并给出 范围 0-3 Throttle_pedal=(float) Throttle_pedal*0.9 + 0.1*adc4/341; //平滑任何电压尖峰并给出 范围 0-3

//如果死机则切断电机 按钮松开//(增益控制 变量也通过这个连接 如果 (adc2100) Balance_point=534;

如果 (adc5>100) Balance_point=494;

 PORTB |= (1<<PB2);//Port B2 turned on/off once per loop so I can

用示波器测量循环时间

/加速度计信号处理/ /减去偏移量/ x_acc=(float) accsum - Balance_point; //accsum是SG值 对于加速度计,不是真正的“总和”,所以 无需除以 7 如果 (x_acc250) x_acc=250; /* 加速度计角度变化约为每度倾斜 3.45 个单位 范围 0-30 度(sin theta) 转换 倾斜度从 加速度计传感器。辛角 大致 = 小角度的角度,所以 不需要做三角函数。 x_acc 下面现在是度数*/

x_accdeg= (float) x_acc/-3.45; //减号纠正后面 到前加速度计安装!

  /*GYRO signal processing*/
 /*Subtract offsets: Sensor reading is 0-1024 so "balance point"

即我要求的零点将是 该读数减去 512*/

/陀螺角每度变化 20mV 每秒从数据表给出的变化 4.096 个单位(在 0 - 1023 范围内)每度每秒角度变化 这 限制陀螺的变化率 角度小于最大值 率它实际上是能够 测量(100度/秒)。注意所有这些 分数四舍五入为整数 稍后在它被发送到 PWM 发生器,这又是 连接到电机控制器/ gangleratedeg=(float)((gyrosum/7) - 508)/4.096; //gyrosum 是一组 7 个样本的总和,因此除以 7 得到 陀螺仪值 if (gangleratedeg

92) gangleratedeg=92 /我在每个主程序中打开和关闭端口 B2 一次 循环,这样我就可以连接示波器 并制定程序周期 我用循环时间锻炼的时间 每个周期的陀螺角度变化,你 必须知道这段时间的长度 间隔/ PORTB &= (0

/ti 代表“i”的缩放 或积分因子(目前为 2.2 这里) gyroangledt 是角度变化 自上次循环以来陀螺仪的度数 传感器,其中 ti 是比例因子 (理论上应该是 1 但 2.2 使板感觉更紧) ganglerate 现在以度为单位 每秒 aa 改变时间 常数,即较小的 aa 值使 加速度计时间常数更长 它会慢慢纠正陀螺仪 漂移/

aa=0.005; gyroangledt = (float)ticycle_timegangleratedeg; gangleraterads=(float)gangleratedeg*0.017453;

/DEGREES 中的新角度是旧角度 加上陀螺仪的角度变化,因为 最后一个周期有一点新 加速度读数考虑/角度= (float)((1-aa) * (角度+gyroangledt)) + (aa * x_accdeg); //主角度计算函数*/ //转换 角度从度到弧度

 anglerads=(float)angle*0.017453;
      balance_torque=(float)(4.5*anglerads)

+ (0.5*gangleraterads);

cur_speed = (float)(cur_speed + (油门踏板 * 平衡扭矩 * cycle_time)) * 0.999;

/*级别值从-1到+1并且 表示要发送的占空比 到电机。转换为弧度 帮助我们保持在这些限制内 level = (balance_torque + cur_speed) * 整体增益;

void timer_init() TCCR0 = 0 | (1

// PWM模式为“PWM, Phase Correct, 10 位" TCCR1A = 0 | (1

(1

void set_motor()

/* leveli 项是级别项 从 -1023 重新调整为 +1023 作为 整数准备发送到 PWM 电机 依次控制端口 连接到 OSMC*/

//如果(级别0.9) level=0.9;

int16_t leveli = (int16_t)(级别*1023); //注意这里我们 取我们的浮点值 以“级别”结束,我们相乘 它由1023,然后将其变成一个 将值输入之前的整数 PWM 发生器为“leveli”

如果(级别1020) leveli=1020;

/设置端口 B1 上的 LED 或蜂鸣器 如果扭矩太大,警告我减速 交付量超过最大值的 50% 可能的原因是 你总是需要一些备用马达 万一你开始小费的力量 以速度前进 如果电机已经 你将要全力以赴 高速摔倒!有些使用 自动提示返回例程自动 限制最高速度。现在我会做 这样更容易/

if (level0.7) 端口 B |= (1

软启动 = (float) 软启动+0.001; if (softstart>1.0) softstart=1.0;

//PORTC |= (0<<PC1);   // AHI=1  PinC3, BHI=1 PinC2 set both to ON for

OSMC 工作,两者都关闭以关闭 motor down /*注意:不知道为什么,但是 停止电机切断方向 我最终对硬线的改变 AHI 和 BHI 至 +12V // 未禁用 OSMC 通过将 PinC1 输出设置为零, 1 将禁用 OSMC*/ PORTC |= 0x0c; //使C1下拉so 取消禁用 OSMC,即启用它。 PORTC &= ~0x02; //如果关闭则禁用 (水平

int main(void) 初始化端口();

adc_init();

timer_init();

/* 初始倾斜启动代码 打开 微而板倾斜到一侧, 如果倾斜,骑手即将踏上它 角度穿过零(中)点平衡 算法变得可操作 否则永远锁定在这个循环中 直到它倾斜到水平位置 当骑手上车*/ 提示= 0;加速度 = 0;

while (tipstart

// 你需要这个来允许 SG 过滤到适当的稳定 首次开机时的价值, 在查看 accsum 的值之前 (下)。

对于 (i=0; i 样本输入();

if (accsum524) // 如果 (x_accdeg>0) tipstart=0; 否则 tipstart=1; 软启动=0.4;

角度=0; cur_speed=0; /* 倾斜结束 开始代码。如果超过这个点 然后机器变得水平并且是 活跃*/

sei();

while (1) sample_inputs();

set_motor();

【问题讨论】:

那是太多代码了。请发布一个最小的测试用例,这足以说明问题,同时完成(即可编译)。 通过尝试将此代码减少到生成错误的最小子集,您可能会发现错误。 这个问题需要做大量的清理工作……至少,在问题正文中正确格式化代码,以便于阅读。 【参考方案1】:

这是一个相当简单的 Arduino 代码链接,用于控制 DIY Segway。

我认为这对你的滑板来说会是一个更好的起点。

http://diysegway.blogspot.com/

最好的祝福

约翰

【讨论】:

【参考方案2】:

当编译器告诉你某些东西“没有在这个范围内声明”时,作为你自己的这个问题:

在什么范围被声明?

如果你不能回答这个问题,那么你已经发现了问题。毕竟,如果不知道那个名字指的是什么,你怎么能指望编译器呢?请记住,编写的任何代码的专家。

如果您可以确定该事物在哪个范围内声明,那么下一个任务是确定该范围与您尝试使用它的范围之间的关系。典型的问题包括(但不限于)以下:

它是在其他命名空间中声明的。使用 :: 范围解析运算符提供完全限定名称。 它被声明为类的成员,而您正试图在独立函数中使用它。要么找到类的实例并通过该对象访问变量或函数,要么更改类以将新函数作为其成员之一。

如果您无法找到它被声明的范围,那么有几件事可能是错误的:

你拼错了。检查文档中的拼写并修正您的代码。 它是在您忘记包含的某些标头中声明的。找出它的声明位置并添加适当的#include 指令。 这可能是您的问题。 它没有在任何地方声明。弄清楚它应该在哪里声明并自己在那里声明。

【讨论】:

【参考方案3】:

您很可能为您的构建指定了错误的 MCU。虽然 DDRA 存在于 Arduino Mega 的 ATmega1280 上,但 DDRA 不存在于普通 Arduino 的 ATmega328 上。

如果您使用的是 Arduino UI,请转到工具 |登上并选择 Arduino Mega。

如果您使用自己的构建系统,则需要更新您在 gcc 命令行上为 -mmcu= 指定的值。

【讨论】:

非常感谢!实际上,一旦我将 Board 更改为 Arduino Mega,这个错误就不会再出现了。我有:在函数'void sample_inputs()'中:错误:'92'不能用作函数在函数'void timer_init()'中:在函数'int main()'中:【参考方案4】:

我想你可能在这里留下了结束评论:

/*The level value is from -1 to +1 and represents the duty cycle to be sent to the motor. Converting to radians helps us stay within these limits >>>*/<<<

【讨论】:

眼光不错,但我不认为他在他的汇编中走得那么远。 +1 无论如何,如果没有这个修复,这段代码就无法编译。

以上是关于C++“未在此范围内声明”编译错误及修改提示的主要内容,如果未能解决你的问题,请参考以下文章

错误:“getRotationMatrix2D”未在此范围内声明

带有ndk平台错误帮助'_IOR'的c ++未在此范围内声明

错误:____未在此范围内声明

arm-none-eabi-g++ 编译器抛出编译错误 pthread_exit 未在此范围内声明

使用 gcc 编译器时未在此范围内声明“memcpy”

Python3 mlpy 安装错误 - 'Py_InitModule3' 未在此范围内声明