我是Fortran 77中的一個虛擬器,並且一直是C++編碼器,但我必須修改幾年前的代碼... 我想創建一個可變大小的字符串數組,並且我無法在網上找到如何執行這在Fortran 77. 理想情況下,它應該是兩個維度變量的數組,但如果它不可能,我可以修復的字符串的長度,但我需要有可變數量的字符串。Fortran 77可變大小的字符串數組?
我嘗試這樣做:
CHARACTER*32 STR1*(VAR1)
...
WRITE(6,*) STR1(10)
但是,這並不工作...
我是Fortran 77中的一個虛擬器,並且一直是C++編碼器,但我必須修改幾年前的代碼... 我想創建一個可變大小的字符串數組,並且我無法在網上找到如何執行這在Fortran 77. 理想情況下,它應該是兩個維度變量的數組,但如果它不可能,我可以修復的字符串的長度,但我需要有可變數量的字符串。Fortran 77可變大小的字符串數組?
我嘗試這樣做:
CHARACTER*32 STR1*(VAR1)
...
WRITE(6,*) STR1(10)
但是,這並不工作...
顯然FORTRAN 77不支持動態內存分配。 您可以嘗試在c程序中分配內存並將結果傳遞迴FORTRAN例程。
如這裏做 http://owen.sj.ca.us/~rk/howto/FandC/FandC.mem.html
或者更明確 - 使用某種的互操作的調用C方法
從FORTRAN。
Unix的便攜式的Fortran-77編譯器(「F77」)被寫入幾乎完全 中C.編譯器的第二遍是 使用的C語言編譯器的相同,並且最「F77」庫例程僅僅接口 到相應的C庫例程。但是,由於Fortran不支持像C中那樣的數據結構,因此可能無法利用'curses'庫提供的所有功能。用'curses'操縱窗戶特別困難。如果 您有興趣使用涉及數據結構的例程,則您應該使用C而不是Fortran。
要從Fortran程序調用C例程,您必須編寫一些 C代碼。 Fortran通過引用或地址傳遞參數,因此函數必須準備好接受該變量作爲地址。這個 意味着你將不得不用C編寫函數,這些函數是從 Fortran中調用的,它在調用函數庫 函數之前正確設置參數。示意圖中,這可能類似於:
以例程的名義注意下劃線(_)。
在C源文件:
foo_(巴)/ *注*下劃線/ INT 巴; {:}
在Fortran源文件:/注變量 由地址*/
傳遞
呼叫FOO(巴茲)/ *假定 「巴茲」 是整數。 */{:}
下劃線非常重要,因爲Fortran使用該字符來保持 的符號直。如果您在RS6000上編譯,這不是 的默認行爲,但使用 RS6000上的-qextname選項進行編譯將使其與其他平臺完全相同。
調用C從Fortran語言
注意下面的Fortran例子,它是如何調用C例程:
調用initscr的()調用clear()。 。 。調用move(x,y)。 。 。請致電 refresh()call endwin()end
...其中x和y是指定新座標的整數。
從Fortran語言
如果你調用「詛咒」常規「的舉動()」,調用詛咒你可能會做 是這樣的:
的C源文件包含接口程序的「詛咒 庫函數‘移動()’,和其他C函數沿着 提供接口到其它一些‘詛咒’功能:
的#include
initscr_(){initscr(); }
clear_(){clear(); }
move_(x,y)int * x,y;/這些是指針*/{move(* x, * y); }
refresh_(){refresh(); }
endwin_(){endwin(); }
例程通過使用這些命令編譯:
立方厘米-c curses.c F77 test.f curses.o -lcurses -ltermcap
如果使用定義的宏在/ usr /包括您的 Fortran文件中的/curses.h會被警告,它們將採用C 語言的約定。請注意,這可能會影響您在Fortran中使用 時獲得的結果。
從 https://engineering.purdue.edu/ECN/Support/KB/Docs/CallingCFromFortran
幫助? http://stackoverflow.com/questions/725465/array-of-strings-in-fortran-77或http://stackoverflow.com/questions/3852790/fortran-interface-to-call-ac-function-that-返回指針 – Alex
我在發佈之前看到過那些人。第一個是固定的長度,另一個是有點不相關的,但無論如何感謝! – Andrew