C++ 错误:';轨道';未在此范围中声明
我正在处理一个Arduino项目,我的主文件中有以下结构:C++ 错误:';轨道';未在此范围中声明,c++,arduino,C++,Arduino,我正在处理一个Arduino项目,我的主文件中有以下结构: struct gpsCoord_t { long latitude; long longitude; }; struct track_t { char code[4]; gpsCoord_t bounds[4]; gpsCoord_t points[4]; }; 接下来,我有一个函数将这种类型的变量转储到同一文件中的串行总线: void dumpTrack(track_t track) { Serial.p
struct gpsCoord_t {
long latitude;
long longitude;
};
struct track_t {
char code[4];
gpsCoord_t bounds[4];
gpsCoord_t points[4];
};
接下来,我有一个函数将这种类型的变量转储到同一文件中的串行总线:
void dumpTrack(track_t track) {
Serial.print("\nTrack: ");
Serial.print(track.code);
Serial.print("\nTrack bounds: ");
Serial.print("\n- 1 lat: ");
Serial.print(track.bounds[0].latitude);
Serial.print("\n- 1 lon: ");
Serial.print(track.bounds[0].longitude);
}
编译器产生2个没有行号的错误,我认为第一个错误是由第二个错误引起的:
error: variable or field 'dumpTrack' declared void
error: 'track_t' was not declared in this scope
编辑以下是完整的文件:
#include <Wire.h> //I2C library
#include <I2C_eeprom.h>
#include <SoftwareSerial.h>
#include <TinyGPS.h>
I2C_eeprom ee(0x50);
const int baseTrackAddress = 3;
const int trackSize = 68;
const int maxTracks = 480;
int powerOnLED = 2;
int gpsFixLED = 3;
int trackFoundLED = 4;
int errorLED = 6;
int gpsSensor = 7;
TinyGPS gps;
SoftwareSerial nss(gpsSensor, 255);
int calcTrackAddress(int trackId) {
return (trackId*trackSize) + baseTrackAddress;
}
struct gpsCoord_t {
long latitude;
long longitude;
};
struct track_t {
char code[4];
gpsCoord_t bounds[4];
gpsCoord_t points[4];
};
track_t tracks[maxTracks];
void setup()
{
Serial.begin(115200);
Serial.flush();
Serial.print("Demo I2C eeprom library ");
Serial.print(I2C_EEPROM_VERSION);
Serial.println("\n");
strcpy(tracks[0].code, "X11");
tracks[0].bounds[0].latitude = 0;
tracks[0].bounds[0].longitude = 0;
tracks[0].points[0].latitude = 0;
tracks[0].points[0].longitude = 0;
ee.writeBlock(3, (uint8_t*)&tracks[0], trackSize);
}
void loop()
{
Serial.println("\nTEST: 64 byte page boundary writeBlock");
dumpEEPROM(0, 255);
while(1);
}
void dumpTrack(track_t track) {
Serial.print("\nTrack: ");
Serial.print(track.code);
Serial.print("\nTrack bounds: ");
Serial.print("\n- 1 lat: ");
Serial.print(track.bounds[0].latitude);
Serial.print("\n- 1 lon: ");
Serial.print(track.bounds[0].longitude);
}
void readTrack(int trackId) {
track_t track;
ee.readBlock(60, (uint8_t*)&track, 10);
}
void readTracks() {
}
void dumpEEPROM(unsigned int addr, unsigned int length)
{
// block to 10
addr = addr / 10 * 10;
length = (length + 9)/10 * 10;
byte b = ee.readByte(addr);
for (int i = 0; i < length; i++)
{
if (addr % 10 == 0)
{
Serial.println();
Serial.print(addr);
Serial.print(":\t");
}
Serial.print(b);
b = ee.readByte(++addr);
Serial.print(" ");
}
Serial.println();
}
void ProcessCommand(char* command) {
//switch(*command==)
}
char* ReadSerialCommand() {
int i=0;
char commandbuffer[100];
if(Serial.available()){
delay(100);
while( Serial.available() && i< 99) {
commandbuffer[i++] = Serial.read();
}
commandbuffer[i++]='\0';
}
if(i>0)
return (char*)commandbuffer;
else
return 0L;
}
#包括//I2C库
#包括
#包括
#包括
I2C_eeprom ee(0x50);
const int baseTrackAddress=3;
const int trackSize=68;
常量int maxTracks=480;
int powerOnLED=2;
int-gpsfixld=3;
int trackfounded=4;
int errorLED=6;
int-gpsSensor=7;
TinyGPS;
软件系列nss(gpsSensor,255);
int calcTrackAddress(int trackId){
返回(trackId*trackSize)+baseTrackAddress;
}
结构gpsCoord\u t{
长纬度;
经度长;
};
结构跟踪{
字符码[4];
gpsCoord_t界[4];
gpsCoord_t点[4];
};
轨道t轨道[最大轨道];
无效设置()
{
序列号开始(115200);
Serial.flush();
串行打印(“演示I2C eeprom库”);
串行打印(I2C_EEPROM_版本);
Serial.println(“\n”);
strcpy(磁道[0]。代码为“X11”);
轨迹[0]。边界[0]。纬度=0;
轨迹[0]。边界[0]。经度=0;
轨迹[0]。点[0]。纬度=0;
轨迹[0]。点[0]。经度=0;
ee.writeBlock(3,(uint8_t*)和磁道[0],磁道大小);
}
void循环()
{
Serial.println(“\n测试:64字节页边界写块”);
dumpEEPROM(0255);
而(1),;
}
无效转储轨道(轨道\u t轨道){
Serial.print(“\n回退:”);
串行打印(轨道代码);
Serial.print(“\n回溯边界:”);
串行打印(“\n-1 lat:”);
Serial.print(track.bounds[0].纬度);
Serial.print(“\n-1 lon:”);
Serial.print(track.bounds[0]。经度);
}
void readTrack(int trackId){
轨道(t)轨道;;
ee.读块(60,(uint8_t*)和轨道,10);
}
void readTracks(){
}
无效转储EEPROM(无符号整数地址,无符号整数长度)
{
//街区到10
地址=地址/10*10;
长度=(长度+9)/10*10;
字节b=ee.readByte(地址);
for(int i=0;i0)
返回(char*)命令缓冲区;
其他的
返回0升;
}
当我将整个dumpTrack函数放在comment中时,错误就消失了。我已经检查了几次输入错误,但没有找到任何错误。您似乎正在将此代码编译为C 而不是
struct track_t {
char code[4];
gpsCoord_t bounds[4];
gpsCoord_t points[4];
};
写
似乎您正在将此代码编译为C 而不是
struct track_t {
char code[4];
gpsCoord_t bounds[4];
gpsCoord_t points[4];
};
写
我怀疑在标题的某个地方有一个名为dumpTrack的变量。为什么不把这个函数重命名为其他函数呢 一般来说,最好避免使用保留字作为函数名;“循环”不是函数名的好选择
编辑:后者可能是您出现问题的原因。我怀疑在标题的某个地方有一个名为dumpTrack的变量。为什么不把这个函数重命名为其他函数呢 一般来说,最好避免使用保留字作为函数名;“循环”不是函数名的好选择
编辑:后者可能是您出现问题的原因。请提供一个完整(但最小)的文件,该文件存在此问题。问题可能出现在
转储轨道
之前的行上。请提供一个完整(但最小)的文件存在此问题的文件。问题可能出现在dumpTrack
之前的行上。loop是Arduino所需的函数名。loop是Arduino所需的函数名。或者保持定义不变,并将类型引用为struct track\t
@KeithThompson您的解决方案确实有效!“我怎样才能把什么标记为答案呢?”西尔瓦英杰拉德:你不能接受评论作为答案。若要接受答案,请单击旁边的复选标记。@arrowdodger:我没有发布答案,只是对你的答案发表评论。你的回答是正确的;我只是扩展了一下。(如果您愿意,请随时将我的评论编辑到您的答案中。)或者保持定义不变,并将类型引用为struct track\t
@KeithThompson您的解决方案确实有效!“我怎样才能把什么标记为答案呢?”西尔瓦英杰拉德:你不能接受评论作为答案。若要接受答案,请单击旁边的复选标记。@arrowdodger:我没有发布答案,只是对你的答案发表评论。你的回答是正确的;我只是扩展了一下。(如果您愿意,请随时将我的评论编辑到您的答案中。)