• ベストアンサー

FortranプログラムからC言語で実装された関数を呼ぶには?

Windows Vista Home PremiumにFTN95をインストールしたPCにて、Fortranのプログラミングをし始め、「Cpad for Salford FTN77」を利用してプログラミングをしています(FORTRAN77・Fortran90ともに)。FTN95でのFortranプログラミングに際し、FortranプログラムからC言語で実装された関数を呼ぶには、どのように対処すれば可能になりますでしょうか? ユーザーガイドによれば、「Fortranプログラム中に、C_EXTERNALという宣言をした関数は、Cの関数と同じくアクセスできるようになり、C側では、#extern <返り値>関数名(引数)を与えれば、Cの関数として呼び込むことができる。」とのことがかかれています。 実際に使っているファイルをいくつか書き出します。 <D:\fortran\sample.f> C_EXTERNAL WRITE 'WriteFile' : INTEGER*4 INTEGER*4 RESULT RESULT=WRITE() write(*,*) result return end <D:\fortran\sample.c> #extern int Writefile(int); <C:\Program Files\Silverfrost\FTN95\ftn95c.bat> ftn95.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 /link ちなみに、「Cpad for Salford FTN77」での実行/設定/実行/コンパイル時のパラメータは「/link /dreal」です。もちろんftn95.exeへのパスは通してあります。何が問題でしょうか? 何分初心者ですので、拙い質問かと思いますが、何卒ご教示願います。

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.8

ftn77 と ftn95 で違ったりするみたいですね。 コンパイルオプションでどうにかなるのかもしれませんが、とりあえずC側のファイルの関数名を hello から HELLO のように全部を大文字にしてください。 これでリンクが通るようになると思います。

lagrange
質問者

お礼

貴殿のアドバイスのお陰で無事当方で実行したいことが可能になりました。試行錯誤の結果、ftn95のパラメータには今回のケースでは「/dreal」だけでなく「/ckc」もいるということがわかり、sccでもgccでも共に無事成功しました。何度も何度も拙い質問に堪えながらの回答ありがとうございました。またわからないことが生じましたら、そのときは再度アドバイスよろしくお願いいたします。

lagrange
質問者

補足

貴殿のアドバイスのお陰で無事当方で実行したいことが可能になりました。試行錯誤の結果、ftn95のパラメータには今回のケースでは「/dreal」だけでなく「/ckc」もいるということがわかり、下記の通り、sccでもgccでも共に無事成功しました。何度も何度も拙い質問に堪えながらの回答ありがとうございました。またわからないことが生じましたら、そのときは再度アドバイスよろしくお願いいたします。 D:\math\fortran>ftn95 /dreal /ckc tes1.f [FTN95/Win32 Ver. 5.01.0 Copyright (c) Silverfrost Ltd 1993-2006] NO ERRORS [<main program> FTN95/Win32 v5.01.0] D:\math\fortran>scc lib.c [Silverfrost SCC/WIN32 Ver 3.65 Copyright (c) Silverfrost Ltd 2006] NO ERRORS [<LIB> SCC/WIN32 Ver 3.65] D:\math\fortran>type tes1.f implicit double precision(a-h, o-z) C_EXTERNAL near C_EXTERNAL down C_EXTERNAL up C_EXTERNAL chop C_EXTERNAL hello dimension a(100),b(100) cn=0.0d0 cu=0.0d0 cd=0.0d0 cc=0.0d0 do i=1,100 a(i)=0.1d0 b(i)=0.1d0 end do call near do i=1,100 cn=cn+a(i)*b(i) end do call up do i=1,100 cu=cu+a(i)*b(i) end do call down do i=1,100 cd=cd+a(i)*b(i) end do call chop do i=1,100 cc=cc+a(i)*b(i) end do write(6,10) cn,cu write(*,*) write(6,10) cd,cc 10 format(f26.19,2x,f26.19) call near end D:\math\fortran>type lib.c #include <stdio.h> int _RoundNear =0x133a; int _RoundDown =0x173a; int _RoundUp =0x1b3a; int _RoundChop =0x1f3a; extern "C" void NEAR(void) { asm{fldcw _RoundNear}; printf("%s\n", "Near"); } extern "C" void DOWN(void) { asm{fldcw _RoundDown}; printf("%s\n", "Down"); } extern "C" void UP(void) { asm{fldcw _RoundUp}; printf("%s\n", "Up"); } extern "C" void CHOP(void) { asm{fldcw _RoundChop}; printf("%s\n", "Chop"); } D:\math\fortran>slink tes1.obj lib.obj Creating executable: D:\math\fortran\tes1.exe D:\math\fortran>tes1 Near Up Down Chop 1.0000000000000006661 1.0000000000000008882 0.9999999999999934497 0.9999999999999934497 Near D:\math\fortran>type lib2.c #include <stdio.h> int _RoundNear =0x133a; int _RoundDown =0x173a; int _RoundUp =0x1b3a; int _RoundChop =0x1f3a; void NEAR() { asm volatile("fldcw __RoundNear"); printf("%s\n", "Near"); } void DOWN() { asm volatile("fldcw __RoundDown"); printf("%s\n", "Down"); } void UP() { asm volatile("fldcw __RoundUp"); printf("%s\n", "Up"); } void CHOP() { asm volatile("fldcw __RoundChop"); printf("%s\n", "Chop"); } void HELLO() { printf("%s\n", "hello from C function!"); } D:\math\fortran>gcc -c lib2.c D:\math\fortran>slink tes1.obj lib2.o Creating executable: D:\math\fortran\tes1.exe D:\math\fortran>tes1 Near Up Down Chop 1.0000000000000006661 1.0000000000000008882 0.9999999999999934497 0.9999999999999934497 Near D:\math\fortran>

その他の回答 (8)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.9

C_EXTERNAL hello を C_EXTERNAL hello 'hello' にしたら動いたりして.

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.7

>パスを通した上でコマンドプロンプトから「gcc lib.c」とするとエラーとなり、 ここで、gcc -c lib.c のようにしてください。 これをつけないとlib.cだけで実行ファイルを作りに行ってしまうので それが理由でエラーになります。 あれ、でも#3の補足を見るとオブジェクトファイルが、とかあるなあ。 まあそれはおいといて、 -cをつけると、(エラーがなければ)lib.o を作って終わりますから Fortranのソースからできた sample.obj と一緒にリンクしてください。 あ、Fortranのコンパイルも ftn95.exe /link /dreal sample.f /link の /link は指定しないでくださいね。 ftn95 dreal sample.f gcc -c lib.c slink sample.obj lib.o てな手順で sample.exe が最終的に手に入るはずです。

lagrange
質問者

お礼

重要な点を含んだ回答していただき、ありがとうございます。何度も何度も回答していただいているにも関わらず、当方での動作がうまくいかず「再質問→再回答」の繰り返しとなっていること、申し訳なく思います。 さて、プログラムのほうは貴殿のようにうまく動きません。少なくとも「tes1.f」・「lib.c」についてはそれぞれ「ftn95」・「scc」で単体でなら何のエラーも返さずにコンパイルできます。しかし、「slink」の段階でWarningが出てきてしまい、実行ファイルができるにはできてもエラーになってしまいます。どのようにすれば対処できますでしょうか? D:\math\fortran>type tes1.f lib.c tes1.f program mogera C_EXTERNAL hello call hello stop end lib.c #include <stdio.h> #define near() asm volatile("fldcw __RoundNear") #define down() asm volatile("fldcw __RoundDown") #define up() asm volatile("fldcw __RoundUp") #define chop() asm volatile("fldcw __RoundChop") int _RoundNear =0x133a; int _RoundDown =0x173a; int _RoundUp =0x1b3a; int _RoundChop =0x1f3a; void hello() { printf("%s\n", "hello from C function!"); } D:\math\fortran>ftn95 /dreal tes1.f [FTN95/Win32 Ver. 5.01.0 Copyright (c) Silverfrost Ltd 1993-2006] NO ERRORS [<MOGERA> FTN95/Win32 v5.01.0] D:\math\fortran>scc lib.c [Silverfrost SCC/WIN32 Ver 3.65 Copyright (c) Silverfrost Ltd 2006] NO ERRORS [<LIB> SCC/WIN32 Ver 3.65] D:\math\fortran>slink tes1.obj lib.obj WARNING the following symbols are missing: HELLO D:\math\fortran\tes1.obj (D:\MATH\FORTRAN\TES1. Creating executable: D:\math\fortran\tes1.exe D:\math\fortran>tes1 D:\math\fortran>type error.txt Runtime error from program:d:\math\fortran\tes1.exe Run-time Error *** Error 29, Call to missing routine : _HELLO at 0x00401020. 00401000 main [+0025] [recur= 1] D:\math\fortran>

lagrange
質問者

補足

「gcc -c」で対処しても下記の通りうまくいきませんでしたので、「scc」でやってみましたが結局現状ではどちらも当方ではうまく動きません。 D:\math\fortran>type tes1.f lib.c tes1.f program mogera C_EXTERNAL hello call hello stop end lib.c #include <stdio.h> #define near() asm volatile("fldcw __RoundNear") #define down() asm volatile("fldcw __RoundDown") #define up() asm volatile("fldcw __RoundUp") #define chop() asm volatile("fldcw __RoundChop") int _RoundNear =0x133a; int _RoundDown =0x173a; int _RoundUp =0x1b3a; int _RoundChop =0x1f3a; void hello() { printf("%s\n", "hello from C function!"); } D:\math\fortran>ftn95 /dreal tes1.f [FTN95/Win32 Ver. 5.01.0 Copyright (c) Silverfrost Ltd 1993-2006] NO ERRORS [<MOGERA> FTN95/Win32 v5.01.0] D:\math\fortran>gcc -c lib.c D:\math\fortran>slink tes1.obj lib.o WARNING the following symbols are missing: HELLO D:\math\fortran\tes1.obj (D:\MATH\FORTRAN\TES1.F) Creating executable: D:\math\fortran\tes1.exe D:\math\fortran>tes1 D:\math\fortran>type error.txt Runtime error from program:d:\math\fortran\tes1.exe Run-time Error *** Error 29, Call to missing routine : _HELLO at 0x00401020. 00401000 main [+0025] [recur= 1] D:\math\fortran>

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.6

.... 誰だ, 「gcc での~ないといけないのです」なんて中途半端なことを言ったやつは.... 「コンパイルするだけ」なら main はいらない. gcc だろうと cl だろうと同じこと. たぶん scc でも同じはずだ. もちろん「リンクして実行ファイルを作る」ためには main が必要. 「コンパイルする」ことと「リンクして実行ファイルを作ること」とは別です. 区別してください.

lagrange
質問者

お礼

>.... 誰だ, 「gcc での~ないといけないのです」なんて中途半端なことを言ったやつは.... >「コンパイルするだけ」なら main はいらない. gcc だろうと cl だろうと同じこと. たぶん scc でも同じはずだ. パスを通した上でコマンドプロンプトから「gcc lib.c」とするとエラーとなり、何のファイルもはき出されません。実際のエラーメッセージは次の通りです。 C:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../libmingw32.a(main.o):main.c:(.text+0xbd): undefined reference to WinMain@16' collect2: ld returned 1 exit status 「scc」でコンパイルする際に、「asm volatile("...")」 という形でアセンブリコードを埋め込むことができないのならば、sccはどのように記述すればいいのでしょうか? 「FTN95」に「scc」もすでにインストール済みなわけで、すでにあるものの有効活用でいけるところまでいってみたいと思うのです(「むしろ、そっちのほうが難しいんだよ!」と突っ込まれるかもしれませんが…)。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

まさかまさかなんだけど, C のソースに「関数 main がある」ってオチはないよね?

lagrange
質問者

お礼

回答ありがとうございます。「gcc」でのコンパイルには最低限 int main(){ return 0; } がないといけないのです。「FTN95」付属の「scc」ではそうではありませんが…。 部分的には貴殿の“オチ”のとおりかもしれません…。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

scc というのがわたしがインストールしたものには入っていなかったので すぐには確認できませんが、それがCコンパイラなら使えるのではないかと思います。 ただ、asm volatile("...") という形でアセンブリコードを埋め込むことは できないと思われますので、scc 用の記述に変えるなりしなければならないのではないでしょうか。 もうひとつ、Visual C/C++ ですがExpress edition というものが 無料配布されていて、これを使うことができるでしょう。 Visual Studio 2008 Express Edition の DVD イメージからのインストール http://www.microsoft.com/japan/msdn/vstudio/express/maninstall/2008/

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

>ご教示願います。 これ、相手に敬意をはらった書き方だと思って書いてます? ま、それはともかくエラーメッセージにあるようにFORTRAN側の プログラムからして間違ってますし、C側も補足で出されたのも含めて間違ってます。 C_EXTERNAL WRITE 'WriteFile' : INTEGER*4 INTEGER*4 RESULT RESULT=WRITE() write(*,*) result return end サブルーチンでもないのに、returnがあるのは間違いということで コンパイルできてません。 手元にあって試したのはFTN77ですが、基本的には同様にできるはずです。 C:\win32app\salford>type moge.f program mogera C_EXTERNAL hello call hello stop end というFORTRANプログラムで、helloがCで記述したサブルーチンです。 C:\win32app\salford>ftn77 moge.f [Salford FTN77/Win32 v4.03, Copyright (c) Salford Software Ltd. 1988-1998] Licensed to: FTN77 Personal Edition Department: Non-commercial use only NO ERRORS [<MOGERA>FTN77 Ver 4.03] で、C側はこう。 C:\win32app\salford>type lib.c #include <stdio.h> int _RoundNear =0x133a; int _RoundDown =0x173a; int _RoundUp =0x1b3a; int _RoundChop =0x1f3a; void near() { __asm fldcw _RoundNear } void down() { __asm fldcw _RoundDown } void up() { __asm fldcw _RoundUp } void chop() { __asm fldcw _RoundChop } void hello() { printf("%s\n", "hello from C function!"); } C:\win32app\salford>cl -c lib.c Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86 Copyright (C) Microsoft Corporation 1984-2002. All rights reserved. lib.c C:\win32app\salford>slink.exe moge.obj lib.obj Creating executable: C:\win32app\salford\moge.exe C:\win32app\salford>moge hello from C function! と、C側の関数の出力がされてます。 FORTRAN側でサブルーチンではなく関数として使うのであれば 多少変わりますが大まかな手順としてはこんな感じになります。 補足にあるCプログラムを見るとgcc用のようですが、FTN77やFTN95って gccでコンパイルしてできた.oファイルもリンクしてくれるんでしょうか?

lagrange
質問者

お礼

>>ご教示願います。 >これ、相手に敬意をはらった書き方だと思って書いてます? 当方の言葉の誤用で貴殿に対して失礼となる書き込みをしてしまったこと、心よりお詫び申し上げます。 本題ですが、FortranからCを呼び出すこと自体は問題なくできました。ありがとうございます。ただ、肝心のgccでコンパイルしたオブジェクトファイルでは、(拡張子をgccでのコンパイル時に「.obj」に指定したとしても)実行ファイルができてもエラーとなってしまいます。「『main』関数が2重に定義されている」とかいうメッセージがslink実行時に出てしまい、できた実行ファイルを実行してもエラーで止まってしまいます。 ちなみにFTN95に同梱されているsccではslink不能なのでしょうか。当方はVisual Studioは有しておりませんので「cl.exe」は当然入っておりません。簡単(?)なCの関数を呼び出すのに、さらに別のソフト(有料?)を入れるという大がかりなことをしないとだめなものなのでしょうか…。 何かいい解決法はないものでしょうか?お教え願います。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

エラーメッセージが出ているならそれを書いてください. もちろん「翻訳」なんかしないで, 一字一句そのままで. ちょっと見た感じだと C の方は特にいじらなくてもいいように見えるけどなぁ....

lagrange
質問者

お礼

回答ありがとうございます。質問文の「D:\fortran\」は「D:\math\fortran\」の誤りです。訂正します。

lagrange
質問者

補足

上述したエラーメッセージは以下の通りです(一字一句そのままです)。 ■D:\math\fortran> ftn95c /link /dreal sample.f D:\math\fortran>ftn95.exe /link /dreal sample.f /link [FTN95/Win32 Ver. 5.01.0 Copyright (c) Silverfrost Ltd 1993-2006] 0005) return *** RETURN cannot be inside a PROGRAM block 1 ERROR [<main program> FTN95/Win32 v5.01.0] *** Compilation failed なお、Cを呼び出す必要があるのは、Fortranの命令で浮動小数点をユーザーの希望するタイミングでUp・Down・Chop・Nearできないため、Cから呼び出すことでこれを実現したいからです。 ちなみに、<D:\fortran\sample0.c>も用意してあります。 <D:\fortran\sample0.c> #include <stdio.h> #define near() asm volatile("fldcw __RoundNear") #define down() asm volatile("fldcw __RoundDown") #define up() asm volatile("fldcw __RoundUp") #define chop() asm volatile("fldcw __RoundChop") int _RoundNear =0x133a; int _RoundDown =0x173a; int _RoundUp =0x1b3a; int _RoundChop =0x1f3a; int main() { return(0); } 改めてご教示願います。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

質問者さんの組み合わせはやったことがないのですが <D:\fortran\sample.c> #extern int Writefile(int); C側がこれだけですか? これだと、Cで関数の実装がされてませんけど。 それから、#extern というのはCコンパイラがエラーにしてしまうような気がするんですがユーザーガイドとやらを読み違えてたりしませんか? FORTRAN側のプログラムもなんか変だなあ。

lagrange
質問者

お礼

回答ありがとうございます。質問文の「D:\fortran\」は「D:\math\fortran\」の誤りです。訂正します。

lagrange
質問者

補足

上述したエラーメッセージは以下の通りです(一字一句そのままです)。 ■D:\math\fortran> ftn95c /link /dreal sample.f D:\math\fortran>ftn95.exe /link /dreal sample.f /link [FTN95/Win32 Ver. 5.01.0 Copyright (c) Silverfrost Ltd 1993-2006] 0005) return *** RETURN cannot be inside a PROGRAM block 1 ERROR [<main program> FTN95/Win32 v5.01.0] *** Compilation failed なお、Cを呼び出す必要があるのは、Fortranの命令で浮動小数点をユーザーの希望するタイミングでUp・Down・Chop・Nearできないため、Cから呼び出すことでこれを実現したいからです。 ちなみに、<D:\fortran\sample0.c>も用意してあります。 <D:\fortran\sample0.c> #include <stdio.h> #define near() asm volatile("fldcw __RoundNear") #define down() asm volatile("fldcw __RoundDown") #define up() asm volatile("fldcw __RoundUp") #define chop() asm volatile("fldcw __RoundChop") int _RoundNear =0x133a; int _RoundDown =0x173a; int _RoundUp =0x1b3a; int _RoundChop =0x1f3a; int main() { return(0); } 改めてご教示願います。

関連するQ&A

  • FortranプログラムからC言語で実装された関数を呼ぶ方法

    Windows Vista Home PremiumにFTN95をインストールしたPCにて、Fortranのプログラミングをし始め、「Cpad for Salford FTN77」を利用してプログラミングをしています(FORTRAN77・Fortran90ともに)。FTN95でのFortranプログラミングに際し、FortranプログラムからC言語で実装された関数を呼ぶには、どのように対処すれば可能になりますでしょうか?何分初心者ですので、拙い質問かと思いますが、何卒ご教示願います。

  • Fortran90/Fortran95→Fortran77

    大学の授業でFortranを使ったプログラミングを勉強しています。 以下の文が大学のPCに入っているコンパイラでは問題なくコンパイルでき実行できるのですが、家のPCだとコンパイルすることが出来ません(以下の文でエラーが出ます) 大学のPCの開発環境はFujitsu-FORTRANだと思います(^ ^; 家のPCはSalford FTN77 Personal Edition CompilerとCPad for Salford FTN77を組み合わせて使用しています なぜエラーがでるのか自分なりに考えた結果、Fortran90/Fortran95のプログラムをFortran77のコンパイラでコンパイルしているからだと思います(全くの勘違いだったら指摘して下さい) Fortran90/Fortran95の開発環境がフリーで整えばいいのですが、見つからないのでプログラムを修正したいと思います そこで、力を貸していただきたいのです 前置きが長くなりましたが、エラーが出る文は以下のところです open(8,file='freq_ex13.dat',action='write',status='replace') ここを、Fortran77のコンパイラでコンパイルできるようにアドバイスを下さい よろしくお願いします

  • Fortranを学校と家で両方使うには?

    これから課題でFortranを使ってプログラムしなくてはなりません。Fortranが全くわからず時間もないので学校でプログラムした続きを自宅のパソコンでもしたいと思うのですが、学校で使っているツールと違っても大丈夫なのでしょうか? 過去の質問と回答からFTN77 Personal EditionやCPad for Salford FTN77などがフリーのツールだということは分かったのですが…。 大変初歩的な質問ですが、教えて頂けたらとても助かります。よろしくお願いします。

  • FORTRAN 複素数 (実部を取り出す方法)

    fortran77で複素数の実部を取り出したいのですが、 関数が存在するかわかりません。どなたか、ご存知の方、 教えてください。虚部は出せました。 FORTRAN77(SALFORD FTN77)を使っています。 確か、fortran90なら real(○+□i)だったと思います。

  • FORTRAN77で作ったプログラムを開くとバイナリファイルと認定され、編集できません

    FORTRAN77を最近勉強し始めました(プログラミング自体が超初心者です)。 ネットで情報を集め、コンパイラーはFTN77、エディタはCPadというフリーソフトを インストールし、実際にプログラムを作って実行してみたました。 一応は上手くいったみたいなのですが(非常に簡単な計算なので)、 いったんエディタを閉じて再び開いてみると、 「ファイル~~~はバイナリファイルと判定されました。無視して開きますか?」 という警告が出て、開いてみると意味不明な文字列が書いてあるだけで もともと何が書いてあったかわかりません。 どうしてこのようなことになってしまうのでしょうか?

  • C言語 extern について

    どうもこんにちは C言語でプログラムを作っています。 複数のファイルから1つのプログラムを作っていますが、あるファイルで実装した関数を別のファイルから使用する際、単にプロトタイプ宣言を行うだけでなく、extern が必要なのでしょうか? 今までは extern を使用せず、以下のように書いてました。 // main.c ファイル int func_sub(); int func_main() { return func_sub() * 2; } // sub.c ファイル int func_sub() { return 10; } これは extern を使用して、このように書かないとだめなのでしょうか? // main.c ファイル extern int func_sub(); // このexternは必要? int func_main() { return func_sub() * 2; } // sub.c ファイル int func_sub() { return 10; } 大域変数を他のファイルでも使用する場合はexternが必要ですが、関数に関してもexternを使用しなければならないのでしょうか?

  • c言語とfortranの混在プログラミング

    cとfortranの混合プログラミングについての質問です。環境はWindows上でVisual studio 2005/Intel fortran 9.1です。 --c側(ctest6.cpp) #include <stdio.h> extern "C" void __stdcall fsub(){ printf("TEST PROGRAM!!\n"); } --fortran側(ftest6.f90) PROGRAM MAIN call FSUB END --エラー ctest6.obj:error LNK2019:未解決の外部シンボル_fsubが関数_mainで参照されました。 ftest6.obj:error LNK2019:未解決の外部シンボル_FSUBが関数_MAIN_で参照されました。 ftest6.exe:fatal error LNK1120:外部参照2が未解決です。 ---- __stdcall fsub()"の部分を過去の質問等を参考にし、色々(cのfsubを_fsubやfsub_にしたりと"_"を追加したり)と試してみたりしたのですが、上記のエラーがでてしまいます。fortran側で_FSUBと記入できない点が課題な気がしているのですが、ご教授いただけないでしょうか?

  • FortranにあってCにない関数?について

    10年間Fortran90でプログラミングをしてきましたが、 C言語を使う必要があって、プログラムを書き直し中の者です。 入門書を数冊読んでいて疑問に思ったのですが、Fortranには、 A=SUM(B) と書けば、配列Bの全ての総和をAに返す、という関数があるのですが、C言語に同じような関数はないのでしょうか?(標準ライブラリに無いという事はないのでしょうか?) Fortranと比べてCは組み込み関数が少ないという印象を持ったのですが実際そうなのでしょうか? また、Fortanでは配列の和をとる時、 do i=0,n a(i)=b(i)+c(i) end do を一行で、 a(0:n)=b(0:n)+c(0:n) と書いても良いですし、もし定義されている全部の配列の要素が対象なら a=b+c と一行で書いても良いのですが、c言語では似たような書き方はできないのでしょうか? つまり、多次元配列を扱う時、Fortranでは単に「a=b+c」と書けば済むところを、Cでは for (i=0,i<=n,i++){ for (j=0,j<=n,j++){ for (k=0,k<=n,k++){ a[i][j][k]=b[i][j][k]+c[i][j][k]; }}} と書かなくてはいけないのか?と悩んでおります。 私がCの機能を知らないだけなのか、Cとはそうゆうことが出来ないのか、浅学なため判断できません。 ご教授ください、どうぞよろしくお願いいたします。

  • FORTRANコンパイル時について

    土木の設計でFORTRANで書かれたプログラムを使用しているのですが,コンパイルする際に下記内容のエラー(?)が出ていますが,コンパイル自体は完了しています。 これって何かオカシイのでしょうか。 ■C:\Documents and Settings\ETP5\デスクトップ\programs_2D> ftn77 /link elastc.f [Salford FTN77/Win32 v4.03, Copyright (c) Salford Software Ltd. 1988-1998] Licensed to: FTN77 Personal Edition Department: Non-commercial use only 0130) END COMMENT - STXY has not been used COMMENT - SSIY has not been used COMMENT - SSIX has not been used NO ERRORS,3 COMMENTS [<ELASTC2D>FTN77 Ver 4.03] NO ERRORS [<DATA_IN>FTN77 Ver 4.03] NO ERRORS [<FIX>FTN77 Ver 4.03] NO ERRORS [<INIT>FTN77 Ver 4.03] NO ERRORS [<CALC_SIG>FTN77 Ver 4.03] 0391) IF((TK(K,I-K+1).EQ.0.D0).OR.(X(K).EQ.0.D0)) GOTO 2 WARNING - The use of .EQ. or .NE. with non-integer operands can produce misleading results WARNING - The use of .EQ. or .NE. with non-integer operands can produce misleading results NO ERRORS,2 WARNINGS [<LEQ>FTN77 Ver 4.03] NO ERRORS [<LEQ1>FTN77 Ver 4.03] NO ERRORS [<MAKE_GAMX>FTN77 Ver 4.03] NO ERRORS [<CALC_TF>FTN77 Ver 4.03] NO ERRORS [<MAKE_TK>FTN77 Ver 4.03] NO ERRORS [<WRITE_SUB>FTN77 Ver 4.03] Creating executable: elastc.exe 宜しくお願い致します。

  • C言語からのFortranプログラムの呼び出し

    Fortranで記述した以下のような構成の有限要素法プログラムをC言語から呼び出したいのですが,具体的にどのようなコードを記述すればいいのかがわかりません.お教えいただけないでしょうか. サブルーチンinputおよびoutputでは入力および結果ファイルの入出力を行っています. 当方C言語はほぼ初心者です.Fortranのプログラミング環境としてはVisualStudio2005およびVisualFortran9.1を用いています. C言語のプログラミング環境としてはおなじくVisualStudio2005を使用したいとおもっております. [メインプログラム] open (5,file='input.dat') open (6,file='output.dat') /入出力用のファイルを開く call input(parameter1) /各サブルーチンで有限要素法を実行 call bound(parameter2) call matrix(parameter3) call solve(parameter4) call output(parameter5) close (5) /入出力用のファイルを閉じる close (6) stop end

専門家に質問してみよう