2012-08-24 71 views
1

我與一個Arduino項目中,我已經在我的主文件有這些結構擺弄未聲明:錯誤:「track_t」在此範圍

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; 
} 

當我把整個dumpTrack功能評論,錯誤消失。我檢查了幾次錯字,但沒有找到任何錯誤。

+0

請提供有這個問題*完整*(但最少的)文件。 – Mankarse

+0

問題可能出現在* dumpTrack之前的行中。 –

回答

1

似乎正在編譯此代碼爲C.

相反

struct track_t { 
    char code[4]; 
    gpsCoord_t bounds[4]; 
    gpsCoord_t points[4]; 
}; 

寫的

typedef struct { 
    char code[4]; 
    gpsCoord_t bounds[4]; 
    gpsCoord_t points[4]; 
} track_t; 
+1

或者按照原樣保留定義並將該類型稱爲「struct track_t」。 –

+0

不起作用... –

+0

@KeithThompson您的解決方案DID工作!我如何着手標記什麼是答案? –

0

我懷疑在頭的地方有一個叫dumpTrack變量,爲什麼不你只需將該函數重命名爲其他內容?

另外一般情況下,避免使用保留字作爲函數名是很好的,「循環」對函數名不是一個好的選擇。

編輯:後者可能是原因,您的問題

+0

loop是Arduino所需的函數名稱。 –