2014-04-27 146 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