结构的问题

Problems with struct

本文关键字:问题 结构      更新时间:2023-10-16

所以我的代码中有两种类型的问题。。。一般形式有:

"的左侧…必须具有类/结构/联合":

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

以及"'doc'使用未定义的结构'main::m_doc'"

struct m_doc doc;

而结构体mdoc-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;
}

我问过的任何人都说这是范围问题,但他们都不知道问题所在,因为一切看起来都很好。。。请帮帮我,我们非常感谢您的帮助:)

我猜您对何时使用正向声明以及何时包含结构定义感到困惑。以下是一些指导原则。

转发声明
结构的正向声明的形式为:

struct m_doc doc;  

此表单用于解析定义、引用符号doc的任何指针或引用。通常,它被放在其他结构或函数声明之前的头文件中,以减少#include文件的数量。

结构定义
您需要在任何代码之前提供结构定义:

  1. 创建结构的实例
  2. 或者在提到结构细节之前(成员和方法)

#include文件中放置结构
与其在使用的任何地方都键入结构,一种方便的做法是将其放在头文件中,对于C语言结构,通常为".h",对于C++类和结构,通常是".hpp"或".hh"。因此,当源文件中有一个函数引用该结构(或创建该结构的实例)时,请在该函数使用该文件之前将其与定义一起包含。

大多数编译器都会发出错误

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

当它找不到结构的定义或声明时。