Newsgroups: fj.lang.fortran Path: coconuts.jaist!wnoc-tyo-news!nirvana.cs.titech!cs.titech!is.titech!phys.titech!is.s.u-tokyo!news.tisn.ad.jp!riksun!rkna50!guemura From: guemura@rkna50.riken.go.jp (Uemura Gen) Subject: Re: Dynamic memory with f2c. Message-ID: Sender: news@rkna50.riken.go.jp (News Administrator) Nntp-Posting-Host: mail Organization: Institute of Physical & Chemical Research (RIKEN) Saitama,Japan X-Newsreader: mnews [version 1.18] 1994-05/16(Mon) References: Date: Mon, 10 Oct 1994 15:21:38 GMT Lines: 64 植村@理研です。 いろいろ御指導ありがとうございました。それらを基に一応の解決を 見たので、報告させていただきます。 牧野@東大駒場 さん --- writes --- > void alloc_array_(int * num, float **x) > { > *x = (float *)malloc(sizeof(float)*(*num)); > } > > void use_c_(int * num, float **x) > { > use_(num,*x); > } > > とかするのはどうでしょうかね(fortran のinteger 型が C のポインタと同 > じサイズなら)。なお、試したわけじゃないので間違ってても知りません。 この方法は、私も一番最初に試してみました。ただ、牧野さんのように use_c_ という関数をつくってそこから SUBROUTINE USE を呼び出すことで 型チェックを回避するということは気がつきませんでしたので、私の場合は コンパイルエラーで止まっちゃって、結局断念しました。 ただ、この方法だと呼ばれる関数すべてに ???_c_ を作らなくてはいけな いのと、ポインタとinteger(別にlongintだろうが関係ないが)が同じ大きさ であることを利用するのが恐いので、利用しませんでした。すみません。 渦原@慶応 さん --- writes --- > ばばちぃ方法ですが、使わない仮引数を設けて、 > > SUBROUTINE AFO(X) > REAL X(0:*) > > CALL ALLOCATE(X,100) > . . . . > CALL DEALLOCATE(X) > > と書いて、f2c.h(コンパイルされたCファイルがincludeするファイル)に > > #define allocate_(x,n) (x = (float *)malloc(n*sizeof(float))) > #define deallocate_(x) free(x) > > といったのを書き足しておくというやり方です。(Xのlower boundが0である > ことに注意. 1にすると旨くいかない…ああ、ばばちぃ…) この、f2c.hを使って#defineでmallocだけでも定義してしまうという のは、全然気がつきませんでした。この方法なら、fortran側からはほと んどf2cを意識せずに済むので、私の目的にかなった方法でした。 ただ、cのマクロの恐怖というか、f2cで生成されるextern関数宣言に あるallocateもマクロ展開してしまうので、f2cの一部を変更してextern 宣言をコメントアウトするように改造して、対処しました。変更ファイル はformat.cです。 また、f2c.hの変更点は以下のとうりです。 #define allocate_(n,x) (x = (double *)malloc((*n)*sizeof(double))) #define deallocate_(x) free(x) 以上、簡単ではありますがf2cにて動的メモリを用いる方法としての報告 とさせていただきます。 ---------------------------------------------------------------------- 植村@理研 guemura@rkna50.riken.go.jp