• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:宣言文)

宣言文のimplicit none宣言方法

このQ&Aのポイント
  • 宣言文のimplicit noneでの宣言方法について教えてください。
  • implicit noneを使って宣言文を宣言する方法を教えてください。
  • 宣言文をimplicit noneを使用して宣言する方法を教えてください。

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

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

なんというか, 「最初から Fortran をやりなおせ」と言いたい.... 配列の上下界は integer じゃないといかんのよ....

BOY12345
質問者

お礼

そうなんすか!? テキストにそんなこと書いてなかったです。 ありがとうございます♪

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

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

暗黙の規則を再確認することを強くお勧めします. なんで maxX とか maxY を real*8 で宣言するかなぁ....

BOY12345
質問者

補足

real*8はintegerを包括してると考えているので、こっちの方が融通きくのかなと思い、宣言してます。 厳格に、整数だから、integerで宣言しとくのがベターなんでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

> INTRINSIC mod > > エラーで > Error: The intrinsic data types of the arguments must be the same. [MOD] mod関数を呼び出しているところのソースを見せてください。 Fortranであることを、できれば明記していただきたいところです。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

最も簡単なのは, parameter 文の前にでも適切な型宣言を入れておくこと.

BOY12345
質問者

補足

現在、なんとかここまでいきました。 implicit none real*8 pi,dx,dy,dt,Te,gamma,alpha,a_const,valK_const real*8 e_bar,theta0,delta,j_num,val_tau,nwrite real*8 nstepT,nfile,ix,iy real*8 ic,istep real*8 maxX,maxY,xS,xE,yS,yE,numX,numY,nstep * parameter (maxX=500,maxY=500) parameter (xS=1.0d0,xE=1.0d0) parameter (yS=0.0d0,yE=1.0d0) parameter (numX=400,numY=400) parameter (nstepT=5000) parameter (nfile=200) * real*8 Tarr_M(0:maxX,0:maxY), Tarr_P(0:maxX,0:maxY) real*8 Earr_M(0:maxX,0:maxY),EParr_M(0:maxX,0:maxY) real*8 Parr_M(0:maxX,0:maxY), Parr_P(0:maxX,0:maxY) real*8 Vect_P(0:maxX,0:maxY,1:3) * real*8 P_work(0:maxY),Q_work(0:maxY),Tarr_W(0:maxX,0:maxY) * character*15 ofile LOGICAL*1 character*1 ihun,isen,iten,ione INTRINSIC mod エラーで Error: The intrinsic data types of the arguments must be the same. [MOD] と出てきます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • なぜ計算結果が出力されないのか・・・

    エラーも何もないプログラムなのに、計算されません。 答えは、401.0になるはずなのに・・ 理由がわかりません。 コード載せておくので、どなたかお願いします。 implicit real*8 (a-h,o-z) Parr_M=1.0d0 Temp=1.0d0 Mc=val_Mc (p,M_C_gamma,M_C_alpha) x=Mc+1.0d0 write(6,10) x 10 format(1H ,F9.3) end ーーーーーーーーーーーーーー real*8 function val_p (Parr_M) implicit real*8 (a-h,o-z) val_p=Parr_M(ix,iy)**3 return end ーーーーーーーーーーーーーー real*8 function val_Mc (p,M_C_gamma,M_C_alpha) implicit real*8 (a-h,o-z) val_M_C_alpha=M_C_alpha(Temp) val_M_C_gamma=M_C_gamma(Temp) p=val_p (Parr_M) * val1=val_M_C_alpha val2=val_M_C_gamma*p val=val1*val2 * val_Mc=val return end ーーーーーーーーーーーーーーー real*8 function M_C_alpha(Temp) implicit real*8 (a-h,o-z) M_C_alpha=Temp/2.0d0 return end ーーーーーーーーーーーーーーー real*8 function M_C_gamma(Temp) implicit real*8 (a-h,o-z) M_C_gamma=Temp return end ーーーーーーーーーーーーーーー 以上をはしらせると、 『forrtl: severe (157):Program Exception - access violation』 と出てきます。謎です。結果もちゃんと出る様に、F9.3で入力してるはずだが・・

  • 線形補間法プログラム(C++)

    C++言語で線形補間法のプログラムを組んで実行しているのですが、どしてもうまくいきません。ただ2倍の画像を作っているだけなのですが・・・。 以下プログラムを載せます、おおよその場所はわかるのですがどうすれば通るのかわかりません。どう直したらよいのか分かる方がいましたらご教授お願いします。 ※bmp[0]:現画像 pic:bmp[0]の縦横2倍の画像 // 線形補間法 // int zx = 2; int zy = 2; int i,j,m,n; float x,y,p,q; int xs = bmp[0]->Width/2; int ys = bmp[0]->Height/2; int d; for(i = -ys; i < ys; i++){ for(j = -xs; j < xs; j++){ y = i/zy; x = j/zx; if(y > 0){ m = (int)y; }else{ m = (int)(y-1);} if(x > 0){ n = (int)x; }else{ n = (int)(x-1);} q = y - m; p = x - n; if(q == 1){q = 0; m = m + 1;} if(p == 1){p = 0; n = n + 1;} if((m >= -ys)&&(m < ys)&&(n >= -xs)&&(n < xs)){ d = (int)((1.0 - q) * (1.0 - p) * (bmp[0]->GetPixel( m + ys, n + xs)) //おそらくこの辺に問題があるかと思われます。 + p * (bmp[0]->GetPixel( m +ys, n + xs)) + q * (1.0 - p) * (bmp[0]->GetPixel(m + 1 + ys, n + xs)) + p * (bmp[0]->GetPixel(m + 1 + ys, n + 1 + xs))); }else{ d = 0; } if(d < 0){d = 0;} if(d > 255){d = 255;} pic->SetPixel(i + ys, j + xs) = d; } } pictureBox2->Image = pic; }

  • 配列が定義されていない??

    今日1日を費やして、fortranの勉強をしました。 まだまだ勉強始めたばかりで、何かと苦労しています。 理解しようと、本にPCとにらめっこしています。 本日の問題は・・以下です。 問題と思われる箇所載せておきます。 subroutine Uno(ya,Mc,nablaMc, & maxX,maxY,numX,numY,dt,dx,dy, & v,v_P,nablaya) implicit real*8 (a-h,o-z) * real*8 v(0:maxX,0:maxY),v_P(0:maxX,0:maxY) * CDK write(6,1000) dx,dy,dt * ic=0 1 continue ic=ic+1 * do ix=1,numX-1 do iy=1,numY-1 C---- nablayaを定義------------------------------------ ★ nablaya=v(ix,iy+1)-v(ix,iy-1))/*dy C ------------------------------------------------------ A=v(ix,iy)*ya+nablaya*v(ix,iy) B=v(ix,iy)*ya C------------------------------------------------------- if (iy.eq.1) then ai=2.0d0*dt*B*(1.0d0/(dx*dx)+1.0d0/(dy*dy) bi=dt*(A/(4.0d0*dy)+B/(2.0d0*dy*dy)) else ai=2.0d0*dt*B+A/(dy*dy) bi=A/(4.0d0*dy)+B/(2.0d0*dy*dy) ・・ といった感じのルーチンを書きました。 そしたら、 『Error: The shapes of the array expressions do not conform. [NABLAYA]』と指摘され、その場所が上記★の行でした。 何がいけないのでしょうか!? 教えて下さい。

  • fortran77

    プログラムを作っているのですが、 implicit noneを付けた場合の 関数f(x、y)の宣言の仕方がわかりません。 ググッていくつか出てきたのを試してみたのですが、error文が出てきて、 実行してもうまくいきません。 real x,y,f(x,y) real x,y function f(x,y) real function f(x,y) などです。 implicit noneを付けないとうまくいくのですが・・・・・・ 今後のためによろしくお願いします。

  • fortran 渡す値について

    fortranの質問です。 integer ix,iy,maxX,maxY で宣言しており、 do istep=1,100 call B_DIF(☆) do ix=0,maxX do iy=0,maxY B_M(ix,iy)=B_P(ix,iy) end do end do end do のルーチンで悩んでいます。 B_DIFは B_P(ix,iy)=K(係数のことです)*B_M(ix,iy)+B_M(ix+1,iy)-B_M(ix-1,iy) といった感じのサブルーチンです。functionで表していないのは、ややこしい関数があるので、サブルーチンでまとめてメインに返すという手法をとっています。ご了承下さい。 ここで、B_P(☆)の☆には何を入れると適切に動くと思いますか? ☆に データix,iyを入れるだけで意とするB_P(ix,iy)がでてくるのか、 それとも、ix,iy,B_Mのデータを受け渡すべきか・・ 一番の問題は、 B_P(ix,iy)=K(係数のことです)*B_M(ix,iy)+B_M(ix+1,iy)-B_M(ix-1,iy) にix,iyを送ったとき、B_M(ix+1,iy)などが意図する値を吐いてくれるのかということです。 ix=1,iy=2でB_DIFのルーチンにおいて、 B_P(1,2)=K(係数のことです)*B_M(1,2)+B_M(2,2)-B_M(0,2) とパソコンが読み取ってくれるのか疑問です。 ちなみに、B_M(1,2)、B_M(2,2)、B_M(0,2)は既知の値です。 頭がこんがらがって、どうすべきかわかりません。 2次元配列の添字の継承・・ よろしくお願いします。

  • 配列を使って複数の線分を描くプログラムについて

    配列を使って複数の線分を描くプログラムについて、途中までは完成させたのですが、どうしてもわからない箇所があります。今日中に誰か回答をお願いします。 #include <stdlib.h> #include <stdlib.h> #include <stdio.h> #include <math.h> #include "inc2D.h" int *pxs,*pys,*pxe,*pye; int N; void draw_line(int xs,int ys,int xe,int ye) { // [この中は完成させました] } void polygon(N,xs,ys,xe,ye) int N; int xs[],ys[],xe[],ye[]; { /*  ここがどうしてもわかりません。for文を使った繰り返しではないかと考えて、色々試してみましたが、  エラーが出たり、表示されなかったりしてどうしても進みません。 */ void draw_line(); } void display(void) { void polygon(); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); polygon(N,pxs,pys,pxe,pye); } int main(int argc, char *argv[]) { int i; glutInit(&argc,argv); glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH); glutCreateWindow("01kc999 Tsuyoshi SAITOH"); glutReshapeWindow(wsize,wsize); glutDisplayFunc(display); glutReshapeFunc(reshape); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glClearColor(0.0,0.3,0.3,0.0); scanf("%d",&N); pxs=(int *)malloc(sizeof(int)*N); pys=(int *)malloc(sizeof(int)*N); pxe=(int *)malloc(sizeof(int)*N); pye=(int *)malloc(sizeof(int)*N); for(i=0;i<N;i++) {scanf("%d %d %d %d",&(pxs[i]),&(pys[i]),&(pxe[i]),&(pye[i]));} glutMainLoop(); return 0; }

  • 可変個引数を使った関数で文字の長さを知りたい

    可変個引数を使った引数を使って引数の文字列の長さを知りたいのですがどうすればいいのかわかりません。 DXライブラリを使って文字列の長さを測って文字をどこにおくのかを決めているため文字列の長さがわからないと困ってしまいます。 どのようにすれば可変個引数を使った引数の文字列の長さを測れますか? 大体以下のような感じで作っています。 void kai( int *x , int *y ); //文字列を改行する関数 int JC( unsigned char code ); //文字が1バイト文字 か 2バイト文字か判別する void mozi_show2( int x , int y , int xm , int yb , int color , int char_set , const char *s , ... ){   int i = 0;   int xs = 0 , ys = 0;   int m_color = color;   char One[ 2 ]; //1バイト文字格納用   char Two[ 3 ]; //2バイト文字格納用   const char* p;   va_list args;   va_start( args , s );   p = s;   while( *p != '\0' ){     switch( *p ){       case '%':         p++;         assert( *p != '\0' );         switch( *p ){           case 'd':             DrawFormatStringToHandle( x + xs , y + ys * yb , m_color , char_set , "%d" , va_arg( args , int ) );             //purintfと使い方はほぼ同じで左から文字を表示したいX座標・文字を表示したいY座標             //文字の色・文字の書式・格納用文字列・表示したいint型の数値をあらわしています             xs += 16;             /*             xs += GetDrawFormatStringWidthToHandle( char_set , "%d" , va_arg( args , int ) );             本来ならこの関数を使って文字列の長さを計る左から             文字列の書式・格納用文字列・長さを測りたいint型文字列             これを使うと別のものを計っているみたいで文字の長さがわからない             文字の長さってどうやって計るの?             */             break;           case 'f':             DrawFormatStringToHandle( x + xs , y + ys * yb , m_color , char_set , "%f" , va_arg( args , double ) );             break;           case 'c':             DrawFormatStringToHandle( x + xs , y + ys * yb , m_color , char_set , "%c" , va_arg( args , char ) );             break;           case 's':             DrawFormatStringToHandle( x + xs , y + ys * yb , m_color , char_set , "%s" , va_arg( args , const char* ) );             break;           case '%':             DrawFormatStringToHandle( x + xs , y + ys * yb , m_color , char_set , "%%" );             xs += GetDrawStringWidthToHandle( "%" , 1 , char_set );             break;         }         p++;         break;       default:         if( JC( *p ) ){           Two[ 0 ] = *p;           Two[ 1 ] = *( p + 1 );           Two[ 2 ] = '\0';           DrawStringToHandle( x + xs , y + ys * yb , Two , m_color , char_set );           xs += GetDrawStringWidthToHandle( Two , 2 , char_set );           p += 2;         }         else{           One[ 0 ] = *p;           One[ 1 ] = '\0';           DrawStringToHandle( x + xs , y + ys * yb , One , m_color , char_set );           xs += GetDrawStringWidthToHandle( One , 1 , char_set );           p++;         }         break;     }     if( xs > xm ){       kai( &xs , &ys );     }   }   va_end( args ); } void zitu_draw( void ){   char *str = "%d個 OK";   int i = 12;   mozi_show2( 100 , 100 , 300 , 15 , red_s , MG_14_0 , str , i );   //左から 文字を表示するX座標・文字を表示するY座標・文字を改行する文字列の長さ   //改行した時のY座標の縦幅・文字色・文字の書式・表示したい文字列・%dに表示したいint型の値 }

  • fortran 配列宣言

    以下のプログラムの中で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

  • 【fortran】フーリエ級数について

    こんばんは。 早速ですが、質問させて頂きます。 学校の課題で一次元熱伝導方程式のプログラムを組みなさいという課題が出たのですが、入力、出力のプログラムが上手く書けずに困っています。 自分で何回もやってみたのですが、「ループがベクトル化されました」としか出ず、どこが間違っているのかも分からない状況です。 詳しい方、教えて頂ければ幸いです。 下に自分が作成したプログラムを載せておきます。 program heat implicit none integer i, n, nmax real(8) t0, t1, d, time, a, h, p, q, an0, kn, bn, en integer, parameter :: id = 100 real(8), parameter :: pi = 3.1415926535d0 real(8), parameter :: lambda = 2.5d-6, rho = 2500.d0, c = 2.35d-7 real(8), parameter :: expmax = 50.d0 real(8) x(0:id), t(0:id) ! ! Data input part (t0,t1,d,a,time,nmax) ! t0=300.0d0 ! degrees t1=200.0d0 ! degrees d =100.0d0 ! m time=1.0 ! year time = time *365.0d0*24.0d0 ! year --> hour nmax=1000 a = 1.0d6 ! Area of rock surface [m^2] h=d/id do i=0,id x(i)=i*h t(i)=t1 end do p=0.0d0 q=0.0d0 do n=1,nmax,2 an0=4.0d0/(n*pi)*(t0-t1) kn=n*pi/d bn=lambda*kn*kn/(rho*c) if(bn*time.le.expmax) then en=exp(-bn*time) else en=0.0d0 endif do i=0,id t(i)=t(1)+an0*sin(kn*x(i))*en enddo p=p+an0*kn*en q=q+an0*kn/bn*(1.0d0-en) enddo p=lambda*a*p q=lambda*a*q open(20,file=‘output.dat’) write(20,*) ‘x(i),t(i),p,q' = ‘, ‘x(i),t(i),p,q' close(20) stop end program heat

  • 太陽黄経を正確に計算したい

    二十四節気の時刻を計算してみましたが、理科年表のようには計算できませんでした。気持ちがどうもスッキリしません。 私の計算方法を下記にまとめました。原因が分かる方、どうか教えて下さい。 JPL天文暦CD-ROM(DE200/405/406)版を”C”で読む   http://www.kotenmon.com/cal/JPL-CD.htm で公開されていた「直交座標計算ソース"test1.zip" 」を使って今年の春分を計算してみましたがうまくいきません。 理科年表で春分は 2009/3/20 20:44 となっていて、ユリウス日は2454910.988888888 と計算しました。 その値で、先のtest1.exe を使って、太陽と地球の座標を計算しました。 【太陽の座標計算】  入力値を   Julian date = 2454910.988888888   Target nr. = 11   Centre nr. = 12   Units (Km & Km/s)=1 else AU & AU/Day?2   Barycentre (Solar-sys. Barycentre)=1 else Sun?1  として   X [AU]= -0.0025423129061832891   Y [AU]= +0.0039186867578048712   Z [AU]= +0.0016761100992659754  を得ました。 【地球の座標計算】   Target nr. = 11  として(他の値は太陽と同じ)   X [AU]= -0.99850625589861797   Y [AU]= +0.0059487115778656067   Z [AU]= +0.0025604933086195618  を得ました。 【黄道直行座標への変換】  黄道傾斜 θ=23°26'21.7'' = 23.43936111 として   X = Xs   Y = Cosθ * Ys + Sinθ * Zs   Z = -Sinθ * Ys + Cosθ * Zs   の式に代入して。  太陽の黄道直行座標   Xs = -0.002542312906183   Ys = 0.004262043089855   Zs = -0.000020968330396  地球の黄道直行座標   Xe = -0.998506255898617   Ye = 0.006476341890359   Ze = -0.000017062804465 【黄経の計算】   arctan( (Ys-Ye) / (Xs - Xe) ) = 179.872616 度 となり、180度に対してかなり違っています。 分単位くらいの精度で計算するとしたら、180±0.00001 くらいの精度が必要になりますが、かなり違います。 何かとんでもない間違いをしているのでしょうか。 DE405を使った別の方法でも結構です。 分かる方がいらっしゃったらご教授願います。