作为更大项目的一部分,我正在尝试编写一个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 = ¤t;
*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, ¤t);
错误(行号被编辑为与上面给出的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
答案 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
是*previous
,olnode
是指向指向¤t
的指针的指针。olnode
是*newnext
olnode
是指向*current