C中“非法使用选择器”

时间:2015-01-30 18:27:21

标签: c cc minix

作为更大项目的一部分,我正在尝试编写一个C函数,该函数在已实现的有序链表中搜索结构olnode中的值。但是,我收到了一些错误。我是C的新手,我在使用指针和双指针以及什么时候使用什么,所以我认为这是问题的一部分,但我不确定如何解决问题。包括所有必需的标题。这是在使用cc作为编译器的Minix 2.0.4上。

我可以提供任何其他必要的代码;因为我不熟悉C我不知道我需要展示多少,所以我提供了我认为需要的东西,而不是为了保持简短。

全局代码(标题除外):

#define POOLSZ 53
struct olnode {
    int eventnr;
    int eventfq;
    struct olnode *next;
};
typedef struct olnode olnode;
olnode pool[POOLSZ];
olnode *avail;    /* points to first available node */

返回错误的函数(在完成*current之后搜索传递的int应该是保存当前值的olnode):

void
srchfreq(olnode *list, int xfrequency, olnode **current)
{
    olnode *previous, *newnext;

    while(current->eventfq > xfrequency) {
        *previous = &current;
        *newnext = current->next;
        *current = *newnext;
    }
}

srchfreq()的函数调用(在不同的函数中):

/* *list points to the first node in the list
   (*current).eventfq is the value being searched for
*/

srchfreq(*list, (*current).eventfq, &current);

错误(行号被编辑为与上面给出的srchfreq()中的行有关):

line 6: illegal use of selector eventfq
line 7: cannot convert pointer to struct
line 8: illegal use of selector next
line 8: cannot convert pointer to struct
line 9: cannot convert struct to pointer

3 个答案:

答案 0 :(得分:1)

void
srchfreq(olnode *list, int xfrequency, olnode **current)
{
    olnode *previous, *newnext;

    while((*current)->eventfq > xfrequency) {
        previous = *current;
        newnext = (*current)->next;
        *current = newnext;
    }
}

第二部分取决于参数的类型。如果list声明为olnode *list,则无需取消引用它,因为函数需要指针。第二个和第三个参数是错误的(其中一个 - 确定我们需要知道如何声明current)。

答案 1 :(得分:1)

current具有类型olnode**,或指向oldnode的指针。要获取指向olnode的指针,请将指针取消引用一次:

*current;

要获取olnode本身,请取消引用从解除引用指针指针所获得的指针

**current;

所以在你的情况下,抓住字段eventfq

(**current).eventfq

C还提供了一个快捷方式,其中操作(*ptr).field完全等同于prt->field

在您的情况下,您可以将其应用于

(*current)->eventfq

答案 2 :(得分:1)

错误,按照出现顺序:

  • 由于current是指针指向<{em>}的指针,因此无法直接引用任何字段;但是olnode可以。
  • *current*previousolnode是指向指向&current的指针的指针。
  • 查看第一个错误
  • olnode*newnext
  • olnode是指向*current
  • 的指针