2017-02-22 7 views
0

私は、名前とポインタをパラメータとして持つSemCreateという関数を持っています。私は新しい構造体を指すポインタをしたいと私は大丈夫になった場合は0、intを返すしたい。構造体へのポインタを設定しようとしています

int P1_SemCreate(char *name, unsigned int value, P1_Semaphore *sem){ 
USLOSS_Console("Create a semaphore\n"); 
if(!verifyKernel()) { 
     //USLOSS_Console("ERROR: Not currently in Kernel mode\n"); 
     USLOSS_Halt(1); 
    } 
if(numSems>= P1_MAXSEM){ 
    //USLOSS_Console("ERROR: MAX semaphore already exist\n"); 
    return -2; 
} 
if(name == NULL){ 
    return -3; 
} 

interruptsOff(); 
int i; 
for (i = 0; i < P1_MAXSEM; i++) { 
    if (semTable[i].inUse == 0) { 
     semTable[i].value = value; 
     semTable[i].list = NULL; 
     semTable[i].name = malloc(sizeof(char)); 
     strcpy(semTable[i].name, name); 
     semTable[i].inUse = 1; 
     semaphore *temp = NULL; 
     temp = malloc(sizeof(semaphore)); 
     temp->value = value; 
     temp->list = NULL; 
     temp->name = malloc(sizeof(char)); 
     strcpy(temp->name, name); 
     *sem = temp; 

     break; 
    } 

} 
numSems++; 
interruptsOn(); 
return 0; 

}

右は今、ポインタは関数内で結構ですが、私は返す一度ポインタがNULLである

EDIT:配列semTableは、セマフォの配列です

typedef struct semaphore{ 
    int value; 
    char * name; 
    struct node *list; 
    int checkPoint; 
    int inUse; 
}semaphore; 


typedef struct PCB { 
    USLOSS_Context  context; 
    int     (*startFunc)(void *); /* Starting function */ 
    void     *startArg;    /* Arg to starting function */ 

    int   pid; 
    int   status;  
    int   killedStatus;  
    int   state; 
    int   priority; 
    char  name[50]; 
    int   parentPID; 
    int   numOfChild; 
    int blockFlag; 
    struct sempahore *blockSem; 
    char  *stack; 
    struct node *children; 
    struct node *zombiList; 
    int   cpuTime; 
    int   startTime; 
    struct semaphore *childSem; 
} PCB; 

typedef struct node { 
     PCB *pcb; 
     struct node *next; 
} Node; 
+2

あなたの関数の本体に表示される唯一の構造体は 'semTable'ですが、作成された場所は表示されません。着信関数の引数には 'P1_Semaphore * sem'が含まれますが、' sem'!= 'semTable'です。関連するすべての部分を含めるようにコードスニペットを修正します。 – ryyker

+1

'name'に1バイトを割り当ててもよろしいですか? 1文字しか保持できません。そして、常に[mcve]を投稿してください。 –

+0

'P1_Semaphore'とは何ですか? 'セマフォ'とはどう違うのですか? –

答えて

1

あなたの質問は、あなたが何をしようとしているかについて完全にはっきりしていません。したがって、以下の一般的な話題は、彼らが助けてくれることを期待しています:

1)関数を介して構造体のアドレスを渡し、構造体メンバの値を変更し、呼び出し関数の変更された値にアクセスします。 (表示するものと同じではありませんが、あなたが何をしたいかを示しています)
2)構造体のインスタンスへのインスタンスとポインタを作成し、次に初期化します。
3)自己参照構造体のチュートリアルへのリンクが含まれています。

typedef struct {//struct definition created in global space, typedef'ed 
    char line[80]; //to read in the line 
    int slot; 
    char type[20]; //long enough for any types listed 
    int position; 
}SLOT; 
int modifyStruct(SLOT *slot);//prototype of demonstration function 

int main(void) 
{    
    SLOT s;//create instance of SLOT local to main 
    int ret = modifyStruct(&s);pass address of SLOT instance to change member values 
    printf("Line: %s\n", s.line);//show changed values 
    printf("Slot: %d\n", s.slot); 
    printf("type: %s\n", s.type); 
    printf("position: %s\n", s.position); 

    return 0; 
} 


int modifyStruct(SLOT *slot) 
{ 
    strcpy(slot->line, "lineA"); 
    slot->slot = 2; 
    strcpy(slot->type, "large"); 
    slot->position = 20; 

    return 0; 
} 

EDIT(あなたの投稿のコードでやっているよう) - 構造体を指すように構造体のポインタを設定する方法を尋ねるコメントで質問に対処するために。

まず、投稿したコードを見て、自己参照構造体を使用しているように見えます。 (つまり、自身のポインタインスタンスであるメンバを含む構造体)次に、自己参照構造体を使用する、良いtutorial dealing with Linked Lists in Cへのリンクです。

あなたのコメントについて:_私はもっと明確にすべきだったと思います。 P1_Semaphoreはセマフォとは異なります。セマフォーを指すにはP1_semaphoreが必要です。:

P1_Semaphoresemaphoreと異なる場合は、もう一方のアドレスを指すように設定しないでください。とにかくコンパイラはあなたにそれをさせません。

コメントで述べたように、構造体ポインタは、その構造体のインスタンスを含むメモリ内の場所を指しているだけです。 、*pBはなく何を指すように設定されたBへのポインタので、もし

typedef struct { 
    int iNum; 
    float fNum; 
    char cStr[80]; 
}A; 

A a, *pA; //create an instance, and pointer to an instance of A 

typedef struct { 
    int iNum1; 
    int iNum2; 
    int iNum3; 
}B; 

B b, *pB; //create an instance, and pointer to an instance of B 

A & Bは、明らかに異なるものであり、メモリ内の異なるサイズおよび形状を占有する。例えば2つの構造体& Bを考えますB、それは間違っています。それを指すように必要B

正しい:
のpA = &
たpB = & B //セットポインタのアドレスに等しい//セットポインタはBのアドレスに等しいBへ

不正:Bのアドレスに等しい= & B //設定ポインタ
たpB = & //セットポインタが
のアドレスに等しいBに
のpA- C/C++で(典型的なコンパイラエラー=のオペランドはにBとポインタに型ポインタた)

+0

私はそれをより明確にすべきだったと思います。 P1_Semaphoreはセマフォとは異なります。 –

+0

@SeanGallagher - 'struct * pX'が' struct Y'を指し示す唯一の時間は、それらが同じ構造体定義のインスタンスである場合です。これはセマフォを指すためにP1_semaphoreが必要です。これを説明する編集のために私の答えの一番下を見てください。 – ryyker

0

、すべてのパラメータが値ではなく、参照によって渡されます。パラメータで構造体ポインタを取得するには、ポインタとしてのポインタをパラメータとして使用する必要があります。このように:

int P1_SemCreate(char *name, unsigned int value, P1_Semaphore **sem){ 
    ... 
     *sem = temp; 
    ... 
} 
+0

"C/C++"はありません。 C++では、いくつかのパラメータが参照渡しされます。 –

関連する問題