代码之家  ›  专栏  ›  技术社区  ›  PeterPan

C中出现“没有成员名…”错误的结构

  •  4
  • PeterPan  · 技术社区  · 9 年前

    我试图创建一个包含国家、州、城市和当地商店名称的结构。不幸的是,我遇到了以下错误:

    结构国家中没有名为bavaria的成员

    因此,错误似乎发生在这里: strcpy(germany.bavaria.ingolstadt.westpark, "Westpark");

    我做错了什么?

    这是我的完整代码:

    #include <stdio.h>
    #include <string.h>
    
    int main() {
    
        struct country {
            char countryname[100];
            struct state {
                char statename[100];
                struct city {
                    char cityname[100];
                    int postal;
                    struct shop {
                        char shopname[100];
                    } shop;
                } city;
            } state;
        } country;
    
        struct country germany;
        struct state bavaria;
        struct city ingolstadt;
        struct shop westpark;
    
        strcpy(germany.countryname, "Germany");
        strcpy(germany.bavaria.ingolstadt.westpark, "Westpark");
    
        return 0;
    }
    
    5 回复  |  直到 9 年前
        1
  •  3
  •   Claudiu    9 年前

    让我们将这些定义与它们的使用位置分开,以便于阅读:

    struct shop {
        char shopname[100];
    };
    
    struct city {
        char cityname[100];
        int postal;
        struct shop shop;
    };
    
    struct state {
        char statename[100];
        struct city city; 
    };
    
    struct country {
        char countryname[100];
        struct state state;
    };
    

    现在您已经:

    struct country germany;
    struct state bavaria;
    struct city ingolstadt;
    struct shop westpark;
    strcpy(germany.bavaria.ingolstadt.westpark, "Westpark");
    

    问题是: struct country 没有名为的成员 bavaria 。它只有一个名为 state 。您需要的是:

    strcpy(germany.state.city.shop.shopname, "Westpark");
    

    你可能真正想要的是:

    struct country germany;
    strcpy(germany.countryname, "Germany");
    strcpy(germany.state.statename, "Bavaria");
    strcpy(germany.state.city.cityname, "Ingolstadt");
    strcpy(germany.state.city.shop.shopname, "Westpark");
    
        2
  •  1
  •   Sergey Kalinichenko    9 年前

    当你写的时候 struct Y 关于这点

    struct X {
        struct Y {
            int z;
        } y;
    } x;
    

    你要做两件事:

    • 定义 结构Y
    • 添加字段 y 类型的 结构Y 在…内 struct X .

    四个人 struct 你定义的是彼此独立的。您的每个人 结构 s定义了单个商店,因为您的 struct country .

    以下是如何使用您定义的结构定义您的店铺:

    // This is what the structure dictates, probably not what you want
    struct country westpark;
    strcpy(westpark.countryname, "Germany");
    strcpy(westpark.state.statename, "Bavaria");
    strcpy(westpark.state.city.cityname, "Ingolstadt");
    strcpy(westpark.state.city.shop.shopname, "Westpark");
    

    不过,这看起来不像你想要的任何东西。我想你在找这样的东西:

    struct country {
        char countryname[100];
        struct state {
            char statename[100];
            struct city {
                char cityname[100];
                int postal;
                struct shop {
                    char shopname[100];
                } shop[MAX_SHOP]; // maybe 128
                int shopCount;
            } city[MAX_CITY];     // Around 256
            int cityCount;
        } state[MAX_STATE];       // Probably 16
        int stateCount;
    } country;
    

    这里的想法是将一个国家构建成一系列州,将一个州构建成一个城市,将一座城市构建成一组商店。此层次结构的每个级别还存储其级别中的项目计数,即。 stateCount 统计 state[] 阵列已填充, cityCount 在每个 状态[] 存储 city[] 已填充的元素等等。

    这个的大小 结构 将大约为50MB,因此不要将其设置为自动本地变量:它应该是外部作用域静态的或函数作用域静态,因为在大多数系统上,50MB的堆栈空间太大。以下是如何将您的店铺添加到此 结构 :

    strcpy(country.countryname, "Germany");
    country.stateCount = 1; // For Bavaria
    strcpy(country.state[0].statename, "Bavaria");
    country.state[0].cityCount = 1; // For Ingolstadt 
    strcpy(country.state[0].city[0].cityname, "Ingolstadt");
    country.state[0].city[0].shopCount = 1; // for Westpark
    strcpy(country.state[0].city[0].shop[0].shopname, "Westpark");
    

    请注意,这是非常低效的,因为它最大限度地预分配所有内容 状态[] 代表不来梅和巴伐利亚的数组最终将得到相同数量的预分配 城市[] 尽管巴伐利亚州要大得多,而且可能需要更多的城市条目。要以资源高效的方式处理此问题,您需要使用动态内存分配。

        3
  •  1
  •   Bo Persson Touseef    9 年前

    变量 bavaria , ingolstadt westpark 是单独的项目,而不是 country 结构。

    strcpy(germany.state.city.shop.shopname, "Westpark");
    

    可能会起作用(但可能不会按你的意愿做)。

        4
  •  1
  •   dbush    9 年前

    根据结构当前的定义,您需要执行以下操作:

    strcpy(germany.countryname, "Germany"); 
    strcpy(germany.state.statename, "Bavaria");
    strcpy(germany.state.city.cityname, "ingolstadt");
    strcpy(germany.state.city.shop.shopname, "Westpark");
    

    定义结构的更好方法如下:

       struct shop {
            char countryname[100];
            char statename[100];
            char cityname[100];
            int postal;
            char shopname[100];
        };
    

    然后你可以这样做:

    struct shop myshop;
    
    strcpy(myshop.countryname, "Germany"); 
    strcpy(myshop.statename, "Bavaria");
    strcpy(myshop.cityname, "ingolstadt");
    strcpy(myshop.shopname, "Westpark");
    
        5
  •  1
  •   undur_gongor user3795579    9 年前

    您已经定义了四个独立的结构。它们之间没有联系。

    你现在可以了

    strcpy(germany.state.city.shop, "Westpark");
    

    strcpy(westpark, "Westpark");
    

    通常,结构成员名称是编译时的事情。编译器解析它们以解决偏移。您的城市/州/商店名称是运行时数据。不能将它们用作结构成员。

    此外,您显然希望建立1:n关系的模型。我认为你需要一个不同的数据结构,比如哈希。