2014-06-12 4 views
0

포크에 대한 프로세스 테이블을 쓰려고합니다. 전역 테이블이 있고이 테이블에 모든 프로세스를 작성해야합니다.구조체로 목록 변환

내가 구조체

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

누군가가 나를 도울 수 있습니까?

답변

0

나는 당신의 라인 (284)에 기본적으로, 당신의 코드를보고,이 표현이 있습니다

p = (Pstatus) listeKopf(temp); 

는 P 그냥 Pstatus struct variable하고 listeKopf(temp) 반환이 아닌 스케일러 변수에 할당 할 수 없습니다 (void *kopf)입니다 (포인터에 할당되어야 함).

이처럼 보이도록 코드를 변경해야합니다

Pstatus *p 
p = listeKopf(temp); 

은 당신이 점점 오류 및 void * 어떤 포인터 타입에 할당 할 수도 cast to Pstatus이 필요하지 않도록. C에서

스칼라 유형 :

  • 산수 유형
  • 포인터 유형

나는 그것이 도움이되기를 바랍니다.

+0

솔루션은하지 않았다 작동 : ( – user1550036

+0

당신은 여전히 ​​같은 오류가 발생합니까? –

+0

괜찮습니다. 나는 그것을 다른 함수에 저장하려고 시도 했었고 동일한 오류가 발생했습니다. 해결책이 효과를 발휘했습니다. 고마워요 :) – user1550036

1

그래서 Listevoid * 포인터를 통해 모든 것을 참조 할 수있는 일반 목록입니다. 맞습니까? listeKopf은 해당 포인터를 반환합니다.

사용자 정의에 따르면 Pstatus은 구조체에 대한 포인터가 아니므로 void *으로 변환 할 수 없습니다. -> 연산자를 사용하여 멤버에 액세스 할 수 없으며 점 . 구문으로 만 액세스 할 수 있습니다.

은 (당신이 변수가 코드의 별을보고 포인터인지 여부를 확인할 수 있도록 개인 취향의 문제, 나는, typedef 포인터 타입 안함.)

+0

그래, 일반 목록이며 listeKopf가 반환합니다. Pstatus를 내 목록에 저장할 수 없습니까? – user1550036

+0

물론 가능합니다. 이름에서 나는'erzeugeProzess'가 어딘가에'malloc'을 호출함으로써 힙에 새로운 프로세스를 생성한다고 생각합니다. 이것은'Pstatus *'타입의 포인터입니다.리스트에 저장할 수 있습니다. 로컬 변수를 포인터로 만들어 드림 원의 답에서 제안 된대로 검색 할 수 있습니다. (나는 당신이 어쨌든 그것을 할 의도가있는 것 같아요, 화살표 연산자에서 juding.) 당신은 물론 적절한 유형으로 캐스팅해야합니다. 'void *'에서 다른 상수가 아닌 포인터 타입으로의 변환이 암시 적이기 때문에 더 좋을 수도 있습니다. –

+0

'Pstatus *'포인터를'% s'으로 출력하지 않도록주의하십시오. C는 파이썬이 아니며 포인터가'char'에 있다고 생각할 것입니다. '% s'''p> name'은''NULL '이 아니라 제대로 초기화되어 있다면 출력 할 수 있습니다. –