1

私は、オペレーティング システム クラスの課題に取り組んでいます。課題に役立つコードが与えられていますが、私は C のプログラミング経験がほとんどなく、使い方がわかりません。私がやろうとしているのは、リストの先頭に情報を出力することです。リストは、次のように定義された構造体のリストです。

typedef struct 
{
    char name[NAME_MAX];
    int  lifetime;
} pcb_t;

int 
List_head_info ( List_t *list, void **data )
{
     int all_ok = 0;

     *data = NULL;
     if ((list != NULL) && (list->head != NULL)) {
         *data = list->head->data;
         all_ok = 1;
     }

     return all_ok;
}

私はそれらを表示しようとしました:

printf("test: %s", List_head_info(&processes, (void *)pcb)->name);

invalid type argument a->aしかし、コンパイル時にエラーが発生します。

4

1 に答える 1

1

電話をかけるとList_head_info()、次の2つのことが返されます。

  1. ヘッドデータへのポインタ(void *)、またはNULL。
  2. ポインタがNULL以外であるかどうかを示すステータス。

正常に戻った場合は、をaに変換(強制またはキャスト)しvoid *pcb_t *それを使用してデータを印刷できます。


具体的にどのようにすればよいですか?

おそらくこのようなもの:

List_t list;

...code to initialize and maybe add things to the list...

void *head_data = 0;
if (List_head_info(&list, &head_data))
{
    pcb_t *item = (pcb_t *)head_data;
    printf("Lifetime: %.2d; Name: %s\n", item->lifetime, item->name);
}

厳密には、の初期化head_dataは不要です。のコードは、List_head_info()常に値を少なくとも1回(NULLまたは0に)設定し、場合によっては2回(2回目はリストのヘッドアイテムのデータコンポーネントに)設定します。

これは、コンパイルするのに十分な情報が含まれている「サンプルコード」です。私は、意味をなすのに十分なリスト構造を「リバースエンジニアリング」しました。もちろん、実際の実装は異なります。これは、Mac OS X10.7.4のGCC4.1.2および4.7.0で、かなり厳しいGCC警告レベルでクリーンにコンパイルされます。AFAICS、この段階で本当に心配する必要のない「厳密なエイリアシング」に関連するいくつかの複雑な問題を回避します。

#include <stdio.h>

enum { NAME_MAX = 40 };

typedef struct Node Node;
struct Node
{
    void *data;
    Node *next;
};

typedef struct
{
    Node *head;
    Node *tail;
} List_t;

typedef struct 
{
    char name[NAME_MAX];
    int  lifetime;
} pcb_t;

extern int List_head_info(List_t *list, void **data);
extern void another_func(List_t processes);

void another_func(List_t list)
{
    void *head_data = 0;
    if (List_head_info(&list, &head_data))
    {
        pcb_t *item = (pcb_t *)head_data;
        printf("Lifetime: %.2d; Name: %s\n", item->lifetime, item->name);
    }
}

int 
List_head_info ( List_t *list, void **data )
{
    int all_ok = 0;

    *data = NULL;
    if ((list != NULL) && (list->head != NULL)) {
        *data = list->head->data;
        all_ok = 1;
    }

    return all_ok;
}
于 2012-05-28T22:21:07.210 に答える