C: структура X не имеет члена с именем Y - PullRequest
0 голосов
/ 24 февраля 2012

Я работаю над проектом с ОС XINU и при добавлении каналов в систему я получаю ошибку компилятора при попытке добавить и использовать новый член в структуре, которую я создал ранее. Честно говоря, я не вижу, что не так с моим кодом, особенно когда я сравниваю его с рабочими частями, которые меняются в зависимости от имени переменной.

"/ pipcreate.c: 21: ошибка: у« struct pipent »нет члена с именем« owner »"

Что касается двух закомментированных строк (reader = PR_CURR, writer = PR_CURR), если я раскомментирую их и закомментирую строку '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;
}

Ответы [ 4 ]

1 голос
/ 24 февраля 2012

Если вы используете gcc, добавьте параметр -M в командную строку компилятора - он покажет полный путь всех включаемых заголовочных файлов.grep это вывод для pipe.h, и вы поймете, почему ваш не используется.

1 голос
/ 24 февраля 2012

Одна из возможностей состоит в том, что исходный файл pipcreat.c на самом деле не включает pipe.h (из показанного списка #include, похоже, нет).Простая проверка для этого - добавить явную синтаксическую ошибку в pipe.h и посмотреть, жалуется ли компилятор на это.

0 голосов
/ 12 ноября 2013

Это проблема версии jvmti.h, используемой jdk. Новый метод, существующий в недавней версии jvmti.h, но ранее не существовавший.

0 голосов
/ 24 февраля 2012

Так что я думаю, что проблема заключалась в том, что некоторые объектные файлы все еще присутствовали после внесения изменений и повторной компиляции.

В основном я думаю, что сначала мне нужно было просто очистить свой Makefile, что, как я думал, я сделал, но, возможно, нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...