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と関連する良く見られている質問

Q構造体のマスクというメンバ

一般的な構造体についての質問です。
例えば CHOOSECOLOR 構造体のようにメンバにマスクを持つ構造体があって、
その構造体に値を代入する関数を使うには、CHOOSECOLOR 構造体のマスクを
設定し、そのマスクで有効にしたメンバだけが値を入れられるんですよね?
マスクを持つ構造体というのは、それに値を入れる関数を使う前に
マスクを指定してから、その構造体のアドレスを関数の引数にセット
するんですよね?
マスクは無視されて、それ以外の全てのメンバに値が入るというわけでは
ないですよね?

Aベストアンサー

CHOOSECOLORにマスクは無いと思いますよ。
CHARFORMATですか?CHARFORMATならEM_GETCHARFORMATでbCharSetメンバだけに値を得ることになっているからEM_GETCHARFORMATするときのマスクは参照されません。
その他、SCROLLINFOとか普通のやつはマスクで有効にしたメンバだけがGet*()で得られるメンバです。

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

Q条件によって構造体のリスト構造を変えたい

こんにちは。

C(C++)で構造体を使っているのですが、まだまだ未熟で使い方が良く分かりません。以下のことを実施したいのですが、やり方をどなたかご教授頂けませんでしょうか。よろしくお願いします。

条件によって構造体のリスト構造を変えたいのです。
例えば、
条件1の場合は
構造体a→構造体b

条件2の場合は、
構造体a→構造体c

上記のようにです。そして構造体のルートから参照先をたどっていくことで、配下の構造体の値を取得したいのです。

文法上許されないようですが、イメージとしては、
struct a aa;
aa.c->b.aa

ということをしたいのです。よろしくお願いします。

struct a{
char a;
char b;
struct c;
:
};

struct b{
char aa;
:
};

struct c{
:
:
};

Aベストアンサー

一番手っ取り早いのは、構造体aの中に、構造体bと構造体cの両方のポインタを持たせておいて、使わない側にはNULLを入れるといった方法でしょうか。

struct a
{
 /* .bまたは.cのNULLではない方が有効 */
 struct b *b;
 struct c *c;
};

他には、構造体aと構造体bの最初のフィールドの型を同じにしておいて、そこにaかbかを判別できる値を格納するようにし、構造体aと構造体bの共用体へのポインタを構造体aに持たせるといった方法です。

struct b
{
 char tag; /* 'b'を格納 */
 ...
};

struct c
{
 char tag; /* 'c'を格納 */
 ...
};

struct a
{
 union
 {
  struct b;
  struct c;
 } *p; /* .p->b.tagが'b'なら構造体b, 'c'なら構造体c */
};

好みかもしれませんが、私なら多分前者を使います。

一番手っ取り早いのは、構造体aの中に、構造体bと構造体cの両方のポインタを持たせておいて、使わない側にはNULLを入れるといった方法でしょうか。

struct a
{
 /* .bまたは.cのNULLではない方が有効 */
 struct b *b;
 struct c *c;
};

他には、構造体aと構造体bの最初のフィールドの型を同じにしておいて、そこにaかbかを判別できる値を格納するようにし、構造体aと構造体bの共用体へのポインタを構造体aに持たせるといった方法です。

struct b
{
 char tag; /* 'b'を格納 */
 ...
};
...続きを読む

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構造体の宣言

下記のように構造体の宣言をした所、

struct B_PARAM test;

「`test' の領域サイズがわかりません」というエラーになってしまいました。この構造体を宣言し、値を入れていこうとしています。

ヘッダファイルに構造体の形は定義してあるのですが、
構造体の中に構造体があるからでしょうか?

またこの構造体を正しく宣言するにはどうすればいいのでしょうか?

Aベストアンサー

typedef struct _B_PARAM {
char p1;
char p2[2];
} B_PARAM;

の、_B_PARAM は、構造体の「タグ名」です。
これは、sutruct とともに使う名前です(C++ struct 無しでもOK)
ですから、この例では、struct _B_PARAM で正解です。

後ろの、B_PARAM は、typedef した名前です。

おおざっぱに言えば、
struct _B_PARAM {
char p1;
char p2[2];
}
という構造体を、B_PARAM という名前で読み替えることを宣言しています。
ですから、こちらを使うのであれば、struct 無しの
B_PARAM test; で正解です。

構造体は必ず typedef しなければならないというものではありません。

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ベストアンサー

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

Q構造体→文字列→構造体 をする方法

VB6.0の話です。

 不特定の構造体を文字列(String)に格納し、これを最初の構造体に戻す事はできませんか?

 具体的には「共有メモリを使い構造体を文字列にして格納>別ウインドウで文字列を取得して構造体に戻す」と言う事をやりたいんです。
 共有メモリに不特定の構造体をいれる方法でもいいんですが…VALIANTだとサイズが大きすぎて実用性がありませんし、違う主旨の質問をするのも良くないので回答はあくまで「構造体→文字列→構造体 をする方法」と言う事でお願いします。

Aベストアンサー

APIを使えば出来ます。

Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (cStr1 As Any, cStr2 As Any, ByVal iLen As Long)


構造体→文字列
Call CopyMemory(strB, ByVal typeA, Len(typeA))

文字列→構造体
Call CopyMemory(typeA, ByVal strB, Len(typeA))

ただし構造体のメンバに配列があると使えません(VBの配列はメモリを連続してとらない為、メモリーリークします)。

また構造体の中身は string *5 などの固定長である必要があります。

以上です。

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

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

QPGにおいて構造体や列挙型はいつ使いますか?

PGにおいて構造体や列挙型はいつ使いますか?

構造体でテーブルみたいなものに一旦入れて、個別に取り出すときに使うと思うのですが、
DBを使ってたら、構造体を使う場所がよくわかりません。

どういうプログラミング時に構造体・列挙型を使うのか教えてください。

Aベストアンサー

複数の項目を一元管理したいとか、あとで(他人が)見た時に判り易いためとか、使う理由は様々あると思います。

例えば、RPG(ゲーム)のプログラミングで、
キャラクターのパラメーターとしてはHP、MP、ちから、すばやさ、EXP等々ありますね。

これを1つの構造体として定義しておく。

主人公 AS 構造体
仲間1 AS 構造体

のようにすれば、1人1人の各パラメータを宣言する手間が省けますし、
何より見やすいですね。
呼び出すときも、主人公.HP、仲間1.HP となってれば、判り易いです。

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ランキング