1 名前:デフォルトの名無しさん [2006/11/12(日) 17:13:35 ] FORTRAN総合スレッドです。 FORTRAN77/90/95/2003, HPF等、FORTRAN全般に関する話題を書き込んで下さい。 ・FORTRAN関連情報 お約束だが、まずは自分で調べよう www.google.co.jp/ x86で動作するFortranコンパイラ www.nminoru.jp/~nminoru/programming/x86-fortran.html The Fortran Company www.fortran.com/ Polyhedron Software www.polyhedron.co.uk/ Google Directory - Fortran directory.google.com/Top/Computers/Programming/Languages/Fortran/ ・前スレ FORTRAN III pc8.2ch.net/test/read.cgi/tech/1104724162/ FORTRAN II pc5.2ch.net/test/read.cgi/tech/1068351911/ Fortran pc2.2ch.net/test/read.cgi/tech/1003214738/
82 名前:デフォルトの名無しさん [2006/11/22(水) 23:35:23 ] >>74 それは>>78 にあるように、SSLIIのライブラリを読んでいるので、それが無いと言っている。 SSLIIのライブラリがあるコンパイラ(Fujitsu、Lahey)の奴でやるか、 あるいは他のライブラリで置き換える必要がある。 LU分解っぽいので、LAPACKとか何でもあるべ。
83 名前:デフォルトの名無しさん [2006/11/23(木) 14:05:27 ] n行m列の行列があり、そこからn行m列のそれぞれの値を一列に直して、それぞれに値について大きい順に並べなおし、元のn行m列に直してみたいのですけどどんなプログラムの方法がありますか? よければ、教えてください>< ちなみにfortran77を使っています></
84 名前:デフォルトの名無しさん [2006/11/23(木) 16:00:07 ] >>83 言ってることがよく分からないが、2次元行列を列ごとにソートして、 上から下へ大きい順に並べなおしたいということか? それなら簡単だ。 1.まず1次元ソートのサブルーチンを用意する。これを SORT(n, x) としよう。 2.列ごとにソートする。 DO 10 i = 1, m CALL SORT(N, X(1, i)) 10 CONTINUE これでおk。
85 名前:デフォルトの名無しさん [2006/11/23(木) 18:03:09 ] >>84さん指摘ありがとうございます でもちょっと違うのです>< たとえば、1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16 について、 1 2 3 … 16 といってから順番を変更して 16 12 8 4 15 11 7 3 14 10 6 2 13 9 5 1 という風に並べたいのです
86 名前:デフォルトの名無しさん [2006/11/23(木) 19:56:32 ] >>85 それならもっと簡単だ。FORTRAN77は配列の先頭アドレスしか渡さない。 次元数とか大きさは気にしない。 また、FORTRANの配列はメモリー上では、列方向に隣り合って1次元に並んでいる。 ゆえに、N*Mの要素数で1次元のソートをすればいい。 1.1次元のソートを用意する。 2.CALL SORT(N*M、X) これでOK
87 名前:デフォルトの名無しさん mailto:sage [2006/11/24(金) 11:12:38 ] >>83 元々mixiに書き込んだんだから、解決したらmixiにも書くように。
88 名前:デフォルトの名無しさん [2006/11/24(金) 11:44:03 ] >>87 つーか>>83 のレベルでは>>86 の回答は理解できないんじゃないか。 FORTRANはこういうイカサマ技によって、1次元整数0クリアをつっかって 多次元整数、実数などのクリアーに使えた。一種のPolymorphism wwwww
89 名前:デフォルトの名無しさん [2006/11/24(金) 14:36:03 ] >86さんありがとうございます 確かに速く知りたいという気がはやりすぎて、いろんな所で質問していますね ちゃんと自分で理解できたら書いていきたいとは思っているのですけどね でも、やはりちょっと理解できません^^; よければ、何か例とかあるとありがたいのですけど><
90 名前:デフォルトの名無しさん [2006/11/24(金) 14:36:17 ] >>77 ありがとうございます! >>78 さんの言うとおり、富士通SSLUを使っている様子です。 >>82 LaheyやLAPACKとはどんなものですか??
91 名前:デフォルトの名無しさん mailto:sage [2006/11/24(金) 20:57:18 ] >>90 ttp://www.google.co.jp/search?q=lahey+fortran ttp://www.google.co.jp/search?q=lapack+fortran
92 名前:デフォルトの名無しさん [2006/11/24(金) 23:12:56 ] >>90 Laheyはコンパイラの自社独自開発をやめて、今では富士通のフロントエンドを使っている。 富士通はLinux版しか出していないが、LaheyはWindows版も出している。 富士通が絡んでいるので、プロフェッショナルバージョンを買うとSSLがついてくる。 あとSSLは名古屋大学のNUPACKと密接な関係があるので、netNUMPACが参考に なるかもしれないし、ならないかもしれないwww 漏れは富士通系はメインには使わなかったのでよく知らんw LAPACKは固有地問題と線形問題用のサブルーチン集だ。これは国際標準と化してきているので どこの機械でも動いている。
93 名前:デフォルトの名無しさん mailto:sage [2006/11/24(金) 23:33:34 ] >>89 PROGRAM unko REAL a(5, 2) CALL kintama(5 * 2, a) DO 10 i = 1, 5 PRINT *, a(i, 1), a(i, 2) 10 CONTINUE END C SUBROUTINE kintama(n, x) REAL x(n) DO 10 i = 1, n x(i) = REAL(i) 10 CONTINUE RETURN END 実行結果 1.000000 6.000000 2.000000 7.000000 3.000000 8.000000 4.000000 9.000000 5.000000 10.00000 Press any key to continue サブルーチン 金玉 で、1次元配列xに1〜nまで順番に数を代入している。 一方、メインルーチンから呼び出すときは、2次元配列を引数(ひきすう)に与えている。 要素数は行×列=10個で渡している。 返ってくる結果を見ると、列方向に連続した値で戻って来ている。 同様のことをSORTでやれば、はじめ二次元にランダムだった数が、 列方向にソートされて戻ってくる。
94 名前:デフォルトの名無しさん mailto:sage [2006/11/25(土) 08:07:15 ] >>89 >確かに速く知りたいという気がはやりすぎて、いろんな所で質問していますね それはマルチポストと言って、マナー違反だな。 ここをよーく読んどくように。 ja.wikipedia.org/wiki/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%9D%E3%82%B9%E3%83%88
95 名前:デフォルトの名無しさん mailto:sage [2006/11/26(日) 17:18:04 ] FORTRANのエロゲとかないの?
96 名前:デフォルトの名無しさん [2006/11/27(月) 19:00:46 ] >>53 >x(1:n) = y(1:n) この書き方って例えば次のような漸化式に使うと ちゃんと計算してくれない. x(1)=0 x(2)=1 x(3:n) = 2*x(2:n-1) - 4*x(1:n-2) 自分に自分を代入するような 式だと駄目っぽい (途中から全部0になる).なんで??
97 名前:デフォルトの名無しさん mailto:sage [2006/11/27(月) 21:01:20 ] >>96 配列の演算はすべて並列計算として処理されるので x の要素が 0 で初期化されていた場合、 x(3) = 2*x(2) - 4*x(1) = 2*1 - 4*0 = 2 x(4) = 2*x(3) - 4*x(2) = 2*0 - 4*1 = -4 x(5) = 2*x(4) - 4*x(3) = 2*0 - 4*0 = 0 x(6) = 2*x(5) - 4*x(4) = 2*0 - 4*0 = 0 ・・・ となる。 do i=2,n x(i) = x(i-1) + 1 end do と x(2:n) = x(1:n-1) + 1 では意味が違うのだ。
98 名前:96 mailto:sage [2006/11/27(月) 22:18:19 ] >>97 おお〜よくわかりました! ありがとう
99 名前:デフォルトの名無しさん [2006/11/28(火) 00:17:59 ] >>96 REAL::A(N, N), B(N, N) A = A * B のような状況を考えれば、今のFORTRANの仕様がもっともだと分かる。 行列操作がらみで、この仕様はとても便利。いちいち自分でテンポラリにコピーしなくていい。 あと一応、並列化されたときのことも考慮されてそういう仕様になっているらしい。
100 名前:デフォルトの名無しさん [2006/11/29(水) 13:24:49 ] >>74 のプログラムにおいて、ファイルの定義とはどの部分にどのように書き込むものなのですか? 全体のプログラムの中のどこかに隠れているのでしょうか?
101 名前:デフォルトの名無しさん [2006/11/29(水) 21:16:59 ] 次の条件のうちから他の位置の緯度(θ2)と経度(λ2)を求めるプログラムを作成せよ。 1.元の場所の緯度(θ1)を北緯35度40分、経度(λ1)を東経139度12分 2.距離(s)を6242.2kmとする s=R×α°×π/180 (R=6370km) 3.方位角(ν)を86.6度とする sinν=cosθ2×sin刄ノ/sinα (刄ノ=λ2-λ1) (利用できるのであればcosα=sinθ1sinθ2+cosθ1cosθ2cos刄ノを利用してもよい) また、他の方法があるのであればそのプログラムを作成せよ。 正直言って、ちんぷんかんぷんなのです>< わかる方がいればよければ、教えてくださいませんか><
102 名前:デフォルトの名無しさん [2006/11/29(水) 23:12:10 ] >>100 基本的にリンカーに対してライブラリを指定するだけである。 最近のコンパイラは、コンパイラ・ドライバというものが、コンパイラやリンカーなどを 自動的に次々呼び出しているので、そのヘルプをよく読んで、リンカーにライブラリを 指定するオプションを探すべし。 コンパイラ・ドライバには、コンパイラへのオプションと、リンカーへのオプションを 個々に与えることができる。 この辺は、便利になった分かえって昔より何やってるのかわからなくなってる。 >>101 球面三角がんばれw
103 名前:デフォルトの名無しさん [2006/11/30(木) 02:28:58 ] >>101 どうも熱海の島から射程約6000kmのテポドンを発射しているようだが、 方位角(ν)の定義が分からん。もう少し詳しく。 まぁ式が与えられているので情報としてはすでに十分なのだが、 数式から逆算する気力がない。 cosα=sinθ1sinθ2+cosθ1cosθ2cos刄ノ は内積から出た。
104 名前:デフォルトの名無しさん mailto:sage [2006/11/30(木) 21:33:37 ] >>101 今度は2ちゃんに書いた後mixiですか。
105 名前:デフォルトの名無しさん [2006/11/30(木) 22:25:56 ] >>101 答えは、ハワイのオアフ島だ。 北緯21度24分 西経157度53分だ。 ついでに発射地点は熱海ではなく、八王子のあたりだな。 PROGRAM vipper IMPLICIT NONE REAL :: theta1, theta2, phi1, phi2, alpha, anu, pi REAL :: rot_z(3, 3), rot_y(3, 3), vec1(3), vec2(3) CHARACTER :: ns, ew pi = 4.0 * ATAN(1.0) alpha = 6242.2 / 6370.0 anu = ( 180.0 - 86.6 ) * pi / 180.0 theta1 = ( 90.0 - ( 35.0 + 40.0 / 60.0 ) ) * pi / 180.0 phi1 = ( 139.0 + 12.0 / 60.0 ) * pi / 180.0 ! rot_z(1, :) = (/ COS(phi1), -SIN(phi1), 0.0 /) rot_z(2, :) = (/ SIN(phi1), COS(phi1), 0.0 /) rot_z(3, :) = (/ 0.0, 0.0, 1.0 /) ! rot_y(1, :) = (/ COS(theta1), 0.0, SIN(theta1) /) rot_y(2, :) = (/ 0.0, 1.0, 0.0 /) rot_y(3, :) = (/ -SIN(theta1), 0.0, COS(theta1) /) ! vec1(1) = SIN(alpha) * COS(anu) vec1(2) = SIN(alpha) * SIN(anu) vec1(3) = COS(alpha) ! vec2 = MATMUL(rot_z, MATMUL(rot_y, vec1)) !
106 名前:デフォルトの名無しさん [2006/11/30(木) 22:27:15 ] theta2 = ASIN(vec2(3)) * 180.0 / pi phi2 = ATAN2(vec2(2), vec2(1)) * 180.0 / pi ! PRINT *, theta2, phi2 ns = 'N' IF (theta2 < 0.0) ns = 'S' ew = 'E' IF ( phi2 < 0.0) ew = 'W' PRINT '(i4, a, i2, 1x, a)', INT(ABS(theta2)), ' ', NINT(( ABS(theta2) - INT(ABS(theta2)) ) * 60.0), ns PRINT '(i4, a, i2, 1x, a)', INT(ABS( phi2)), ' ', NINT(( ABS( phi2) - INT(ABS( phi2)) ) * 60.0), ew STOP END PROGRAM vipper
107 名前:105 [2006/11/30(木) 22:29:33 ] ごめん 北緯と南緯の処理が間違ったままの古いのうpしてしまった。 ま、本質は変わらんから適当に処理しておいてくれ。 質問があれば、答えやすく論理的に聞いてくれ。
108 名前:105 mailto:sage [2006/11/30(木) 22:33:40 ] スレ汚し すまんこw 出力結果だ。 21.39687 -157.8804 21 24 N 157 53 W Press any key to continue あと、方位角νは真北から時計回りに測ることとした。 つまり今の問題では、八王子からほぼ真東に、地球の半径とだいたい同じだけ飛ぶと ハワイのホノルル近辺に着くという事だ。 Google Earthで確かめて味噌。定規を使うと2地点間の距離を測れる。
109 名前:デフォルトの名無しさん mailto:sage [2006/12/01(金) 12:38:00 ] Mixi より vipper の方が上なのかよw
110 名前:デフォルトの名無しさん [2006/12/01(金) 15:04:03 ] >105さんありがとうございます 今日だされた答えを見比べてみたら、合っています!! でも、私が実際にやってみた所たくさんのエラー出てきてどうしようもない 状態です>< 今、私が利用しているのは[fc pad FTR77]というfortran77のものなんですが どうしてエラーが出てしまうのかがよくわかりません>< もしも今回のものがfortran77でないとしたら、今度から実際にやるとしたら どのようなプログラムになるのですか? よければ、教えてください><
111 名前:デフォルトの名無しさん mailto:sage [2006/12/01(金) 19:50:23 ] 浮動小数点の値がでかすぎて整数型に変えられません ってエラーが出てくるんですが、どうすれば回避できますか? 浮動小数点のままちっちゃくして(10で割るとか)整数型に変えてから10を 掛けるとかすれば回避できると思いますけど(端数は取っといて後で足すとして) こんな妙なことする必要ないですよね… くだすれに書き込むべきかと思いましたが落ちてますよね?
112 名前:デフォルトの名無しさん mailto:sage [2006/12/01(金) 20:10:12 ] くだすれFORTRAN(超初心者用)その2 pc8.2ch.net/test/read.cgi/tech/1164121236/ それから質問内容は「具体的に」な
113 名前:デフォルトの名無しさん mailto:sage [2006/12/01(金) 20:28:00 ] >>112 あれ?たってましたか…すみません。 そちらで聞いてきます、ありがとう。
114 名前:デフォルトの名無しさん mailto:sage [2006/12/01(金) 23:08:57 ] >>110 つ ttp://ace.phys.h.kyoto-u.ac.jp/~tomita/education/fortran90/sec0.html これ見て77に直せ。
115 名前:デフォルトの名無しさん mailto:sage [2006/12/01(金) 23:14:37 ] >>111 今の一般のFORTRANの整数は32ビットの整数だ。 その場合表しうる数の範囲は−2^31〜2^31−1だ。 2^31=2147483648〜2*10^9→2ギガ だから、これより絶対値の大きい 実数を整数に変換しようとすればエラーが出る。 たとえ10で割ってうまく収まっても10倍したらオーバーフローするので無意味だ。 整数のオーバーフローは検知されないので(オプションにもよるが)実行時エラーが 出ないまま無意味な計算が続くことになる。
116 名前:デフォルトの名無しさん mailto:sage [2006/12/01(金) 23:23:55 ] >>110 それはFortran90のプログラムだから、Fortran77ではエラーが出るのは当然だ。 ちみは今度からは、くだスレの方に書きなさい。 しかしその程度のレベルで、あの座標回転を使って解いたプログラムを出したら 他人にやってもらったことがバレバレだwww 次からは最初にFORTRAN77でお願いしますと書いておきなさい。
117 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 01:14:47 ] もっと初心者にやさしくしてやれよ。 Fortranユーザーを増やすために。
118 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 04:16:33 ] >>117 同意・・・(どうでもいいがw)
119 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 05:14:42 ] 初心者っつーより只の宿題教えてクンっぽいが。
120 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 18:07:18 ] FORTRAN77 のGOTO文とラベルの嵐に いやになり,暫くC++系に浮気してたが Fortran90当りからまたフォトランナーに戻った
121 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 19:04:12 ] >>120 おかえりなさい。 C言語は、C99,D,C++,ObjectiveC,SecureなCなどに分裂してきているので、 煽ってこの分裂をいっそう深めて、Fortranを有利にしてくれ。
122 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 03:38:34 ] >>121 それを発展ともいうんだがw
123 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 17:38:37 ] 計算量が増えてきたので、1台パソコンを増やそうとしているのですが、 (現在Pen4 3.6GHz、IntelVisualFortran9.0) 並列計算しそうにないコードなので、CPUの選択に迷っています。 今までPen4あたりのシングルコアで流していた方はこれから どうされるつもりですか? Core2Duoとかどうなんでしょう・・・ 上の方ではCore2Duoの方が速いという書き込みがありますが・・・ 一応予算は1式20万円位を想定しています.
124 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 23:45:38 ] >>122 いや、ハッテンは結構なんだが、うまく同じくらいに枝分かれしてもらえると、内ゲバが始まって 全部衰退してくれて助かる。 あとC派生言語がSecureな方向に向かってくれると、最適化スピードが落ちてやがて自滅するだろう。 バッファーオーバーランの恐怖とかを煽って常にSUBCHKかけたまま走るように仕向けるべし。 JavaやC#などは結局根本的に方向を間違っていると思う。 UCSD p-code Pascalの昔から、VirtualMachineはとてもいいアイデアのように思えて、 それでいてうまく行ったためしがない。スピードがあればエミュレーションで十分だと、むかしから 言われてきたが、スピードが上がると新しい使い方が出てきて、ギリギリのCPU消費が 求められるからうまく行くはずがない。 もっともFortranも規格がどんどん肥大化していてかつてのPL/I型の破滅の道を たどっている気がしなくも無いのだがw
125 名前:デフォルトの名無しさん mailto:sage [2006/12/05(火) 10:31:13 ] >>124 PL/Iかw VMはわしらのように計算機として使う人には無理だが 普通に遊ぶ程度ならいいんじゃないか? っていうか大丈夫なくらいPCの性能があがったんじゃないか? もちろん、FortranでVM使われたら根本的な間違いだが Javaの方向もアリなんじゃないか? Fortranと用途が重ならないし・・・ ちょっとPL/Iがなつかしくなって書きコ
126 名前:デフォルトの名無しさん [2006/12/05(火) 14:26:13 ] C Pad for Salford FTN77 をつかっていますが、プログラムを実行すると RUN TIME ERROR 00402c50 SOLU [+0174] [recur= 1] 00401000 TDOFS [+09ca] が出ます。 RUN TIME ERRORとはなんでしょうか?? メッセージ欄には 「 Licensed to: FTN77 Personal Edition Department: Non-commercial use only 0001) omega1 theta0 theta1 alph beta theta g()/kG *** Unexpected continuation line (have you got more than 19?) *** Compilation failed ^C 」 とでますが、よくわからないです(−−;) どなたか教えてください!!
127 名前:デフォルトの名無しさん mailto:sage [2006/12/05(火) 22:54:37 ] >>126 >*** Unexpected continuation line (have you got more than 19?) >*** Compilation failed せっかくコンパイラがメッセージを出しているのだから、ちゃんと読むように。
128 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 00:05:57 ] >>126 まったく>>127 の言うとおりだ。 子供が泣いているのに、かまってやらない育児放棄の母親レベルだ。 漏れの診断では、2chからコピペしたので、6カラム文の字下げをしていない。 そのせいで継続行に勘違いされている。
129 名前:デフォルトの名無しさん [2006/12/06(水) 12:51:58 ] >>127 じゃあ英訳してあげたら?? 子供が泣いているのに、かまってやらない育児放棄の母親レベルだ。
130 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 13:02:29 ] >>129 は母親に黙らせろって怒鳴るだけの親父。
131 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 13:06:14 ] >>130 は事件があった後に インタビューされる近所の人 「よくあの家の子は泣いていましたよ・・・ひどい親ですね ま、私は関係ないんですけど」
132 名前:デフォルトの名無しさん [2006/12/06(水) 13:52:30 ] 最初の人が馬鹿にした口調で書き込むからこんなくだらないレスが続いてしまったよ。
133 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 14:08:59 ] >>132 >>127 は別に悪くないだろ。悪いのは>>128
134 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 14:31:00 ] 悪いのは>>126 。説明を端折った質問をするからこうなる。 「プログラム」が何者かこちらには全く分からない。
135 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 14:33:15 ] とりあえず、俺が悪いよ みんなゴメソ
136 名前:デフォルトの名無しさん [2006/12/06(水) 14:40:20 ] >>134 でも内容も何もわからない人だったら質問をちゃんとしろってのも難しいんじゃないかな??
137 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 20:08:27 ] 質問をしている人間が自分のやってることの内容も何もわからない状態なら、 それこそ答えようがないだろ。 せめて基本的な文法なりソフトの簡単な使い方くらいは自分で調べて それでもダメだったら、何がしたくて何を試したけどどう上手くいかなかったか 程度のことは書いて質問すべきじゃないか。
138 名前:デフォルトの名無しさん [2006/12/07(木) 04:08:19 ] >>137 もっともな意見だが、それが出来ればたいていは自己解決して2chになんか聞きにこなくてすむw
139 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 07:46:51 ] >>137 Exactly
140 名前:デフォルトの名無しさん [2006/12/07(木) 17:42:48 ] >>139 (笑)
141 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 22:56:54 ] Silverfrost (Salford) FTN95 Version 5.00 キタコレ ttp://www.download.com/Silverfrost-FTN95/3000-2069_4-10614581.html?tag=pub ttp://forums.silverfrost.com/viewtopic.php?t=676&start=0&postdays=0&postorder=asc&highlight= .NET 2.0とVisual Studio 2005に対応したらしいが、VS2005は使ってないので詳細は知らん。
142 名前:デフォルトの名無しさん mailto:sage [2006/12/08(金) 22:06:05 ] Intel FortranでMacアドレス取得する方法ありますか? マニュアル見ても載ってなかったです・・。
143 名前:デフォルトの名無しさん [2006/12/08(金) 23:44:07 ] >>142 C言語でも難しいようだ。標準のWIN32APIでは出来ないので、他の方法をやっているようだ。 安直な方法は、SYSTEM関数でDOSコマンドのipconfig/all を実行し、 その出力からMACアドレスを切り出す方法ジャマイカ?
144 名前:デフォルトの名無しさん mailto:sage [2006/12/08(金) 23:52:39 ] >>143 やっぱりそうなりますかねー。 自分のOS以外で動作を確かめられないのでちょっと大変;; どうもthx
145 名前:デフォルトの名無しさん mailto:sage [2006/12/09(土) 10:46:49 ] >>142 Three ways to get your MAC address. www.codeguru.com/Cpp/I-N/network/networkinformation/article.php/c5451 Retrieving Information Using GetNetworkParams msdn.microsoft.com/library/default.asp?url=/library/en-us/iphlp/iphlp/creating_a_basic_ip_helper_application.asp IPHLPAPIを使ってWindowsでネットワーク設定いじるプログラムを書く www.geekpage.jp/programming/iphlpapi/ この辺だと思うが、PlatformSDKのライブラリをLINKすれば可能なようだ。 しかし自分でインターフェースを書かないと駄目なので難しそう。 TYPEとかの定義が深いので、インターフェースに必要な定義がどれだけあるのかわからん。
146 名前:デフォルトの名無しさん mailto:sage [2006/12/09(土) 17:06:14 ] winだったら昔NetBIOSでとったことがある。
147 名前:デフォルトの名無しさん [2006/12/09(土) 20:54:36 ] PROGRAM MAC USE ifwinty IMPLICIT NONE ! INTEGER, PARAMETER :: MAX_ADAPTER_DESCRIPTION_LENGTH = 128 !// arb. INTEGER, PARAMETER :: MAX_ADAPTER_NAME_LENGTH = 256 !// arb. INTEGER, PARAMETER :: MAX_ADAPTER_ADDRESS_LENGTH = 8 !// arb. ! TYPE :: IP_ADDRESS_STRING CHARACTER (4) :: String(4) END TYPE TYPE :: IP_MASK_STRING CHARACTER (4) :: String(4) END TYPE ! TYPE :: t_IP_ADDR_STRING INTEGER (LPLONG) :: pNext TYPE (IP_ADDRESS_STRING) :: IpAddress TYPE (IP_MASK_STRING) :: IpMask INTEGER (DWORD) :: Context END TYPE !
148 名前:デフォルトの名無しさん [2006/12/09(土) 20:55:07 ] TYPE :: t_IP_ADAPTER_INFO INTEGER (4) :: pNext INTEGER (DWORD) :: ComboIndex CHARACTER (LEN = MAX_ADAPTER_NAME_LENGTH + 4) :: AdapterName CHARACTER (LEN = MAX_ADAPTER_DESCRIPTION_LENGTH + 4) :: Description INTEGER (UINT) :: AddressLength INTEGER (BYTE) :: Address(MAX_ADAPTER_ADDRESS_LENGTH) INTEGER (DWORD) :: Index INTEGER (ULONG) :: iType INTEGER (ULONG) :: DhcpEnabled INTEGER (LPLONG) :: pCurrentIpAddress TYPE (t_IP_ADDR_STRING) :: IpAddressList TYPE (t_IP_ADDR_STRING) :: GatewayList TYPE (t_IP_ADDR_STRING) :: DhcpServer INTEGER (BOOL) :: HaveWins TYPE (t_IP_ADDR_STRING) :: PrimaryWinsServer TYPE (t_IP_ADDR_STRING) :: SecondaryWinsServer INTEGER (ULONG) :: LeaseObtained INTEGER (ULONG) :: LeaseExpires; END TYPE ! INTERFACE INTEGER (BOOL) FUNCTION GetAdaptersInfo(arg1, arg2) USE ifwinty !DEC$ ATTRIBUTES DEFAULT, STDCALL, DECORATE, ALIAS:'GetAdaptersInfo' :: GetAdaptersInfo INTEGER (LPLONG) :: arg1 INTEGER (LPLONG) :: arg2 END FUNCTION END INTERFACE
149 名前:デフォルトの名無しさん [2006/12/09(土) 20:56:42 ] ! TYPE (t_IP_ADAPTER_INFO) :: AdapterInfo(16) TYPE (t_IP_ADDR_STRING) :: CurrentIpAddress INTEGER (DWORD) :: dwRetVal INTEGER (PULONG) :: pdwRetVal INTEGER (BOOL) :: iret CHARACTER (LEN = 128) :: Description dwRetVal = sizeof(AdapterInfo) iret = GetAdaptersInfo(LOC(AdapterInfo), LOC(dwRetVal) ) !PRINT *, AdapterInfo(1)%pNext !PRINT *, AdapterInfo(1)%ComboIndex !PRINT *, AdapterInfo(1)%AddressLength !PRINT *, AdapterInfo(1)%Description(1:128) PRINT '(6Z3)', AdapterInfo(1)%Address(1:AdapterInfo(1)%AddressLength) !PRINT *, AdapterInfo(1)%IpAddressList !PRINT *, AdapterInfo(2)%pNext !PRINT *, AdapterInfo(2)%ComboIndex !PRINT *, AdapterInfo(2)%AddressLength !PRINT *, AdapterInfo(2)%Description(1:128) PRINT '(6Z3)', AdapterInfo(2)%Address(1:AdapterInfo(2)%AddressLength) !PRINT *, AdapterInfo(2)%IpAddressList STOP END PROGRAM MAC とりあえず、これでMACアドレスが取れた。
150 名前:デフォルトの名無しさん [2006/12/09(土) 21:09:05 ] >>142 雪が降っていたので暇つぶしにがんばってみた。 4時間ぐらいかかったが、MACアドレスがIntelFortranで取れた。 方法は>>145 の1番目のリファレンスの3番目の方法を用いた。 型などは、2番目のMSDNに書いてある情報から自分で適当に作ってみた。 TYPEのサイズがC++版で求めているのと一致したので多分OKだろう。自信はないw 漏れはメインフレーム育ちの生粋のFORTRANerで、CもC++はHelloWorld以上のものは 書いたことが無いので、文字列とかポインターの扱いとかが今一自信がない。 コンパイルに必要なのはPlatformSDKだが、漏れはインストールのときに 勝手にインスコされていたようだ。この中のライブラリ IPHlpApi.lib をライブラリに 加えておく必要がある。 Linker>Input>Additional Dependency に、そのまま書けばOKだった。 プロジェクトタイプはコンソールでおk。 >>146 >>145 の記事によるとNetBiosから取る方法は、最近は推奨されないらしい。 ただし取り方は書いてあった。
151 名前:150 [2006/12/09(土) 22:27:56 ] >>149 のメインプログラム部分は、以下に直しておいてくれ。 デバッグ用のゴミを削った。複数のネットワークアダプタにも(とりあえず16個以下だが)対応。 TYPE (t_IP_ADAPTER_INFO) :: AdapterInfo(16) TYPE (t_IP_ADDR_STRING) :: CurrentIpAddress INTEGER (DWORD) :: dwRetVal INTEGER (BOOL) :: iret INTEGER :: i dwRetVal = sizeof(AdapterInfo) iret = GetAdaptersInfo(LOC(AdapterInfo), LOC(dwRetVal) ) IF (iret /= 0) STOP 'Error' DO i = 1, 16 PRINT '(5(Z2.2,"-"), Z2.2)', AdapterInfo(i)%Address(1:AdapterInfo(i)%AddressLength) IF (AdapterInfo(i)%pNext == NULL) EXIT END DO STOP END PROGRAM MAC
152 名前:デフォルトの名無しさん [2006/12/12(火) 14:31:56 ] compaq visual fortran 6.1を使っています。 1つのプロジェクトの中のsource fileのなかには、二つ以上プログラム ファイルを入れてはだめなのでしょうか?ためしに片方のプログラム をコンパイルすると実行時に引っかかってしまいます。 一つを消すと上手くいくのですが…。 では平行して二つのプログラムを作りたい場合どうすればいいのでしょうか? どうかご返答お願いします。
153 名前:デフォルトの名無しさん mailto:sage [2006/12/12(火) 18:50:15 ] >>152 コードを変更するときには、ワークスペースも変更する必要があるはず。 手っ取り早くするには、コード変更=CVF を一旦終了。
154 名前:デフォルトの名無しさん mailto:sage [2006/12/12(火) 23:08:08 ] >>152 実行ファイル毎にProjectを作成して、1つのWorkspaceに'Insert Projects into Workspace'で Projectを追加、または'Add New Project to Workspace'で新しいプロジェクトを追加する。 Buildするときは'Set Active Project'でProjectを選んでからBuildするか または'Batch Build'でまとめてBuildする。 CVF6.6の場合だが、6.1でもたぶん同じだろう。
155 名前:デフォルトの名無しさん mailto:sage [2006/12/13(水) 20:25:50 ] >>153-154 親切にありがとうございました。 ちょっとvisual fortran自体はじめて使ったもので よく分かりませんでしたが聞いて解決しました
156 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 20:33:57 ] ノートパソコンでLAPACKコンパイルすると ファンがぶんぶん回ってうるさいよ〜
157 名前:デフォルトの名無しさん mailto:sage [2006/12/16(土) 01:01:54 ] >>156 LAPACKで計算をするうようになれば同じこと。
158 名前:デフォルトの名無しさん [2006/12/18(月) 16:58:00 ] 下記の文章をfortran77で表すとどうなるか、教えていただけませんか? ex=2.0**((-1)*(l+1)) i=0 k=0 do 210 while(i.lt.n) i=i+1 k=k+1 if(k.gt.p)then call delay(ivw,p,q,j) else j=k end if if(ivw(j).ne.0) then a(i)=ivw(j)*ex else i=i-1 end if 210 continue
159 名前:デフォルトの名無しさん mailto:sage [2006/12/18(月) 17:45:37 ] >>158 whileのループをgoto文を使って書いたら?
160 名前:デフォルトの名無しさん [2006/12/18(月) 23:10:13 ] 計算終了時に、携帯電話へメールで知らせてくれるってことできますか??
161 名前:デフォルトの名無しさん [2006/12/18(月) 23:13:01 ] >>160 シェルスクリプトを書けばいい。
162 名前:f90 mailto:sage [2006/12/19(火) 13:07:00 ] do if(i>=n) exit i=i+1 k=k+1 if(k>p) then call delay(ivw,p,q,j) else j=k end if if(ivw(j)/=0) then a(i)=ivw(j)*ex else i=i-1 end if enddo
163 名前:デフォルトの名無しさん mailto:sage [2006/12/20(水) 15:45:48 ] Intel fortran9.1使ってるんだけど、system()で定期的に外部プログラムを呼ぶとコミットチャージが時間とともに増え続けてしまうという 症状に悩まされていた。ところが、system()の代わりにsystemqq()を使うと、その症状が出なくなった。 こんな経験した人いる?
164 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 01:03:54 ] SYSTEMってPOSIX互換のルーチンかい? SYSTEMQQはQUICKWINからみか? どっちも使わんなぁw
165 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 20:44:11 ] >>164 じゃあ、外部コマンド起動したいときはどうやってるの?
166 名前:デフォルトの名無しさん mailto:sage [2006/12/22(金) 00:31:25 ] 外部コマンド呼ばないw Win32で出来る物はWin32でやる。 できないものは諦めるw
167 名前:デフォルトの名無しさん mailto:sage [2006/12/22(金) 00:48:23 ] コンソールアプリ無視していきなりWin32かよw
168 名前:デフォルトの名無しさん mailto:sage [2006/12/22(金) 01:26:17 ] おまいら仲良くやれよ スクリプトで妥協しとけw
169 名前:デフォルトの名無しさん [2006/12/28(木) 23:25:36 ] オッペン化粧品! OpenMPのいい参考サイトか本はアルカイダ? あぁそれとMPIにしろとか言うなヨーロッパ。
170 名前:デフォルトの名無しさん mailto:sage [2006/12/28(木) 23:46:15 ] コンパイラの自動並列化だけでがまんs 俺も教えて欲しい。 尼損で検索したら、和書は1冊しか無かった・・・
171 名前:デフォルトの名無しさん mailto:sage [2006/12/29(金) 00:00:47 ] >>169 いやさ、さっぱり自動並列化されないから、少し知恵をつけてやるかと思って。 2CPUシングルマシンで軽く行きたい。 QuadCoreを買う口実も欲しいw
172 名前:デフォルトの名無しさん mailto:sage [2006/12/29(金) 03:02:52 ] えー、かなり漠然とした質問ですがちょっとアドバイスをもらえませんか? ある元となる計算コードでは、セルの幅や高さがすべての領域で一定です。 計算する領域は長方形で、 NCX:セルの行(X方向) NCY:セルの列(Y方向) CW:列方向へのセルの幅 CH:行方向へのセルの幅 といった感じです。 また、それぞれのセルには通し番号が割り振られています。 (最初の行を小さいほうから順に1.2.3…と割り振っていって 端に行ったら次の行に移ります) ↑Y 9....... 5678 1234 →X このコードを元に、任意の列以降でセルの大きさを縦横それぞれ 半分にする(面積を1/4)にして(もちろん以降の行、列数は倍になります) 計算するプログラムを書きたいと思います。セルの大きさの変化は何段階か行われます。 (具体的にはY座標依存のある物理量と比較してセルを小さくするかどうか判別します)
173 名前:172 mailto:sage [2006/12/29(金) 03:03:23 ] (続き) しかし、元のコードには例えばセルが何行、何列目かを判別するために NY=(N-1)/NCX+1 NX=N-(NY-1)*NCX のような表現が多様されています。(Nはセルの通し番号) また、逆に行や列の指定からセル番号を判別するようなものもありますし、 座標指定に X=NY*CH みたいな事もしています。 NCX,NCY,CW,CHを配列にして、初期の大きさのセルの領域の行、列数を NCX(1)、NCY(1)に、次の大きさのセルの行、列数をNCX(2)、NCY(2)に、 というようにセルの大きさで領域を分けて考えよう、と思ったのですが、 あるセルが何番目の領域に属するかをいちいち判別するのもめんどくさいですね。 ちょっと上記の判別の式が複雑になってきてしまいます。 (ループで非常に何度も通るところなので出来るかぎり簡単にしたいです) 各セルが何行何列目に属するかと何番目の領域に属するかを 配列に格納しておけばいいかとは思いますが、 プログラムの経験が浅いこともありかなり無駄なことをしていないか不安になってきました。 既存の構造を生かしたり(置換するだけですぱっと終了とか) あまり余計なものを追加しないエレガントなやりかたってありますかね? やっぱり地道にやるしかないでしょうか?長文すみません。
174 名前:172 mailto:sage [2006/12/29(金) 03:14:28 ] すみません、 (誤)X=NY*CH (正)Y=NY*CH です。
175 名前:デフォルトの名無しさん mailto:sage [2006/12/29(金) 20:26:22 ] >>173 サイズに依存する。 小さいならいったん既存の計算式で求めたセルサイズをテーブルとして保存すればよい。 サイズが大きくてメモリーギリギリまで使っているなら、1回ごとに計算するほうがいい。 567 238 のちな形でサイトを指定してもいいなら、判別の計算式も簡単になるかもしれない。 149 計算機学科の人からはしかられるが、高速でやるにはデータ構造と処理が 切り離せないので、まぁ問題を理解し整理して自分で良く考えろw
176 名前:172 mailto:sage [2007/01/05(金) 18:17:30 ] >>175 遅レス申し訳ない。有難うございます。 やっぱりある程度地道にやるほか無さそうですね。 しこしこやってます。
177 名前:デフォルトの名無しさん mailto:sage [2007/01/08(月) 20:38:06 ] 若干Fortranから逸れますが、わかる方ご教授ください。 IntelのVisual Fortranで作成したコンソールアプリから VCで作ったLibファイルを呼び出したいです。 簡単に書くと、VCは BOOL PrintMessage() { 中略 } という関数になっています。 これをFortranから呼び出すために、 自分なりにマニュアルを読み、 以下のようにコーディングしてみました。
178 名前:デフォルトの名無しさん mailto:sage [2007/01/08(月) 20:39:25 ] INTERFACE LOGICAL FUNCTION PrintMessage() !DEC$ ATTRIBUTES STDCALL :: PrintMessage END FUNCTION END INTERFACE LOGICAL LX LX = PrintMessage() しかし、リンク時に_PrintMessageが見つかりません、と リンクエラーが出ます。 解決方法はあるでしょうか? なお、VCから上記VCを呼び出すケースもあるため、 両方Fortranで書けば?というのは無しでお願いしたいです。 一応環境としては、 Visual Studio .NET 2003 + Intel Visual Fortran v9.0 になります。 よろしくお願いします。
179 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 00:52:12 ] >>178 呼び出し規約がSTDCALLの場合、外部名はデフォルトですべて小文字と解釈されてしまうので 大文字・小文字が混在する場合は以下の様にする !DEC$ ATTRIBUTES STDCALL, DECORATE, ALIAS: 'PrintMessage' :: PrintMessage C側の PrintMessage() 関数も __stdcall でコンパイルされている必要がある。 C++の場合は extern "C" も必要。 また、IVFではLOGICALの内部表現(整数値)が奇数のとき真、偶数のとき偽となるので 他言語の関数とLOGICALを受け渡しする場合は注意すること。
180 名前:178 mailto:sage [2007/01/09(火) 21:34:40 ] >>179 レスありがとうございます。 なるほど・・。 F側の大文字小文字対策はマニュアルに書いてありましたが、 いろいろ調整しても結果が同じだったので関係ないと思ってました。 C側の対策は全く見えてませんでした^^ 正直Cはド素人なので上記のようにいわれてすぐに対応できませんが 参考にして調べてみます! ありがとうございました。
181 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 23:27:06 ] >>180 IntelFortranのマニュアル見るとちまちまと書いてあるよ。 DECORATE修飾子が新設されたので、DEC時代に場合分けして書いていたのが すっきりしてうれしい。
182 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 19:42:57 ] >>180 ATTRIBUTES STDCALL, ... ではなく ATTRIBUTES C, ... を使えばC言語の方はいじらなくてもおk。