【问题标题】:convert list to struct将列表转换为结构
【发布时间】:2014-06-12 13:50:56
【问题描述】:

我正在尝试为我的分叉编写一个进程表。我有一个全局表,每个进程都必须写入这个表。

我有结构

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

有人可以帮助我吗?

【问题讨论】:

    标签: c list struct


    【解决方案1】:

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

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

    (个人喜好,我不喜欢typedef指针类型,这样你就可以通过代码中的星星来判断变量是否为指针。)

    【讨论】:

    • 是的,它是一个通用列表,listeKopf 返回它。所以我无法将我的 Pstatus 保存到我的列表中?
    • 是的,当然可以。从名字我猜erzeugeProzess 在某处调用malloc 在堆上创建了一个新进程。这是一个Pstatus * 类型的指针,您可以(并且应该)将其存储在列表中。您可以通过将局部变量设为指针来按照梦想家的答案中的建议检索它。 (从箭头运算符来看,我猜你是打算这样做的。)当然,你必须转换为正确的类型。 (或者,也许更好,不要大小写,因为从void * 到另一种非常量指针类型的转换是隐式的。)
    • 还要注意不要用%s 打印Pstatus * 指针。 C 不是 Python,它会认为指针指向 char,但事实并非如此。你可以打印%sp->name,如果它被正确初始化而不是NULL
    【解决方案2】:

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

    p = (Pstatus) listeKopf(temp);
    

    p 只是Pstatus struct variable 而你的listeKopf(temp) 返回的(void *kopf) 不能分配给非缩放变量(它应该分配给一个指针)。

    您应该将代码更改为如下所示:

    Pstatus *p
    p =  listeKopf(temp);
    

    为了避免您遇到的错误,也不需要 cast to Pstatus,因为 void * 可以分配给任何指针类型。

    C 中的标量类型:

    • 算术类型
    • 指针类型

    希望对你有帮助。

    【讨论】:

    • 好的,谢谢。我曾尝试将其存储在另一个函数中并得到相同的错误。解决方案奏效了。非常感谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2010-12-30
    • 1970-01-01
    相关资源
    最近更新 更多