• 締切済み

任意の関数を読み込む

プログラムに関して全くの初心者なんですが・・・  よくプログラムで計算をするときに、あらかじめコードに式を書いて、実行画面でパラメータを代入して計算をするって方法がありますよね~本である程度勉強してそれは出来るのですが、実行画面で、任意の関数を書いて、それを読み込んでくれるプログラムを作るっていうのは難しいのでしょうか?昔、字句解析ってやつを見た事があるのですが、ちんぷんかんぷんでした・・・ 何か簡単な方法、もしくは、よいHPがあればおしえていただけませんか?ちなみにC++Builderをつかっています。 宜しくお願いします。

みんなの回答

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

>C自体、その分野に関して、Perl やruby よりも劣っているということなのでしょうか? そうだとは思いません。 それは、コンパイラとインタプリタにおける特質というものだと思います。 コンパイラは、コンパイル時に、全ての命令を解釈して、実行時には実行するだけということにして、実行時の効率を上げています。 インタプリタは、対話的に実行できるために、入力時に解釈・実行をします。このように元々解釈しながら実行するという特長があるために、関数定義などを入力即実行ということができるわけです。 コンパイラ系においては、そのような解釈して実行というようなルーチンを組み込むことは、実行時のスピードなどを落とすことになったり、プログラムが(解釈部を実行時に含むことで)肥大化するということ(コンパイラとしての良さが失われる)からそのようなルーチンを組み込んでいないのだと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • uyama33
  • ベストアンサー率30% (137/450)
回答No.3

エクセルは適当な式を入れると 計算してくれます。  これと同じにするには、 構文解析と字句解析ルーチン が必要です。  構文解析ルーチン の話は、コンパイラコンパイラ、 (コンパイラを作る話) で、調べてください。 文法はいろいろですが、 私は、LL1文法を使います。  これ以上書くと 規定違反になるので、 上の言葉を手がかりに検索してください。

yanees
質問者

お礼

ありがとうございます。やはり字句解析を勉強する必要があるのですね・・・ ご指摘されたことを参考にがんばってみます(^^)

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

言われているものとは違うかもしれませんけどとりあえず・・・ 内容は登録した関数(引数は同じものに限る)を選択して実行できるプログラムです。 かなり単純に作っていますが参考になればと思います。 しかしこれを使うと見たかんじがややこしいのですすめません #include<stdio.h> int Sousa1(int a); int Sousa2(int a); int Sousa3(int a); int main(void){ int erabu; int (*Sousa[3])(int atai);  /* int 返却値 Sousa 関数名 int atai 引数 */ /*******登録*******/ Sousa[0] = Sousa1; Sousa[1] = Sousa2; Sousa[2] = Sousa3; /******************/ printf("Sousa="); scanf("%d",&erabu); (*(Sousa[erabu + 1]))(50); return 0; } int Sousa1(int a){ printf("操作1です\n"); printf("値は%dです\n",a); return 0; } int Sousa2(int a){ printf("操作2です\n"); printf("%d + 3 = %d\n",a,a + 3); return 0; } int Sousa3(int a){ printf("操作3です\n"); printf("%d * 3 = %d\n",a,a * 3); return 0; }

yanees
質問者

お礼

わざわざプログラムまで教えていただき、ありがとうございます。是非参考にさせていただきます。

全文を見る
すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

実行時に任意の関数を入力して実行するというのは、 Cのインタプリタを作ることに相当します。 CのインタプリタCINTで質問で言われているようなことができたと思いますが、一般的には現実的ではないと思います。 scheme などLISP系とか Perl やruby などのインタプリタ系の言語であれば、 言語自体にそのような評価関数を含むので簡単に実現できます。

yanees
質問者

お礼

回答ありがとうございます Perl やruby であれば、簡単に実現するということは、C自体、その分野に関して、Perl やruby よりも劣っているということなのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 任意で決める配列を関数内から返す方法

    使用する際にiを任意で決める配列:A[i]とB[i]があるとします。 このA[i]とB[i]に、ある関数内で計算した値を入力したい場合、関数内で計算された後どのように使用すればいいですか? ちなみにこの関数は例えば、 double ABC(i,a,b) { A[i]=a*i; B[i]=b*i; } とします。 ここで、この計算されたA[i]とB[i]をプログラム内で使用する方法がわからないです… 普通ならポインタで返したいところですがiを任意で決めますのでポインタの使用法がいまいちピンときません… *A[],*B[]とかでいいんですかね? どなたかこの初心者問題にアドバイスをよろしくお願いいたします。

  • 任意の形の波形を関数でフィッティングするためにはどうしたら良いですか?

    任意の形の波形を関数でフィッティングするためにはどうしたら良いですか? ある実験より得られた波形があります。 その波形が多項式によってフィッティング可能であると仮定してフィッティングを行いたいのですが、 どうすれば良いのでしょうか? 例えば、その波形が10乗までの関数で表されると考えたとしても y=A + Bx^1 + Cx^2....Kx^10 とフィッティングパラメータが11個もあるわけですよね? そうすると、フィッティングをかけたとしても、一通りだけでなく幾通りも解が出てきてしまうのではないでしょうか? 昔、電子工学の授業でこういう任意の波形のフィッティング式の作り方に関して 習ったことがあるのですが、完全に忘れてしまいました。 どなたかご存じでしたら、参考書などを教えて頂けますでしょうか?

  • perlによるシステム上の任意のプログラム実行

    Perl初心者です。 システム上の任意のプログラムを実行しようと考えています。system関数のように呼び出し元に戻っては欲しいのですが、プログラム完了までwaitしないようにしたいのです。何か良い方法はあるのでしょうか。是非、ご教授いただきたく存じます。

  • ラムダ式を関数に渡したいのですが

    Class1からClass2にある関数の引数にラムダ式で関数を渡すようなプログラムを作ろうと思い、以下のようにコードを記述しました。 #include <iostream> class Class1 { int i = 0; void func() { std::cout << "Hello world" << std::endl; } void init() { Class2 *class2 = new Class2(); class2->setFunc([this] { func(); i++; }()); } }; class Class2 { void(*mFunc)(); void runFunc(){ mFunc(); } public: void setFunc(void func()) { mFunc = func; } }; すると class2->setFunc([this] { func(); i++; }()); のところで「型"void"の引数は型"void(*)()"のパラメーターと互換性がありません」というエラーが発生してしまいます。 キャプチャにthisを渡したラムダ式を他のクラスの関数ポインタのような変数に代入させるようにしたいのですがどのように記述したらできますか

  • VBAのDirtyについて

    マクロ実行中に、セルに入っている式を再計算させたいのですが、Excel2003で作成したときには、 Dirtyを言うものを使用し、マクロの実行中に式を再計算させることができました。 しかし、Excel2000で実行すると、Dirtyの箇所でとまってしまい、再計算ができません。 Excel2000でマクロの途中で任意のセルの式を再計算させるためにはどのようにすればよいでしょうか? よろしくお願いします。 (再計算させたい式はCOUNTA関数でユーザー定義関数ではありません)

  • 2次関数の最大・最小について

    「正の数aに対し、グラフが3点(0,0),(2,0),(3,-a)を通る2次関数がある。この2次関数の最大値を求めよ。」と言う問題なのですが、2点(0,0),(2,0)を代入して、その得られた式に(3,-a)を代入しaを求めようとしたのですがうまくいきませんでした。どのような方法でとけばいいのでしょうか?

  • Mathematicaのoutputについて

    Mathematicaで何か式を計算するとき、パラメーターをいくつか用い出力すると、パラメーターは使ったアルファベットのまま整理されて出力されます。 その後一度パラメーターに値を代入してから、もう一度前の式を評価するとパラメーターに値が代入されて出力されます。 ここで、パラメーターに一度数値を代入した後に、また式をアルファベットを用いた形で表示させるのはどうしたらいいでしょうか?(パラメーターの値の初期化とか?) よろしくお願いします。

  • 中2一次関数

    中2の息子が明日、期末テストなので数学の一次関数を 質問されたのですが分かりません。 図の問題なので添付します。 (1)の方は解けたのですが(2)の方がわかりません。 答えを見ると(1)の式に1組のXとYを代入して計算すると 書いてあるのですが、いろんな組み合わせで入れてみると計算した答えが全て違う結果になってしまいつまずいています。 よろしくお願いいたします。

  • sinh,cosh,指数関数を代入して求める式

    sinh,cosh,指数関数を代入して求める式 以下の画像(1)式に(2)式を代入してA,Bを消去すると(3)式になります。 しかし、(3)式に到達できません。 どうすればいいでしょうか。 僕が計算したところ、(3)式の右辺全体にsinh(ρa)がかかった形になってしまいました。

  • 地震による津波の発生のための地盤鉛直変位について

    地震が発生して海底が鉛直方向に変位すると、それに応じて津波が発生しますが、その変位を計算する方法が文献を調べてもわかりません。断層パラメータというらしいですが、6つぐらいのパラメータを入力すると、海底面の鉛直変位が出てくるそうです。6つの値を入力して鉛直変位を出力とする関数と考えることができると思います。その式がわからないのです。〇人名〇の方法に従って決定した、という研究がありますが具体的な方法が示されていません。どのように考えるのでしょうか。地震津波についてはそこがキモの1つとなります。とにかく式がほしいのですが。あるいはプログラムとして整備されているものとか。計算式が分かっても入力パラメータが6つあるとそれを決定するのが難しいかも知れませんが。よろしくお願いします。

このQ&Aのポイント
  • PX-049Aプリンタを使用している際、印刷の色がおかしくなり、ノズルチェックを行うと黄色だけが全く出ていない状況が発生しています。
  • クリーニングを試しても黄色は出ない状態であり、インク残量は問題ありません。
  • 改善方法についてアドバイスがありましたら、教えてください。
回答を見る