掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.28152

C言語でPerlのような配列を実装する方法について
投稿者---パズ(2006/09/14 14:54:22)


こんにちは。よろしくお願いいたします。
私は、Windows XP上で Microsoft VC++ Toolkit 2003 のコンソールコンパイラを用いて作業しています。

 現在、C言語でPerlの配列のようなリスト構造を実装しようと考えています。つまり、リストの各要素が型を特定せず、1番目の要素は整数データ、2番目の要素には文字列データが格納できる、といったようなものです。

 リスト構造そのものは連結リストで実現すれば問題ないと思っています。今悩んでいるのは、データをリストのノードに格納する際に、型情報をどのように判定するかということです。
とりあえずリストのノードは構造体を用いて作成し、そのメンバに、格納するデータ、インデックス番号、型情報を持たせるつもりです。
データについては、ノードにvoid型のポインタを持たせるようにすれば、型を気にせずデータを格納できると思います。代入する値または変数のアドレスを渡せばいいですよね。
しかし格納するデータの型を調べるのが難しいです。 sizeof() を使って型判定を行おうと考えてみましたが、取得できるサイズがそれぞれの型に固有でないことと、そもそも sizeof() を使う前にvoid型にしてしまったら「不正な間接演算」というエラーが出てしまいます。

こちらの掲示板の過去ログを見ていましたら、C言語ではプログラム側で型判定はできないという記事を見つけました。やはり、型を自動で判定することまで、私の考えている「Perlのような配列を実装するプログラム」に求めるのは難しいことでしょうか。
どなたかご教示頂ければ幸いです。



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:C言語でPerlのような配列を実装する方法について 28153 たかぎ 2006/09/14 15:05:51
<子記事> Re:C言語でPerlのような配列を実装する方法について 28158 あかま 2006/09/14 19:10:13
<子記事> Re:C言語でPerlのような配列を実装する方法について 28189 パズ 2006/09/16 20:37:56


No.28153

Re:C言語でPerlのような配列を実装する方法について
投稿者---たかぎ(2006/09/14 15:05:51)
http://takagi.in/


格納する型の種類が既知であれば、それぞれの型に連番を与えるなどして、データへのポインタとともに管理すればよいと思います。

もっと一般的な実装にするには、型名を文字列で与えれば、どんな型にでも対応可能です。ただし、typedef名や微妙に字面が異なる表現(例えば、signed intとintとか、longとlong intとか)にならないよう、表記方法を厳密に定義し、かつそれを実践するようにしなければなりません。

スクリプト言語の実装で見かけるのは、型識別のための値だけでなく、オブジェクトを解体するための関数や、文字列との相互変換の関数も、一緒に与えておくという方法です。これなら、それぞれの型同士の相互変換も、リストのノードの削除も簡単に行えます。



この投稿にコメントする

削除パスワード

No.28158

Re:C言語でPerlのような配列を実装する方法について
投稿者---あかま(2006/09/14 19:10:13)


>格納するデータの型を調べるのが難しいです
おそらく

insert(void *){
    //型を判定してリストに挿入
}

というのを考えていて、

int *i;
char *s;

insert(i);
insert(s);

という使い方をしたいのだと思います。
お調べになったとおり残念ながらこれはたぶんできないので

insert_int(int i);
insert_str(char *s);

のように関数を分けるしかないでしょう。
呼び出し側は、まず格納する変数の型が分かっているのでこれで問題ないと思います。
名前を分けるのが嫌なら、C++で関数のオーバーロード(同じ関数名で引数の違う関数を定義できる)を使うという手もあります。





この投稿にコメントする

削除パスワード

No.28189

Re:C言語でPerlのような配列を実装する方法について
投稿者---パズ(2006/09/16 20:37:56)


 たかぎ様、あかま様、お答え頂きまして有り難うございました。
 リストのノードの構造については、たかぎ様の提案して下さった手法を取り入れようと思います。スクリプト言語のソースも見てみたいとは思うのですが、なにぶんまだ力不足のようで。
 データの追加については、あかま様のアドバイスに従って代入する値の型ごとに関数を分けることにしました。とりあえず、主要な型(int, double, char)とその配列を格納するための関数を作って対応することにします。
 皆様のおかげでだいぶ構想がまとまってきました。本当に有り難うございました。それでは。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧