2014-04-27 112 views
-3

所以我在從我的代碼兩種類型的問題...一般形式是:與結構問題

「留下的......必須有類/結構/聯合」:

     doc.id[j] = NULL; 
         doc.ISBN[j] = NULL; 
         doc.title[j] = NULL; 
         doc.year[j] = NULL; 

和「‘doc的’使用未定義結構‘主:: m_doc’」

struct m_doc doc; 

而結構m_doc文檔被包括在每個功能的頂部。

這裏是我的結構:

struct m_doc{ 

    char id[30]; 
    int ISBN[30]; 
    char title[50]; 
    char author[50]; 
    int year[30]; 
}; 

我的拳頭功能:

void menudoc() 
{ struct m_doc doc; 
    int c = 0, a = 0, b; 
    cout << "1. Them tai lieu moi" << endl; 
    cout << "2. Xoa tai lieu" << endl; 
    cout << "3. Bao cao theo nam xuat ban" << endl; 
    cout << "0. Tro lai menu truoc" << endl; 
    cout << "Ban chon:"; 
    cin >> b; 
    switch (b) 
    { 
    case 1: 
    { 
       for (int i = 0;; i++) 
       { 
        if (doc.id[i] == NULL && doc.ISBN[i] == NULL && doc.title[i] == NULL && doc.author[i] == NULL && doc.year[i] == NULL) 
        { 
         i = c; break; 
        } 
        else continue; 
       } 
       cin >> doc.author[c] ; 
       cin >> doc.id[c] ; 
       cin >> doc.ISBN[c] ; 
       cin >> doc.title[c]; 
       cin >> doc.year[c]; 
       for (int i = 0;; i++){ 
        for (int j = 1;; j++){ 
         if (doc.id[i] == doc.id[j]){ 
          doc.author[j] = NULL; 
          doc.id[j] = NULL; 
          doc.ISBN[j] = NULL; 
          doc.title[j] = NULL; 
          doc.year[j] = NULL; 
         } 
         if (doc.year[i]<1000 || doc.year[i]>9999){ 
          doc.author[i] = NULL; 
          doc.id[i] = NULL; 
          doc.ISBN[i] = NULL; 
          doc.title[i] = NULL; 
          doc.year[i] = NULL; 
         } 
        } 
       } 
       break; 
    } 


    case 2: 
    { 
       int x; 
    char docid[50]; 
    cout << "IDDOC: "; 
    cin >> docid[50]; 
    cout << "\n"; 
    for (int i = 0;; i++){ 
     if (docid[50] == doc.id[i]) { 
      doc.author[i] = NULL; 
      doc.id[i] = NULL; 
      doc.ISBN[i] = NULL; 
      doc.title[i] = NULL; 
      doc.year[i] = NULL; 
      x++; 
     } 

    } 
    if (x == 0) cout << "IDDOC khong ton tai." << endl; 
    break; 
    } 
    case 3: 
    { 
       int yeardoc[50]; 
    cin >> yeardoc[50]; 
    for (int i = 0;; i++){ 
     if (yeardoc[50] == doc.year[i]) 
      write_output(i, "report.scv"); 

    } 
    break; 
    } 
    case 0: 
    { 
       menubegin(); 
       break; 
    } 
     menudoc(); 
    } 

}

我的第二個功能:

int write_output(int i, char* filename){ 
    ios::out; 
    struct m_doc doc; 
    // open file for output 
    ofstream fout(filename); 
    char * k, *h; 
    k = strchr(doc.title, ','); 
    h = strchr(doc.author, ','); 
    if (k != 0 && h != 0)fout << doc.id[i] << "\n" << doc.ISBN[i] << "\n" << '"' << doc.title[i] << '"' << "\n" << '"' << doc.author[i] << '"' << "\n" << doc.year[i] << endl; 
    if (k != 0) fout << doc.id[i] << "\n" << doc.ISBN[i] << "\n" << '"' << doc.title[i] << '"' << "\n" << doc.author[i] << "\n" << doc.year[i] << endl; 
    if (h != 0)fout << doc.id[i] << "\n" << doc.ISBN[i] << "\n" << doc.title[i] << "\n" << '"' << doc.author[i] << '"' << "\n" << doc.year[i] << endl; 
    // write informations 
    if (k == 0 && h == 0)fout << doc.id[i] << "\n" << doc.ISBN[i] << "\n" << doc.title[i] << "\n" << doc.author[i] << "\n" << doc.year[i] << endl; 

    // close file 
    fout.close(); 


    return 0; 
} 

任何人即時通訊問說,這是一些東西t範圍但他們都不知道這個問題,因爲一切看起來都很好...請幫助我,每一個幫助非常感謝:)

+2

indentation?錯誤行? – AntiClimacus

+0

當然,您可以更好地提供錯誤細節...因爲您希望人們幫助解決您收到的錯誤。沒有? – mah

+0

您發佈第二個功能**兩次**。 – herohuyongtao

回答

0

我猜你對什麼時候使用正向聲明和何時到包括的結構定義。這裏有一些指導原則。

向前聲明
的結構的前向聲明的形式爲:

struct m_doc doc; 

這種形式用於解析定義,其是指該符號doc任何指針或引用。通常這會放在其他結構或函數聲明之前的頭文件中,以減少文件的數量。

結構定義
你需要有任何代碼之前存在的結構定義:

  1. 創建結構的實例,
  2. 或任何指結構的細節之前, (成員&方法)。

#include文件
而不是打字處處結構它是用來放置的結構,方便的做法是將其放置在頭文件中,通常是「.H」爲C語言的結構和」 .HPP 「或」.hh「用於C++類和結構。所以當你在一個引用結構的源文件中有一個函數(或者創建了一個結構的實例)時,在函數使用該函數之前,將該文件包含在定義中。

大多數編譯器發出錯誤

"left of ... must have class/struct/union " 

當它找不到結構的定義或聲明。

+0

謝謝你先生:)非常感謝:) – Khang