将指针传递给函数但仍获得“不同类型修饰符”错误

时间:2017-02-24 09:24:21

标签: c function pointers

指针有点问题。

首先,我必须使用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时它实际上传递的不是标准指针???

任何想法的人?

1 个答案:

答案 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)
{
}