指针有点问题。
首先,我必须使用C语言,并且我创建了一个名为_Arguments的结构,它包含一组数据,包括几个指针。 其中一些指针指向我创建的其他结构。
我会从结构中删除一些东西,以帮助保持帖子小,但希望仍然包含主要信息。
所以我们有:
struct _Arguments
{
struct _AirPlanes *InAirPlanes;
struct _GroundPlanes *GroundedPlanes;
struct _Runway *Runways;
} Arguments;
然后
typedef struct _Runway
{
struct _GroundPlanes *FirstGroundPlane;
struct _AirPlanes *FirstAirPlane;
struct _Runway *Next;
struct _Runway *Previous;
};
和
typedef struct _AirPlanes
{
struct _AirPlanes *Next;
struct _AirPlanes *Previous;
struct _AirPlanes *NextOnRunway;
struct _AirPlanes *PrevOnRunway;
};
最后
typedef struct _GroundPlanes
{
struct _GroundPlanes *NextOnRunway;
struct _GroundPlanes *PrevOnRunway;
struct _GroundPlanes *Next;
struct _GroundPlanes *Previous;
};
结构包含更多的可用物品但这是主要部分.. 所以你可以看到我在这里使用链接列表并制作类似于T台的东西。
现在我已经开始运行大量代码,但是在寻找下一个最佳跑道时我遇到了问题。 我在主循环中调用了一个名为
的函数struct _Runway* NextAvailable = NextAvailableRunway(&Arguments.Runways);
这贯穿所有跑道,找到接地最少的飞机。 但是,如果有两条相同数量的接地飞机的跑道,那么我想要相互测试它们,以找出最少有飞机等待着陆的地方。
这意味着我有以下内容(制作速记以便更容易找到关键问题)
struct _Runway* NextAvailableRunway(struct _Runway** MainStartingRunway)
{
struct _Runway* CurrentRunway = *MainStartingRunway;
struct _GroundPlanes* CurrentGroundedPlane;
struct _Runway* BestRunway = NULL;
// Main Loop used to check ALL Runways
while (CurrentRunway != NULL)
{
// Look for the first plane on the current runway
// Loop through all the planes to count the planes on current Runway
// If the count of planes is the smallest found so far
BestRunway = CurrentRunway;
// Else if it matches our current smallest
BestRunway = RunwayWithLeastAir(BestRunway, CurrentRunway);
// Then finally go to next runway to loop though them all
CurrentRunway = CurrentRunway->Next;
}
return BestRunway;
}
显然上面的代码已经缩短了,但除了
之外,它的工作原理也是如此BestRunway = RunwayWithLeastAir(BestRunway, CurrentRunway);
所以我希望在这里做的是通过我们与CurrentRunway一起使用的BestRunway,以便我们可以测试它们并返回两者中最好的一个。 据我所知,该函数传递的东西都是指向结构的指针,因此使用以下代码就可以了。
struct _Runway* RunwayWithLeastAir(struct _Runway* BestRunway, struct _Runway* CurrentRunway)
{
struct _Runway* RunwayToCount = BestRunway;
struct _AirPlanes* CurrentAirPlane = NULL;
struct _Runway* LeastAirRunway = NULL;
int SmallestQueSize = -1;
// Loop through both runways
// Count the planes in the air for runway 1
// Count the planes in the air for runway 2
// Return the runway with the least in air planes.
while (RunwayToCount != NULL)
{
CurrentAirPlane = RunwayToCount->FirstAirPlane;
int CurrentRunwaysQueSize = 0;
// Loop to count the planes on current Runway
while (CurrentAirPlane != NULL)
{
CurrentRunwaysQueSize++;
CurrentAirPlane = CurrentAirPlane->NextOnRunway;
}
if (CurrentRunwaysQueSize < SmallestQueSize || SmallestQueSize == -1)
{
SmallestQueSize = CurrentRunwaysQueSize;
LeastAirRunway = RunwayToCount;
}
if (RunwayToCount == BestRunway)
RunwayToCount = CurrentRunway;
else
RunwayToCount = NULL;
}
return LeastAirRunway;
}
但我得到的错误是: 错误C2373'RunwayWithLeastAir':重新定义;不同类型的修饰符
现在我假设这里的问题是我将两个指针以外的东西传递给RunwayWithLeastAir函数。 当我注释掉运行该函数的行(NextAvailableRunway函数中的那一行)时,它运行正常,但是当我尝试实际使用函数时,我认为它应该运行它失败。
我相信这可能是因为我在NextAvailableRunway函数中使用指针指针,所以当它传递CurrentRunway时它实际上传递的不是标准指针???
任何想法的人?
答案 0 :(得分:1)
以下行会给出警告:
BestRunway = RunwayWithLeastAir(BestRunway, CurrentRunway);
警告C4013&#39; RunwayWithLeastAir&#39;不确定的;假设extern返回int
这些警告应被视为错误。
现在你声明你的RunwayWithLeastAi
:
struct _Runway* RunwayWithLeastAir(struct _Runway* BestRunway, struct _Runway* CurrentRunway)
但是由于编译器已经假定RunwayWithLeastAir
是一个返回int
的函数,这个声明是相反的,因此是错误的。
要消除错误,您必须在使用之前声明该功能。
只需在struct
声明之后添加,但至少之前 NextAvailableRunway
函数。
struct _Runway* RunwayWithLeastAir(struct _Runway* BestRunway, struct _Runway* CurrentRunway);
以下最小例子说明了问题:
int bar()
{
foo(1);
}
void *foo(int a)
{
}
但这会编译:
void *foo(int a);
int bar()
{
foo(1);
}
void *foo(int a)
{
}