2012-02-23 11 views
0

私はXINU OSのプロジェクトに取り組んでいます。システムにパイプを追加している間に、以前に作った構造体に新しいメンバを追加して使用しようとするとコンパイラエラーが発生します。 私は正直なところ私のコードに何が間違っているかを見ることはできません。特に、変数名によって異なるワーキングピースと比較してみてください。C:struct XにはYという名前のメンバーがありません。

私はそれらのコメントを外した場合(リーダ= PR_CURR、ライター= PR_CURR)コメントアウト2ライン分のよう

「を/pipcreate.c:21:エラー 『構造体pipent』は、 『所有者』という名前のメンバーがありません」 、 'owner'行をコメントアウトすると、うまくコンパイルされます。

明白な問題として何か目立つものはありますか?私はそれを見落としていますか?

pipe.h

/*typedef int32 pipid32 inside of kernel.h*/ 

/* Max number of pipes in the system */ 
#ifndef NPIP 
#define NPIP 10 
#endif 

/* Pipe state constants */ 

#define PIPE_FREE 0 /* pipe table entry is unused */ 
#define PIPE_USED 1 /* pipe is currently used */ 
#define PIPE_CONNECTED 2 /* pipe is currently connected */ 

/* Misc pipe definitions */ 

#define isbadpipid(x) (((pid32)(x) < 0) || \ 
      ((pid32)(x) >= NPIP) || \ 
      (piptab[(x)].pipstate == PIPE_FREE)) 

/* Definition of pipe table */ 

struct pipent {   /* entry in the pipe table */ 
uint32 pipstate; /* pipe state: PIP_FREE, ect. */ 
uint32 pipid;  /* pipe ID in table   */ 
char buffer[256]; /* buffer to write to  */ 
pid32 writer;  /* pid for writer  */ 
pid32 reader;  /* pid for reader  */ 
pid32 owner;  /* CURR_PID upon pipe being created */ 
}; 

extern struct pipent piptab[]; 
extern int32 pipcount; 

pipcreate.c

#include <xinu.h> 
#include <string.h> 

static pipid32 newpipid(void); 
/*------------------------------------------------------------------------ 
* pipcreate - 
*------------------------------------------------------------------------ 
*/ 
syscall pipcreate(void){ 
    intmask mask;  /* saved interrupt mask */ 

//struct pipent piptab[]; 
struct pipent *piptr;  /* ptr to pipe's table entry */ 
pipid32 pipid;    /* ID of newly created pipe */ 

mask = disable(); 

pipid = newpipid();   /* pipid to return */ 
piptr->pipstate = PIPE_USED; 
piptr->owner = PR_CURR; 
    //piptr->writer = PR_CURR; 
    //piptr->reader = PR_CURR; 

pipcount++;     /* increment number of pipes */ 
piptr = &piptab[pipid]; 

restore(mask); 
return pipid; 
} 

//newpipid - obtain a new (free) pipe ID 
local pipid32 newpipid(void) 
{ 
uint32 i; 
static pipid32 nextpipid = 1; 
/* Check all NPIP slots */ 
for(i = 0; i < NPIP; i++){ 
    nextpipid %= NPIP; /* wrap around to beginning */ 
    if(piptab[nextpipid].pipstate == PIPE_FREE){ 
     return nextpipid++; 
    } else { 
     nextpipid++; 
    } 
} 
return (pid32) SYSERR; 
} 
+0

BTW piptrにスペースを割り当てていません。 – Avi

+0

pipcreate.cには、少なくとも直接直接pipe.hは含まれていません。 –

+0

コンパイラに前処理された出力を生成するよう依頼し、実際に 'struct pipent'の独自定義を使用しているかどうかを確認してください。 – jamesdlin

答えて

1

一つの可能​​性は、ソースファイルpipcreat.cが実際に(図示の#includeリストから、それがないように見える)pipe.hを含めていないことです。これを簡単にチェックするのは、pipe.hに曖昧な構文エラーを追加して、コンパイラがそれに不満を持っているかどうかを確認することです。

0

だから問題は、変更してもう一度コンパイルした後もオブジェクトファイルが残っていることと関係していると思います。

基本的に私は自分のMakefileからきれいに実行しなければならないと思っていました。

1

gccを使用している場合は、コンパイラのコマンドラインに-Mオプションを追加します。インクルードされているすべてのヘッダファイルのフルパスが吐き出されます。 pipe.hの出力であるgrepと、あなたが使用されていない理由がわかります。

0

jdkが使用するjvmti.hのバージョンの問題です。最近のバージョンのjvmti.hに存在するが、以前は存在しなかった新しいメソッド。

関連する問題