非常に多くのパラメータをデータクラスに登録する「楽な」方法は?

このQ&Aのポイント
  • 500個以上のパラメータをデータクラスに登録する方法についての質問です。
  • ファイルからパラメータ名と初期値を読み込み、自動的にデータクラスに登録したいです。
  • 具体的な実装方法やライブラリなど、簡単に大量のパラメータを登録する方法があれば教えてください。
回答を見る
  • ベストアンサー

非常に多くのパラメータをデータクラスに登録する「楽な」方法は?

非常に多くのパラメータをデータクラスに登録する「楽な」方法は? ファイルから大量のパラメータを読み込んで、それをデータクラスに登録する方法についての質問です。例えば、 AAA,10 BBB,20 ... というように、500個くらいのパラメータと初期値がCSVファイルに書かれているとします。そして、このパラメータを全部、以下の例のようなデータクラスに登録します。 (メンバ変数は、説明しやすいようにpublicにしてあります) class Data { public:   int AAA;   int BBB;   ... }; こういう状態で、ファイル読み込み時に Data.AAA = 10; Data.BBB = 20; ... ということをしたいのですが、500回分こういうことを書くしかないのでしょうか?AAAとかBBBとかを明示的に書かなくても、ファイルを1行ずつ読み込んでパラメータ名と初期値を取得した時に、以下のようにできないものでしょうか? // ファイルから1行ずつ読み込み while( !EOF ){   // パラメータをparamとして取得   // 初期値をvalueとして取得   // こんなことがしたい   Data.param= value; }

  • aneja
  • お礼率93% (379/405)

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

・データが滅多に変わらないなら、 AAA.20 → Data.AAA = 20 ; ..... と変換するプログラムを作って(Perlなどのスクリプトでよいでしょう) #include "data.h" などとして取りこむ。 欠点はデータが変わるたびに再コンパイルが必要。 ・文字列でデータにアクセスできるようにメソッドを用意する。 例えば Data.Set("AAA",20) としたらData.Get("AAA")で20が取り出せるようにする。 実装方法としては、 キーと値の1次元配列やリスト、ハッシュテーブルなど。 欠点は、実装を作るのが少し面倒。 ・既存のライブラリを利用する。 XML形式にして、XML用ライブラリを使う。 INI形式にして、INI用ライブラリを使う、等

aneja
質問者

お礼

さっそくのご回答、どうもありがとうございました。お伝えしてなくてすみませんが、データが変わるたびにコンパイルし直しは、だめだそうです。あと、データファイルはCSV指定だそうです。2番目のお話に関しては、STLのmapに入れようかとも考えたのですが、パラメータを参照するたんびにfindとかとやってたら、速度的に遅くなるかな?と思い、悩んでしまった次第です。でもよく考えたらGetするのと変わんないですかね。今後も参考にさせていただけそうなヒントがたくさんありました。どうもありがとうございました。

aneja
質問者

補足

最初にお伝えしてなくて、すみません。パラメータを変えるたんびにコンパイルし直しはダメだそうです。あと、パラメータファイルはCSV指定だそうです。

その他の回答 (4)

  • yuoke
  • ベストアンサー率53% (8/15)
回答No.5

No.3です セミコロンはマクロで追加するのではなく、 csvのダミーデータで追加した方が、 スジが良かったですね… 重ね重ね申し訳ありませんでした。 例 conv(dmy1,key,val,dmy2); マクロはNo3のまま

aneja
質問者

お礼

さっそくのご回答とご検討、どうもありがとうございます。こちらにまとめて書かせていただきますね。質問通りのことをするにはトークン連結演算子もよさそうですね。初めはこういう方法もちょっと考えたんですが、あまり使い方を知らなくて。教えていただいた方法で勉強してみます。ただデータファイルをインクルードするようですが、今回は要件からはずれてしまいます。どうもありがとうございました。

  • yuoke
  • ベストアンサー率53% (8/15)
回答No.4

No.3です 取り合えずマクロで「;」が抜けてました…申し訳ありません。

  • yuoke
  • ベストアンサー率53% (8/15)
回答No.3

csvの最初と最後にダミーを追加して関数っぽくする。 例 conv(dmy1,aaa,10,dmy2) 次にマクロを使って、必要なクラスに登録できる形に変える 例 #define conv(dmy1,key,val,dmy2) data.##key = val (最近c使ってないので、マクロは間違えてるかも…) 最後にcsvファイルをクラス内 でincludeすれば行けそうな気がします。

  • BuriBuri4
  • ベストアンサー率28% (150/525)
回答No.2

パラメタのタグ("AAA","BBB")と値(10,20)を管理するクラス(構造体でも可) class DataParam { private:  char tag[xx] ;  int val ; public:  Data( ) ;  ~Data( ) ; ... } を作って、リストかハッシュに突っ込んでやれば良い。 ※パラメタを一つのクラスメンバーとして持つのではなくタグと値のセットでデータとして管理すればよい。

aneja
質問者

お礼

さっそくのご回答、どうもありがとうございました。おっしゃるように、リストかハッシュを利用するのがすっきりしそうですね。参考になりました。

関連するQ&A

  • javascriptからURLパラメータ値を送る

    使用言語はJSPです。 画面上のラジオボタンの値を取得しているjavascriptが以下です。 これでボタンが押下されたとき、この関数を呼び出しラジオボタンのVALUE値をアラートとして表示することはできています。 これをURLパラメータとして、JSPサーバ側に送りたいと思いますが、 NULL値となってしまいます。 取得は、request.getParameter("aaa"); としていますがNULL値です。 JAVASCRIPTからURLパラメータを送付・サーバ側から取得する方法を教えていただけますか。 function check(){ var aaa = document.getElementsByName("ラジオボタンの名前"); for(var i=0;i<arr.length;i++){ if(aaa[i].checked) var param = aaa[i].value; aaa.action = "./bbb.jsp?param="+param; aaa.submit(); return aaa[i].value; } }

  • 「自作クラスの型」にキャストする方法について。

    「自作クラスの型」にキャストする方法について。 Java初心者ですが、よろしくお願いします。 class AAA class BBB ※クラスAAAはクラスBBBのスーパークラス(直属のスーパークラスとは限らない)とします。 class CCC という3つのクラスがあるとして、 この場合、 class CCC{ AAA var; BBB bbb; void test(){ bbb = new BBB(); var = (AAA)bbb; //---★ } } というような、キャストは可能ですよね?(←確認1) 次に(確認1に問題が無い場合)、 クラスAAAとクラスBBBの格納場所(パッケージ関連の話です)について、 AAAとBBBがどういう位置関係にあるときに、上記のキャストは可能になるのでしょうか? AAAとBBBが同一パッケージ内にある時だけでしょうか?(←確認2[質問の核]) で、さらに、 上記の「---★」の所で、 AAAクラスにキャストする処理をしていますが、 この時、AAAクラスのコンストラクタは呼ばれるのでしょうか? (AAAをnewしていないけれど、キャスト処理でnewしたのと同じことになったりしますか?) また、これと同様の質問になりますが、 仮に、クラスAAAの設計が、クラスAAAのインスタンスが生成された場合に、 何らかのコールバック処理が行われるような設計の場合、 この (AAA)bbb というキャストによって、想定しているコールバック処理 は行われたりしますでしょうか?(←確認3) 初心者らしからぬ質問かもしれませんが、 どなたか、どうか分かりやすく教えて下さい。

    • ベストアンサー
    • Java
  • 【vb2005】app.configデータ取得方法について

    22歳男性です。 vb2005で開発を行っています。 app.configに設定したセクション内のデータを取得しようとしているのでがうまくいきません。 ■app.config <applicationSettings> <LogDataSummary.My.MySettings> <setting name="aaa" serializeAs="String"> <value>AAA</value> </setting> <setting name="bbb" serializeAs="String"> <value>BBB</value> ・・・・・・・ ■exe my.settings.xxxxxxxxx (xxxxは任意) 上記のようにセクション内の「name」:aaa、bbbのような構成でかかれたものが複数あるとします。そして、exe側ではその複数値を取得したいと考えています。 「my.settings.xxxxx」プロパティで取得できると考えているのでが、探し出すことができません。 知っている方がいましたらご教授願います。

  • EXCELで行の先頭データが同じ行の削除方法について

    EXCELで次のようなことをしたいのですがどうしたら簡単にできるでしょうか?  AAA   AAA  AAA  AAA  AAA  BBB  BBB  BBB  CCC  DDD  DDD  DDD  DDD 上ようのなデータで重複している部分を削除し、  AAA  BBB  CCC  DDD としたいのですが。 今は一行々々で確認しながら削除してます。3000行程あり困ってます。 どうしたら簡単にできるでしょうか?  

  • クラス名の振られた要素の文字列取得方法

    Javascriptで特定のクラス名の付けられた要素から、タグに挟まれた文字列を取得する方法を教えてください。 ある自動生成されるページに、以下のように決まったクラス名が振られる要素があります。 これらの要素から"AAA"や"BBB"の部分を取得するにはどうすればいいでしょうか? 教えてください。 <a href="hoge.html" class="fuga">AAA</a> <p class="piyo">BBB</p>

  • 仮想関数と継承について

    #include <iostream> using namespace std; class AAA { public: virtual aaa() { cout <<"aaa(void)"<<endl;} }; class BBB : public AAA { public: virtual aaa(int a) { cout <<"aaa(int)"<<a<<endl;} }; int main() { BBB bbb; bbb.aaa();<--これがエラーになります。 return 0; } どうして、既定クラスの引数なしのaaa()はよぶことが できないのでしょうか?

  • URLに付く [ ] を外したい

    現在稼働中のWebシステムの保守を担当しています。 先日、お客様から「URLに付いている [ ] を消して欲しい」との依頼がありましたが、 やり方が分からず、困っております。 現在、 xxx/aaa[]/1,2,3/bbb[]/1,2,3/ このようになっているURLを xxx/aaa/1,2,3/bbb/1,2,3/ に変更したいという依頼です。 現在、以下のようなフォームがあり <form action="xxx.php" method="GET"> <input type="checkbox" name="aaa[]" value="1"> <input type="checkbox" name="aaa[]" value="2"> <input type="checkbox" name="aaa[]" value="3"> <input type="checkbox" name="bbb[]" value="1"> <input type="checkbox" name="bbb[]" value="2"> <input type="checkbox" name="bbb[]" value="3"> </form> このフォームを送信するとURLは以下のようになりますが、 xxx.php?aaa[]=1,2,3&bbb[]=1,2,3 これを .htaccess で xxx/aaa[]/1,2,3/bbb[]/1,2,3/ というように書き換えています。 このURLを、 xxx/aaa/1,2,3/bbb/1,2,3/ に変更することはできますでしょうか? html、.htaccess、php、どの部分が改修になっても構いません。 [ ] を削除したいという理由としては、 インターネットの広告を出すときに、広告登録フォームでURLがエラーになるから、ということでした。 広告登録フォームでURLがエラーにならなければ良いのかと思い、 xxx/aaa%5b%5d/1,2,3/bbb%5b%5d/1,2,3/ というように [ ] の部分をURLエンコードする方法をお伝えしましたが、%が付くのもダメということでした。 xxx/aaa_0/1/aaa_1/2/aaa_2/3/bbb_0/1/bbb_1/2/bbb_2/3/ というように カンマ区切りじゃなくなるのも嫌だそうです。 あくまで xxx/aaa/1,2,3/bbb/1,2,3/ の形が良いとのことでした。

  • 抽出条件入力用テキストボックスが空白の場合の抽出条件

    SQL初心者です。 今あるテーブル(TABLE)に | VALUE_A | VALUE_B | VALUE_C | VALUE_D | ----------------------------------------- | 000 | AAA | AAA | AAA | | 001 | AAA | AAA | BBB | | 002 | AAA | BBB | AAA | | 003 | BBB | BBB | BBB | | 004 | BBB | BBB | NULL | のようなデータが入っているとします。 Web上から VALUE_B VALUE_C VALUE_D に対しそれぞれテキストボックス入力フィールドから値を入力し検索を行うようにしたいのです。 [VALUE_B]=AAA [VALUE_C]=AAA [VALUE_D]=AAA と入力されれば VALUE_A:000 を検索結果として出します。 [VALUE_B]=AAA [VALUE_D]=AAA と入力されれば VALUE_A:000 VALUE_A:002 を検索結果として出します。 [VALUE_B]=AAA だけが入力された場合は VALUE_A:001 VALUE_A:002 VALUE_A:003 を検索結果として出します。 つまり、フォームのテキストボックスに入力された条件で抽出し、入力が無い場合は全件抽出を行いたいのです。 この場合、どのようなSQLを組めばよいのかわかりません。ANDやORだけでは対応できないような気がします。Oracleを始めたばかりということもあり、どのような関数を使えばよいのかもわかりません。どなたかご教授いただけませんでしょうか??よろしくお願いします。

  • PHPで変数から1行目だけを取得したい

    変数に格納されたデータの1行目のaaaだけを取り出す方法を教えてください。 ※データはWEBサイトのURLリストで常に変動します。 複数行のデータ(\n区切り) 例) aaa   bbb   ccc 又は1行の半角カンマや半角スペースなどの文字で区切られたデータ 例) aaa, bbb,ccc,    aaa bbb ccc 上記のどちらかの形式で変数$dataに格納が可能です。 この$dataに格納されたaaaだけを取得するにはどうしたらいいのでしょうか? PHP初心者のためプログラムソースを書いていただけると助かります。

    • ベストアンサー
    • PHP
  • JavascriptでAppletを制御したい

    現在WEBアプリケーションを作成中ですが、 APPLETのPARAMETERの値を、 HTMLに記述した、JAVASCRIPTから書き換えられないか思案中です。 例 <APPLET> <Param name="AAA" value="2" > </APPLET> <INPUT TYPE="TEXT" NAME="BBB" VALUE="999"> <INPUT TYPE="BUTTON" NAME="RELOAD" VALUE="RELOAD"> のPARAMの値を変更したいのです。 このAAAのVALUE値を、BBBの値で変更して、RELOADボタンを押すと、 APPLETがPARAMを読み直して、再実行(RUNメソッド起動)するようにしたい。 APPLET側では現状ではINITメソッドでgetParameterを発行しています。 たぶんこれはRUNメソッドに移動しないといけないと思います。 よろしくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう