Digital Fortran v5.0でC言語の様に構造体
あるいは配列をメモリーに入れて構造体を変化させずに
計算する方法は有りませんか?

このQ&Aに関連する最新のQ&A

A 回答 (1件)

「構造体を変化させずに」の意味が取れないので、外しているかもしれませんが、


Fortran で構造体を扱うには、二つのアプローチがあります。

・言語として構造体がある Fortran90 を使う
・Fortran77 であれば、EQUIVALENCE 文を使う

EQUIVALENCE 文は、こんな感じで使います。

CHAR*10 WORK
INTEGER*2 I2
INTEGER*4 I4
REAL*4 R4
EQUIVALENCE (WORK(1:2), I2)
EQUIVALENCE (WORK(3:6), I4)
EQUIVALENCE (WORK(7:10), R4)

CHAR*10 DAT(10)

C DAT に、データが読み込まれているとして

DO 10 I = 1, 10
WORK = DAT(I)
WRITE(*,*) I2, I4, R4
10 CONTINUE
    • good
    • 0
この回答へのお礼

丁寧な回答有難うございます。
たいへん助かります。

お礼日時:2001/12/06 13:30

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QFortran90/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を使ったプログラミングを勉強しています。

以下の文が大学のPCに入っているコンパイラでは問題なくコンパイルでき実行できるのですが、家のPCだとコンパイルすることが出来ません(以下の文でエラーが出ます)
大学のPCの開発環境はFujitsu-FORTRANだと思います(^ ^;
家のPCはSalford FTN77 Personal Edition CompilerとCPad for Salford FTN77を組み合わせて使用しています

なぜエラーがでるのか自分なりに考えた結果、Fortran90/Fortran95のプログラムをFortran77のコンパイラでコン...続きを読む

Aベストアンサー

action='write'を削除してみては?
8番にREADを使わなければいいだけの話です。
http://docs.hp.com/ja/B3908-90007/ch10s65.html#id21163286

Fortranはコンパイラ毎に独自の拡張が相当されてますから、移植する際にはどの拡張が使えるのか把握する必要があります。
使えない場合はコンパイルエラーが返ってくるのですぐにわかりますけど。
http://www.cc.nao.ac.jp/vppman/HTML/japan/langFort/fvp11/fvp00079.htm

参考URL:http://docs.hp.com/ja/B3908-90007/ch10s65.html#id21163286

QC#で構造体配列

C#で構造体配列の操作練習?をしているのですが
using System;
using System.Collections.Generic;
using System.Text;

namespace test1
{
public struct Data
{
public string name; // 名前
public uint value; // 値
}

class read
{
Data[] human = new Data[300];

public static string idSearch()
{
for (int i = 0; i < 300; i++)
{
if (test1.read.human[i].value == 25)
return test1.read.human[i].name;
}
}
}
}
だと
エラー CS0120: 静的でないフィールド、メソッド、またはプロパティ 'test1.read.human' で、オブジェクト参照が必要です。
と言うエラーが出るのですが、どうしてでしょうか?

C#で構造体配列の操作練習?をしているのですが
using System;
using System.Collections.Generic;
using System.Text;

namespace test1
{
public struct Data
{
public string name; // 名前
public uint value; // 値
}

class read
{
Data[] human = new Data[300];

public static string idSearch()
{
for (int i = 0; i < 300; i++)
{
if (test1.read.human[i].value =...続きを読む

Aベストアンサー

>read型のオブジェクトとはどういう意味ですか?

自分で定義しているreadクラスのインスタンスのこと

>ついでにエラーにある「オブジェクト参照」ってのもいまいち分かりません

read型のオブジェクトを生成していないから、参照するオブジェクトが必要ですと言われてる


なんにも勉強しないでコード入力の練習をしても、時間と労力の無駄だし、あまりにも初歩的な質問をしても、回答してくれた人から呆れられて、相手にしてもらえなくなるだけだと思う。本やへ行って自分にあいそうなC#の入門書を買って、クラスとオブジェクトの関係を理解するとこから始めたらいいんじゃなかろうか?

Q【C言語】配列の中に配列を入れたい

const double A[2] = {1.0, 2.0};

double B[2][3] = {
{ A[0], A[1], 0.0 },
{ 0.0, 0.0, 0.0 }};

このようなプログラムをコンパイルしようとすると、
初期化子の要素が定数ではありません
というエラーが出てしまい困っています。どのように解決したらいいでしょうか。
OSはlinux、コンパイラgccです。

Aベストアンサー

>配列の中に配列を入れたい
何か誤解を招く表現ですね。
「配列の中のある要素の初期値として、別の配列の要素を指定したい。」と言う意味でしょうか?
配列の初期値ですが、変数の記憶域が静的な場合は配列に限らず、定数しか指定できません。
動的領域の場合は変数の内容を初期値にすることは論理的に可能ですが、コンパイラによっては
静的な場合と一緒にしてしまっている場合があります。恐らく後者なのだと思います。
しょうがないので、配列生成後に代入するしかないでしょう。そもそも動的領域に初期値と
いうのは本来できないことなのです。実際に生成されるコードは変数の確保→値の代入の順に
なっており、明示的にソースコードを書くか書かないかの違いしかありません。

QObjective-Cで構造体を配列や辞書に登録するにはどうしたら良い

Objective-Cで構造体を配列や辞書に登録するにはどうしたら良いですか?

構造体のままだと、NSArrayやNSDictionaryに登録できないので、
オブジェクトにしたいです。

例えば、
typedef struct {
long longtimeValue;
longtimeScale;
longflags;
} QTTime;

のような構造体から、オブジェクト(hoge)を作って、

NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:hoge, @"hoge",nil];

のように辞書に突っ込みたいんです。

以上、宜しくお願いいたします。

Aベストアンサー

http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/NumbersandValues/Articles/Values.html#//apple_ref/doc/uid/20000174-BAJJHDEG

すでにご覧になっているのかもしれませんが……

Qfortran 配列宣言

以下のプログラムの中でeth(n), eph(n)は、配列なのですが、配列宣言はどのようにしたらよいのでしょうか?doループでnが決まるのでどのように配列宣言したらよいかわかりません。いろいろと試してはみたのですがコンパイルの際エラーがでてしまいます。わかる方がいらっしゃったら教えて下さい。よろしくお願いします。
subroutine far_output
use consts
use fdtd
implicit none

integer :: n, i, td
real(8) :: s
real(8) :: theta, phi
real(8) :: sx, sy, sz, px, py
real(8) :: wth, wph, uth, uph
real(8) :: eth(1000), eph(1000)

open(10,file="far_field.dat")

! s = pi/180.0d0
phi = 0.0d0
! do i = 0, 180
! td = i
! theta = s*td
theta = pi/3.0d0
sx = cos(theta)*cos(phi)
sy = cos(theta)*sin(phi)
sz = -sin(theta)
px = -sin(phi)
py = cos(phi)
do n = 1, ntime
wth = wx(l,n)*dx+wy(l,n)*sy+wz(l,n)*sz
wph = wx(l,n)*px+wy(l,n)*py
uth = ux(l,n)*sx+uy(l,n)*sy+uz(l,n)*sz
uph = ux(l,n)*px+uy(l,n)*py
eth(n) = -z0*wth-uph
eph(n) = -z0*wph+uth

write(10,*) eth, eph
enddo
! enddo

close(10)

return
end subroutine

以下のプログラムの中でeth(n), eph(n)は、配列なのですが、配列宣言はどのようにしたらよいのでしょうか?doループでnが決まるのでどのように配列宣言したらよいかわかりません。いろいろと試してはみたのですがコンパイルの際エラーがでてしまいます。わかる方がいらっしゃったら教えて下さい。よろしくお願いします。
subroutine far_output
use consts
use fdtd
implicit none

integer :: n, i, td
real(8) :: s
real(8) :: theta, phi
real(8) :: sx, sy, sz, px, py
real(8) :: ...続きを読む

Aベストアンサー

「doループでnが決まる」ってどういう意味? 普通に考えると「何らかの do ループを実行した結果, 最終的に n が求まる」ということになりそうだけど, このプログラムでは「n をループ変数にした do構文」があるだけだよね. それを「doループでnが決まる」と呼ぶのはおかしいです.
しかもその do ループでは n が 1 から ntime まで動いているだけなので, 「n」なんか無視して ntime を使って配列を定義すればいい.
本当に動的にメモリを確保したいなら allocate を使うんだけど, 少なくともこのプログラムを見た限り allocate が必要であるとは思えないなぁ.


人気Q&Aランキング

おすすめ情報