ページ 1 / 1
変数
Posted: 2010年3月05日(金) 03:57
by くりあ
何度か、質問させていただいているものです。初心者です。
VC++を使っています。
質問なのですが、構造体を作りました。その中に(メンバっていうのですか?)変数を入れていくのですが、
そのうちの1つに何の型が入るか分からない変数が必要になりまして、この変数を、なんでも入るような型にする事は可能ですか?void*型?がそんな働きをするようなのですが、これはポインタですし、char型とか、int型とかは、直接入らないらないからできないような。出来るんですかね?分かりずらくて申し訳ありません。
何が入るか分からないといっても、int型やchar型など3~4個などで、全部つくってもいいような気もするのですが、無駄が多いような気がするので、良い方法を探しています。お願いします。
Re:変数
Posted: 2010年3月05日(金) 09:19
by softya
C言語だけなのか、C++の文法を使ってよいのかで話は大分変わってきます。
C言語なら、unionを使って同じメモリ領域を別の型にすることができます。ただし、ここまでしてメモリ領域を節約する必要があるのはマイコンぐらいです。全部メンバを作った方が後々の問題も少ないです。
C++ならクラスでポリモーフィズムを使えば解決します。
なぜ、同じメンバ名で違う型のデータを扱いたいか説明してもらうと良い答えが得られると思いますがお聞かせ願えませんか?
Re:変数
Posted: 2010年3月05日(金) 09:34
by たかぎ
> int型やchar型など3~4個などで、
全部整数型なら、一番大きなものにあわせておくのも一つの手です。
具体的にどんな型があるのか書いていただくと、もう少し気の利いた回答ができるかもしれません。
C++であれば、一般的にはboost::anyを使うべきです。
本当のCなら共用体でもよいのですが、C++をCのように使っているだけであれば、C互換型(POD型)かどうかの判断が正確にできるのでないかぎり、共用体は使うべきではありません。
Re:変数
Posted: 2010年3月05日(金) 10:10
by くりあ
softyaさん、たかぎさん、ていねいな回答ありがとうございます。
C++の文法で作成しているつもりです。
プログラムを実行して入力されたデータを変数のようにして扱えるプログラムを作りたいんです。
実行者に変数名とデータを入力してもらい構造体に変数の名前と、データのメンバを作ってそこに情報入れたいのです。変数名は文字列が入るのでchar型でいいのですが、データのほうは、文字列か数字(整数以外も含む)かなどがわからない(ただ、ポインタは入らないです)ので、このような質問をしたのですが、まだ理解が浅くいい方法が分かりませんでした。このようなプログラムの場合、どのようにするのが効率がいいのでしょうか?
ポリモーフィズムを調べてみたのですが、どういうものなのか分かりませんでした。
boost::anyも調べてみたのですが、使う時にキャスト?しなければいけないとのことなのですが、どのようにすればいいのか分かりませんでした。キャストはどうやればいいのでしょうか?
>>本当のCなら共用体でもよいのですが、C++をCのように使っているだけであれば、C互換型(POD型)かどうかの判断が正確にできるのでないかぎり、共用体は使うべきではありません。
もうこの文章が何を意味しているのか分からないので使わないほうがいいんですね。たぶん。
Re:変数
Posted: 2010年3月05日(金) 10:28
by バグ
入力された値に応じて、その時々で自動的に型を変更したいってこと?
入力される情報に型に関する情報も含まれているというのであれば簡単でしょうけど…
Re:変数
Posted: 2010年3月05日(金) 11:00
by 山崎
おはようございます。
変数名とデータは、どのように入力されるのでしょうか?
もしscanfを使うのならば以下の方法はいかがでしょう。
変数名もデータもとりあえず文字列として保存します。
データの方は、入力された文字列に文字が含まれるか小数点が含まれるか
数字だけの文字列かというのをチェックします。
そのチェックに応じた型のメンバをnewします。
そのnewした領域に、文字列として保存しておいたデータを型変換して代入します。
入力されたデータも変数名もどちらも文字列として保存しておいて、
使う時になったらデータを適切な型にする、というのも手な気がしますね。
Re:変数
Posted: 2010年3月05日(金) 11:39
by softya
>変数名は文字列が入るのでchar型でいいのですが、データのほうは、文字列か数字(整数以外も含む)かなどがわからない
なるほど、スクリプト言語の様な物を作っているのですね。
私は別々のメンバにするのを推奨します。文字列なら構造体に入れる場合、stringとかクラスを使ったほうが良いですね。数値は、int型とdouble型で十分じゃないでしょうか。
今使っている型は、構造体中に型を記録するメンバ変数を追加してください。
それと、変数名も文字列ですが検索する必要があると思うので、stlのmapとかを使ったほうがスマートになると思います。
連想配列(map)。たかぎさんのサイトより。
http://www.kijineko.co.jp/tech/cppsamples/map.html
それと、一番スッキリするのは構造体自体を変数処理クラスにして全てカプセル化する事ですかね。

Re:変数
Posted: 2010年3月05日(金) 12:32
by たかぎ
> boost::anyも調べてみたのですが、使う時にキャスト?しなければいけないとのことなのですが、どのようにすればいいのか分かりませんでした。キャストはどうやればいいのでしょうか?
boost::any x = 123;
int y = boost::any_cast<int>(x);
x = std::string("abc");
std::string s = boost::any_cast<std::string>(x);
上記のように行います。
いっそのことデータは文字列で持って、取り出すときにboost::lexical_castを使うのも一つの手です。
こんなかんじです。
std::map<std::string, std::string> var;
std::string name = "変数名";
std::string value = "123";
var[name] = value;
int x = boost::lexical_cast<int>(var[name]);
Re:変数
Posted: 2010年3月05日(金) 16:29
by dic
1.文字列を整数に変換する関数 atoi
2.数字を文字列に変換する関数 itoa
をMSDNで調べればいいかと思います
int i;
char str[10] = "256";
i = atoi( str );
printf( "%d\n"< i );
(2はあんまり使わないんでタイプミスあるかもしれません)
Re:変数
Posted: 2010年3月05日(金) 22:45
by くりあ
皆様、回答ありがとうございます。
いろいろな方法があるのですね。
もっと勉強しなくてはと感じました。
どの方法をとるかは、プログラムのほかの部分との相性などから決めたいと思います。
分からない事があれば、また聞きに来ようと思います。
最初は、こんなぐちゃぐちゃな文では、「もっと具体的にに決めて来い!!」と怒られるかと思ったのですが、
みなさん本当に親切に分かりやすくお答えしていただき、本当にありがとうございました。