将列表转换为struct

时间:2014-06-12 13:50:57

标签: c list struct

我正在尝试为我的forks写一个进程表。我有一个全局表,每个进程都必须写入此表。

我有结构

typedef struct {
int pid;        /* Prozess ID */
char* name;     /* Prozess Name (Programm) */
char* status;   /* Status des Programms */
int check;      /* bereits abgerufen? 1 - abgerufen, 0 - nicht abgerufen */
} Pstatus;

听着:

typedef struct liste {
  void *kopf;
  struct liste *rest;
} *Liste;

listeKopf:

void* listeKopf(Liste l) { 
  if(l==NULL)
    abbruch("listeKopf(listeLeer) undefiniert");
  return l->kopf; 
}

listeAnfuegen:

Liste listeAnfuegen(Liste l, void* element){
  Liste neu=reserviere(sizeof (struct liste));
  neu->kopf = element;
  neu->rest = l;
  return neu;
}

我正在使用struct Pstatus将我的进程编写到列表中。当我尝试从列表中读取时,我收到错误:转换为第284行请求的非标量类型

我的代码在这里:

http://pastebin.com/xEDvLTQk

有人能帮助我吗?

2 个答案:

答案 0 :(得分:1)

所以Liste是一个通用列表,可以通过void *指针保存对任何内容的引用,对吗? listeKopf返回该指针。

根据您的定义,Pstatus是一个结构,而不是指向struct的指针,因此您无法从void *转换为它。您也无法使用->运算符访问其成员,只能使用点.语法。

(作为个人品味,我不喜欢typedef指针类型,因此您可以通过查看代码中的星号来查看变量是否为指针。)

答案 1 :(得分:0)

我看了你的代码,基本上在你的第284行,你有这个表达式:

p = (Pstatus) listeKopf(temp);

p只是Pstatus struct variable而你的listeKopf(temp)返回(void *kopf),它们无法分配给非缩放器变量(它应该被分配给指针)。

您应该将代码更改为:

Pstatus *p
p =  listeKopf(temp);

以避免出现错误,并且不需要cast to Pstatus,因为void *可以分配给任何指针类型。

C中的标量类型:

  • 算术类型
  • 指针类型

我希望它有所帮助。