2.Mathematica の関数を C プログラムから呼び出す

まず,Mathematicaの関数を C プログラムの中から呼び出し,その結果を Cプログラムで利用する方法を紹介する.この章の例題は円周率 1000 桁に含まれる 0... 9 の数字の出現頻度を数えることとする.

2.1.Mathematica を呼ぶ C プログラムの例

以下が Mathematica と通信をしながら問題を解く C プログラムの例である.プログラムは,Mathematica との通信経路を確立し,円周率を 1000 桁求めるMathematica の関数を呼び,その結果を文字列として受け取り,受け取った文字列中の数字の出現頻度を数える.

  /* pidigit.c */
  /* calling mathematica function from within c program */
  /* 1997/07/20, hkim@melt.kyutech.ac.jp */
  #include 
  #include "mathlink.h";
  void main(argc, argv)
  int argc;
  char* argv[];
  {
      MLINK link;
      char **pi;
      char *cp;
      int count[]={0,0,0,0,0,0,0,0,0,0};
      int i;

      link = MLOpen(argc, argv);
      if (link==NULL) exit(-1);

      MLPutFunction(link, "ToString", 1);
      MLPutFunction(link, "N", 2);
      MLPutSymbol(link, "Pi");
      MLPutInteger(link, 1000);
      MLEndPacket(link);
      while (MLNextPacket(link) != RETURNPKT); 
          MLNewPacket(link);
      MLGetString(link, pi);
      MLClose(link);

      cp=*pi;
      while(*cp!=(char)NULL){
          count[*cp-'0']++;
          cp++;
      }
      for(i=0;i<10;i++)
          printf("%2d %3d\n", i, count[i]);
  }

インクルードしている "mathlink.h" は,MathLink のヘッダファイルである.このヘッダファイルは後述する MathLink コンパイラ mcc のサーチパス上に見つかる.

プログラム中,MLで始まる関数が MathLink のライブラリ関数である.どんなライブラリ関数が提供されているかについては,The MATHEMATICABookMATHEMATIC を参照されたい.

関数 MLOpen() は用意されたリンクにこのプログラムをつなぐ役目をする.リンク自体の作成法は次の 2.2節で述べる.

MLOpen() に成功したら,Mathematica に実行させたい関数を以下の手順でリンクへ送信する.

  1. まず,MLPutFunction() で Mathematica の関数名とその関数の引き数の個数を MLOpen()の返したリンク link へ送る.
  2. そのあと,引き数の型に応じて,MLPutInteger(),MLPutReal(),MLPutString(), MLPutSymbol() などを適宜呼び出し,関数の引き数をリンクへ送る.
  3. 関数とその引き数をすべて送信したら,最後に MLEndPacket()を唱える.

この例題でカーネルに実行させたいのは合成関数 ToString[N[Pi,1000]] である. ToString[exp]expを文字列に変換する関数, N[exp, digit]exp の評価値を精度 digit で求める関数である. ToString[N[Pi,1000]]をカーネルに実行させるには,まず外側の関数の名前 ToString を送り,続いて ToString[] の唯一の引き数となる N[Pi,1000] を送信する.Mathematica 中では, Piはたんなる文字列ではなく,円周率を表すシンボルとして扱われるため,文字列 "Pi"を MLPutSymbol() で送信することに注意しよう.関数 NPi と 1000 との二つの引き数をとるので, MLPutFunction() の第 3 引き数は 2 となる.

カーネルは MLEndPacket() を受け取ると式の評価をはじめ,計算を終えると RETURNPKT という特別なパケットをリンクに返す.

Cプログラム側ではそのパケットをリンクから受け取った後,カーネルの返すデータの型に応じた関数を呼んでデータを受信する.ここでは文字列が返されるので,呼ぶべき関数は MLGetString() である.


[back] [up] [next]

九州工業大学情報科学センター