電話をかけるとList_head_info()
、次の2つのことが返されます。
- ヘッドデータへのポインタ(
void *
)、またはNULL。
- ポインタが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;
}