C 中的结构有 "no member named..." 错误
Structures in C with "no member named..." error
我正在尝试创建一个包含国家、州、城市和当地商店名称的结构。不幸的是,我得到这个错误:
No member named bavaria in struct country
所以错误似乎出现在这里:
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;
}
您已经定义了四个独立的结构体。他们没有相互联系。
您现在可以做到
strcpy(germany.state.city.shop, "Westpark");
或
strcpy(westpark, "Westpark");
通常,结构成员名称是编译时的东西。它们被编译器解析为地址偏移量。您 city/state/shop 名称是运行时数据。您不能将它们用作结构成员。
您显然还想建立一个 1:n 关系模型。我认为您需要不同的数据结构,例如哈希。
让我们将定义与使用它们的地方分开,以便于阅读:
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");
变量 bavaria
、ingolstadt
和 westpark
是单独的项目,不是 country
结构的成员。
strcpy(germany.state.city.shop.shopname, "Westpark");
可能有效(但可能无法达到您的预期)。
根据您的结构当前的定义方式,您需要这样做:
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");
当你在这个上下文中写 struct Y
struct X {
struct Y {
int z;
} y;
} x;
你做了两件事:
- 定义
struct Y
和
- 在
struct X
. 中添加 struct Y
类型的字段 y
你定义的四个struct
是相互独立的。您的每个 struct
都定义了一个商店,因为您的 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[]
数组中有多少元素已被填充,每个 state[]
存储中的 cityCount
已填充的 city[]
个元素的数量,依此类推。
这个 struct
的大小大约是 50MB,所以不要让它成为自动局部变量:它应该是外部作用域静态或函数作用域静态,因为 50 MB在大多数系统上,堆栈 space 太多了。以下是如何将您的商店添加到此 struct
:
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");
请注意,这是非常低效的,因为它会预先分配最大的所有内容。因此,代表不来梅和巴伐利亚的 state[]
数组的元素最终将具有相同数量的预分配 city[]
元素,即使巴伐利亚要大得多,并且可能需要更多的城市条目。要以资源高效的方式处理此问题,您需要使用动态内存分配。
我正在尝试创建一个包含国家、州、城市和当地商店名称的结构。不幸的是,我得到这个错误:
No member named bavaria in struct country
所以错误似乎出现在这里:
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;
}
您已经定义了四个独立的结构体。他们没有相互联系。
您现在可以做到
strcpy(germany.state.city.shop, "Westpark");
或
strcpy(westpark, "Westpark");
通常,结构成员名称是编译时的东西。它们被编译器解析为地址偏移量。您 city/state/shop 名称是运行时数据。您不能将它们用作结构成员。
您显然还想建立一个 1:n 关系模型。我认为您需要不同的数据结构,例如哈希。
让我们将定义与使用它们的地方分开,以便于阅读:
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");
变量 bavaria
、ingolstadt
和 westpark
是单独的项目,不是 country
结构的成员。
strcpy(germany.state.city.shop.shopname, "Westpark");
可能有效(但可能无法达到您的预期)。
根据您的结构当前的定义方式,您需要这样做:
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");
当你在这个上下文中写 struct Y
struct X {
struct Y {
int z;
} y;
} x;
你做了两件事:
- 定义
struct Y
和 - 在
struct X
. 中添加
struct Y
类型的字段 y
你定义的四个struct
是相互独立的。您的每个 struct
都定义了一个商店,因为您的 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[]
数组中有多少元素已被填充,每个 state[]
存储中的 cityCount
已填充的 city[]
个元素的数量,依此类推。
这个 struct
的大小大约是 50MB,所以不要让它成为自动局部变量:它应该是外部作用域静态或函数作用域静态,因为 50 MB在大多数系统上,堆栈 space 太多了。以下是如何将您的商店添加到此 struct
:
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");
请注意,这是非常低效的,因为它会预先分配最大的所有内容。因此,代表不来梅和巴伐利亚的 state[]
数组的元素最终将具有相同数量的预分配 city[]
元素,即使巴伐利亚要大得多,并且可能需要更多的城市条目。要以资源高效的方式处理此问题,您需要使用动态内存分配。