从 C 中的结构检索值时出现编译错误
Compile error when retrieving a value from a struct in C
我正在使用 C++Builder XE4。我正在尝试将一些 C 代码编译成控制台应用程序。 C 文件很大,所以我试图集中精力解决这个问题。该代码设置了两个结构,然后尝试调用一个失败的值。
struct ephloc
{
long first_item_ordinal;
long last_item_ordinal;
int days_per_record;
int items_per_record;
int total_records;
};
struct ephloc objs[15] = {
{ 641, 2210500, 8, 44, 50224},
{2210501, 3014088, 16, 32, 25112},
{3014089, 4043684, 16, 41, 25112},
{4043685, 4483148, 32, 35, 12556},
{4483149, 4809608, 32, 26, 12556},
{4809609, 5098400, 32, 23, 12556},
{5098401, 5349524, 32, 20, 12556},
{5349525, 5600648, 32, 20, 12556},
{5600649, 5851772, 32, 20, 12556},
{5851773, 6730696, 16, 35, 25112},
{6730697, 10849068, 4, 41, 100448},
{10849069,14967440, 4, 41, 100448},
{14967441,14967452, 401792, 8, 1},
{14967453,14967464, 401792, 8, 1},
};
下面的代码在 [2] 处停止并显示下面的两个错误。如何修改此代码以使其工作?
E2110: 不兼容的类型转换 (C++) 请求的转换无法完成。
E2062 间接寻址无效 (C++)
int LoadData( D, iobj, p, v )
double D;
int iobj;
double p[], v[];
{
int s;
//--Lots of code here--
s = objs[iobj][2];
//--more code here--
}
这是 "C++ is just a superset of C" 再次被证明是错误的案例。您的 C 函数声明已过时,名为 K&R syntax。这些早于现代函数原型,现在在 C 中无效。此外,它们从一开始就在 C++ 中无效。就您的 C++ 编译器而言,唯一有效的函数声明是:
int LoadData( double D, int iobj, double p[], double v[] )
{
而且你最好确保相应的头文件匹配它。 K&R 与 "function without a prototype" 声明齐头并进,即 int LoadDate();
,在 C++ 中它是一个不带参数的函数。所以如果你不调整它,那将是一个声明不匹配。
struct ephloc objs[15] = { /* whatever */ };
这将 objs
定义为具有 15 个 ephloc
类型元素的数组。
objs[iobj]
这将访问该数组的一个元素。因为每个元素的类型都是 ephloc
,这个表达式给你一个 ephloc
.
objs[iobj][2]
这试图访问数组的第二个元素。但是 objs[iobj]
不是数组,所以编译器告诉你不能这样做。
要访问该元素的成员,请使用成员名称:
objs[iobj].first_item_ordinal
这将访问对象的第一个成员 objs[iobj]
。
我正在使用 C++Builder XE4。我正在尝试将一些 C 代码编译成控制台应用程序。 C 文件很大,所以我试图集中精力解决这个问题。该代码设置了两个结构,然后尝试调用一个失败的值。
struct ephloc
{
long first_item_ordinal;
long last_item_ordinal;
int days_per_record;
int items_per_record;
int total_records;
};
struct ephloc objs[15] = {
{ 641, 2210500, 8, 44, 50224},
{2210501, 3014088, 16, 32, 25112},
{3014089, 4043684, 16, 41, 25112},
{4043685, 4483148, 32, 35, 12556},
{4483149, 4809608, 32, 26, 12556},
{4809609, 5098400, 32, 23, 12556},
{5098401, 5349524, 32, 20, 12556},
{5349525, 5600648, 32, 20, 12556},
{5600649, 5851772, 32, 20, 12556},
{5851773, 6730696, 16, 35, 25112},
{6730697, 10849068, 4, 41, 100448},
{10849069,14967440, 4, 41, 100448},
{14967441,14967452, 401792, 8, 1},
{14967453,14967464, 401792, 8, 1},
};
下面的代码在 [2] 处停止并显示下面的两个错误。如何修改此代码以使其工作?
E2110: 不兼容的类型转换 (C++) 请求的转换无法完成。
E2062 间接寻址无效 (C++)
int LoadData( D, iobj, p, v )
double D;
int iobj;
double p[], v[];
{
int s;
//--Lots of code here--
s = objs[iobj][2];
//--more code here--
}
这是 "C++ is just a superset of C" 再次被证明是错误的案例。您的 C 函数声明已过时,名为 K&R syntax。这些早于现代函数原型,现在在 C 中无效。此外,它们从一开始就在 C++ 中无效。就您的 C++ 编译器而言,唯一有效的函数声明是:
int LoadData( double D, int iobj, double p[], double v[] )
{
而且你最好确保相应的头文件匹配它。 K&R 与 "function without a prototype" 声明齐头并进,即 int LoadDate();
,在 C++ 中它是一个不带参数的函数。所以如果你不调整它,那将是一个声明不匹配。
struct ephloc objs[15] = { /* whatever */ };
这将 objs
定义为具有 15 个 ephloc
类型元素的数组。
objs[iobj]
这将访问该数组的一个元素。因为每个元素的类型都是 ephloc
,这个表达式给你一个 ephloc
.
objs[iobj][2]
这试图访问数组的第二个元素。但是 objs[iobj]
不是数组,所以编译器告诉你不能这样做。
要访问该元素的成员,请使用成员名称:
objs[iobj].first_item_ordinal
这将访问对象的第一个成员 objs[iobj]
。