2016-09-12 12 views
0

このコードを実行して実行するにはどうすればよいですか?たとえば10x10の配列が必要な場合。 端末にgfortran hehe.f90 -o heheを試しましたが、エラーメッセージが表示されます。私のファイルが呼ばれる私が手hehe.f90単純な関数をコンパイルすると、未定義のシンボル "_main"が発生します

エラーメッセージは次のとおりです。

Undefined symbols for architecture x86_64: 
    "_main", referenced from: 
    implicit entry/start for main executable 
ld: symbol(s) not found for architecture x86_64 
collect2: error: ld returned 1 exit status 

私のコードは次のとおりです。私は気付いてい物事の

function test(n) 

!input 
integer :: n 


!output 
integer :: arraytest(n,n) 


!local 
integer :: i,j 


arraytest=0.0d0 

do i=1,n 
    do j=1,n 

arraytest(i,j)=i*i 

end do 

end do 



end function test 
+1

あなたの投稿にエラーメッセージを追加してください。それはあなたが答えを得る機会を増やします(私は 'gfortran'を使用しませんが、他の人は助けることができます)。 –

+0

'n'は10に初期化されません。10の定数に' integer、parameter :: n = 10'という宣言を追加します。 – ja72

+0

また、静的配列(サイズは事前定義済み)を使用するかどうかを決定する必要があります。プログラムが実行されるときにサイズが決定される割り振り可能な配列。 – ja72

答えて

1

カップル。

  1. これはプログラムではなく機能です。スクリプトを開始する必要がありますPROGRAM <programname>

  2. プログラムを開始した後、インターフェイスなどの複雑さを避けるために、IMPLICIT NONEを追加する必要があります。あなたがしなければならない絶対的な最小値があるので、

    program <programname> 
    
    implicit none 
    
    <programbody> 
    
    stop 
    
    contains 
    
    function <functionname> (<variables>) result (<variable>) 
    
    end function <functionname> 
    
    subroutine <subroutinename> (<variables>) 
    
    end subroutine (<subroutinename>) 
    
    end program <programname> 
    
1

あなたはサブルーチンとしてtest(n)宣言します - あなたがプログラム本体で定義された関数やサブルーチンを持っているしたい場合は

  • この構造例に従います、プログラム内から呼び出すこのようなものにする:

    program hehe 
        implicit none 
        call test(10) 
    contains 
        subroutine test(n) 
         implicit none 
         . 
         . 
         . 
        end subroutine test 
    end program hehe 
    

    しかし、これはあなたの問題の終わりではありません:これは形状(10,10)を作成することになりますが配列uと呼ばれ、値を入力すると、サブルーチンの終わりに達するとすぐに再びそれを忘れるでしょう。

    あなたがuを維持したい場合は、あなたがもう少し関与取得する必要があります:

    program hehe 
        implicit none 
        integer, parameter :: n = 10 
        integer :: u(n, n) 
        call test(n, u) 
    contains 
        subroutine test(n, u) 
         implicit none 
         integer, intent(in) :: n 
         integer, intent(out) :: u(n, n) 
         < populate u > 
        end subroutine test 
    end program hehe 
    

    あなたはまだuで何もしていないので、どのコンパイラが密かに不必要に捨てるということは可能ですuの計算ですが、たとえば印刷する場合は、期待どおりの処理を行う必要があります。

    また、機能を使用できます。

    program hehe 
        implicit none 
        integer, parameter :: n = 10 
        integer :: u(n, n) 
        u = test(n) 
    contains 
        function test(n) result(v) 
         implicit none 
         integer, intent(in) :: n 
         integer :: v(n, n) 
         < populate v > 
        end function test 
    end program hehe 
    

    (私は2人の変数名が同じである必要はありませんことを示すための機能でvを使用しましたtest(n)は、2次元配列を返します、それを保存するものはあなた次第です)

    完全性のために含めるオプションもありますが、使用しないことをお勧めします。手順(サブルーチンと関数の両方)は、 containsセクションは、新しい変数がexpでない限り、プログラムの変数にアクセスできますそれは何かがうまくいかない場合は理解する混乱があるので、私はこれが好きではない

    program hehe 
        implicit none 
        integer, parameter :: n = 10 
        integer :: u(n, n) 
        call test() 
        write(*, '(10I6)') u 
    contains 
        subroutine test() 
         implicit none 
         integer :: i, j ! n and u not declared here, taken from program. 
         u = reshape((/((100*i + j, i = 1, n), j = 1, n)/), (/n, n/)) 
        end subroutine test 
    end program hehe 
    

    理由:これはあまりにも動作しますのでlicitly、同じ名前で宣言されました。ただちに「uはどこに変わったのですか?あなたは基本的にどこでも見なければなりません。

  • 関連する問題