3

void ポインターを使用してデータを指す汎用スタックを c に実装しようとしています。構造はこんな感じ

struct record{
  void* data;
  struct record* previousRecord; 
};

ここで、void ポインター data は、スタック位置が保持するデータへのポインターです。このようなプッシュ機能を実装すると

struct record* push(struct record* tos, void* data){
  struct record* newtos = (struct record*)malloc(sizeof(struct record));
  newtos->data = data;
  newtos->previousRecord = tos;
  return newtos;
}

いくつかの整数ポインターと文字列ポインターをスタックにプッシュします。これらのポインターによって参照される値を出力する方法はありますか。私の問題は、printf関数を使用する場合、コードで出力する値のデータ型を指定する必要があることですが、スタックに格納された値は実行時にのみ決定できます

4

2 に答える 2

4

データを正しいフォーマットで出力したい場合は、そのタイプを知っておく必要があります。

#include <stdio.h>

enum datatype
{
  DATATYPE_STRING, DATATYPE_INTEGER
};

struct record
{
  enum datatype type;
  void *data;
  struct record *next;
};

void print_record(struct record *p)
{
  switch (p->type)
  {
    case DATATYPE_STRING:
      printf("%s\n", (char *)p->data);
      break;
    case DATATYPE_INTEGER:
      printf("%d\n", *(int *)p->data);
      break;
  }
}
于 2013-01-13T10:28:10.310 に答える
2

アドレスを使用すると、データのタイプをどのように知ることができますか。文字列または整数アドレスにすることができます。

ただし、次のように、 に record格納される値のタイプに関する定義に追加のフィールドを保持できます。data part

typedef enum { STRING, INT, CHAR} type;
struct record{
  type t;
  void* data;
  struct record* previousRecord; 
};

そして、一般的な印刷関数を書きます:

int print(struct record  *r){  

  switch(r->t){
     case CHAR:     return printf("%c", *((char*)(r->data)));
     case INT:      return printf("%d", *((int*)r->data));        
     case STRING:   return printf("%s", (char*)r->data);        
     default:       return printf("Error");
  }
} 

これは、 C で一般的なコードを記述するのに非常に役立つProject/A の本です。

于 2013-01-13T10:28:26.243 に答える