2016-05-28 10 views
0

C/C++の(void)var;と同様の特定の変数に対してFortranで "未使用の仮引数"警告を抑制する移植可能な方法はありますか?Fortranで "未使用の仮引数"警告を抑制する移植可能な方法


(Vladimir Fからの要求による)動機付けの例。ストラテジパターン、GoFの例、さまざまな改行方法、不要な詳細は省略されています。

module linebreaking 

    type, abstract :: linebreaking_compositor 
    contains 
    procedure(linebreaking_compositor_compose), deferred, pass(this) :: compose 
    end type 

    abstract interface 
    subroutine linebreaking_compositor_compose(this) 
     import linebreaking_compositor 
     class(linebreaking_compositor), intent(in) :: this  
    end subroutine linebreaking_compositor_compose 
    end interface 

    type, extends(linebreaking_compositor) :: linebreaking_simple_compositor 
    contains 
    procedure, pass(this) :: compose => linebreaking_simple_compositor_compose 
    end type linebreaking_simple_compositor 

    type, extends(linebreaking_compositor) :: linebreaking_tex_compositor 
    contains 
    procedure, pass(this) :: compose => linebreaking_tex_compositor_compose 
    end type linebreaking_tex_compositor 

    type, extends(linebreaking_compositor) :: linebreaking_array_compositor 
    private 
    integer :: interval 
    contains 
    procedure, pass(this) :: compose => linebreaking_array_compositor_compose 
    end type linebreaking_array_compositor 

contains 

    subroutine linebreaking_simple_compositor_compose(this) 
    class(linebreaking_simple_compositor), intent(in) :: this 
    print *, "Composing using a simple compositor." 
    end subroutine linebreaking_simple_compositor_compose 

    subroutine linebreaking_tex_compositor_compose(this) 
    class(linebreaking_tex_compositor), intent(in) :: this 
    print *, "Composing using a TeX compositor." 
    end subroutine linebreaking_tex_compositor_compose 

    subroutine linebreaking_array_compositor_compose(this) 
    class(linebreaking_array_compositor), intent(in) :: this 
    print *, "Composing using an array compositor with interval", this%interval, "." 
    end subroutine linebreaking_array_compositor_compose 

end module linebreaking 

あなたが見ることができるように渡されたオブジェクトの仮引数thislinebreaking_array_compositorcompose方法で必要とされるが、他の二つのコンポジターのと同じ方法で使用されていません。 GFortranは、thisが使用されていないと不満を持ち、特定のファイルに対して特定のルール(例えば、-Wno-unused-dummy-argument)を設定することによってビルドプロセスを複雑にしたくありません。

+1

あなたはあなたが何かを説明する必要があります。なぜ警告を無効にしないのですか? (GCC '-Wno-unused-dummy-argument'の中で) –

+0

質問は、何か役に立たない警告を避けるために、完全に正しいコードを難読化して障害を起こすのはなぜですか? –

+0

心配しないで、私は何をしているのか知っています。 :D要するに、生産コードを難読化することではない。むしろ、私は単純なOOPショーケースをたくさん持っています。その単純さのために、この引数を使用しない(単に何かを印刷する)渡されたオブジェクトの仮引数でタイプバインドされたプロシージャが時折あることがあります。私は単純に引数を取り除くことはできません。なぜなら、それが使用されないプロシージャが親タイプのプロシージャを上書きし、この引数が必要な他の派生型はほとんどないからです。 – Wildcat

答えて

2

選択された未使用の仮引数に関する警告を無効にするには、おそらくダミー割り当て、IFテスト、アドレスの取得など、何もしない操作を行う必要があります。そのようなアプローチとして、どのように

#define nop(x) associate(x => x); end associate 

と私のコンピュータ上で

subroutine linebreaking_simple_compositor_compose(this) 
    class(linebreaking_simple_compositor), intent(in) :: this 
    nop(this) 
    print *, "Composing using a simple compositor." 
    end subroutine linebreaking_simple_compositor_compose 

としてこれを使用してのようなマクロの定義について、のifort-14とのgfortran> = 4.8と警告を与えていない、この使用法を受け入れました - 警告または-Wall。何ASSOCIATEサポートはまだありませんので、一方、SunのFORTRAN 8.7は、(!私は本当にそれは後者をサポートすることを願っています)...これを受け入れなかった

小さなテストコードは以下に添付されています

module mymod 
    implicit none 
    type T 
     integer :: n 
    endtype 
contains 
    subroutine mysub(this) 
     class(T) :: this 
     nop(this) 
    endsubroutine 

    subroutine mysub2(ptr) 
     type(T), pointer :: ptr 
     nop(ptr) 
    endsubroutine 
end 

program main 
    use mymod 
    type(T) :: a 
    type(T), pointer :: p 
    call mysub(a) 
    call mysub2(p) 
endprogram 
+0

これはまだこれがいくつかのチェックを不愉快にさせるかもしれないことを恐れる。 '-O0 -fsanitize = undefined'を試してみましたか?これはIntelフォーラムのOPのリンクに@IanHが示すものと非常によく似ています。しかし、いくつかの小さな違いがあり、それはより良い動作をする可能性があります。 –

+0

こんにちは、上記のオプションを試したところ、gfort-5.2と6.0の両方が満足しているようです。 – roygvib

+0

はい、Solaris Studio 12.4は私が使用しているものです(私の紛らわしい使い方には申し訳ありませんが)。 "Sunコンパイラ")。そして、私は[F2003 status](http://fortranwiki.org/fortran/show/Fortran+2003+status)にチェックしました。これは、アソシエートがまだサポートされていないとも言います...近い将来サポートされることを願っています。例えば、派生した型のより深いコンポーネントを取得するのに便利です(宣言なし)。 – roygvib

3

私はこの問題に対する完全に満足のいく解決法を持っていません。

シンプルなソース構文を使用して、適合しないコードを使用していない仮引数を不適合コードに誤って変換しないように注意する必要があります。私が経験したことは、これが間違っていることが容易であることです。治癒の費用が病気の費用を超えないように注意してください。最近は、コンパイラの出力にある警告を無視していることがよくあります。非ポインタについては

、非割付け、 -

(内のコードはもはや標準準拠であることを私の視点から、プリプロセッサの使用は、実際の警告のそれよりもはるかに大きなコストが付属しています。)私が知っているintrinsic型のINTENT(IN)のような仮引数の定義は、IF (arg /= 0) CONTINUEのようなパターンを使います。 LOGICALの比較を削除するには、CHARACTERにLEN(arg) /= 0を使用してください。

派生型の非ポインタ、非割り当て、非随意、インテント(イン)ダミー引数の場合、条件式は派生型に固有でなければならない - おそらく、テスト可能なイントリンシック型のポインタコンポーネント。場合によっては、そうでなければ空の派生型にそのようなコンポーネントを明示的に追加しました。

オプションの仮引数については、引数の有無をテストしてください。関連付けステータスを定義していることがわかっているポインタ仮引数については、関連付けステータスをテストします。割り当て可能な引数の場合は、割り当てステータスをテストします。

上記のすべてのケースでは、IF文のアクションステートメントとしてCONTINUEを使用すると、読者や何らかの種類のテキスト検索パターンをソースで識別するのが簡単です。最適化を有効にしてコンパイルする場合、妥当な最適化コンパイラは、そうでなければ無意味なテストを完全に排除する可能性があります。

INTENT(OUT)のような引数を定義しなければ、プログラミングエラーを示唆していません。実際の引数は常に定義可能です(!)。おそらくダミー値で引数を定義するだけです。同様に、引数の定義状態(またはポインタ引数のポインタ関連状態)が定義されていない状況も、潜在的なコーディング/コード設計の問題を示唆しています。コール。

関連する問題