我是 Fortran 77 中的一个假人,并且一直是 C++ 编码器,但我必须修改多年前的代码......我想创建一个可变大小的字符串数组,但我在网上找不到如何在 Fortran 中执行此操作77. 理想情况下,它应该是两个维度都可变的数组,但如果不可能,我可以修复字符串的长度,但我需要有可变数量的字符串。
我试过这个:
CHARACTER*32 STR1*(VAR1)
...
WRITE(6,*) STR1(10)
但这不起作用...
显然 FORTRAN 77 不支持动态内存分配。您可以尝试在 ac 程序中分配内存并将结果传递回 FORTRAN 例程。
如此处 http://owen.sj.ca.us/~rk/howto/FandC/FandC.mem.html
或者更清楚 - 使用某种互操作来调用 ac 方法
来自fortran。
Unix 可移植 Fortran-77 编译器 ('f77') 几乎完全用 C 编写。编译器的第二遍与 C 编译器使用的相同,大多数“f77”库例程只是对应 C 库例程的接口. 但是,由于 Fortran 不支持 C 中使用的数据结构,您可能无法利用“curses”库提供的所有功能。用“诅咒”操纵窗户尤其困难。如果您对使用涉及数据结构的例程感兴趣,您可能应该使用 C 而不是 Fortran。
要从 Fortran 程序调用 C 例程,您必须编写一些 C 代码。Fortran 通过引用或地址传递参数,因此 C 函数必须准备好接受变量作为地址。这意味着您必须用 C 语言编写从 Fortran 调用的函数,在调用库函数之前正确设置参数。从示意图上看,这可能类似于:
注意例程名称中的下划线 (_)。
在 C 源文件中:
foo_(bar) /* 注意下划线 */ int bar; /注意变量是按地址传递的 */
{ : }
在 Fortran 源文件中:
call foo(baz) /* 假设“baz”是一个整数。*/ { : }
下划线很重要,因为 Fortran 使用该字符来保持其符号笔直。如果您在 RS6000 上编译,这不是默认行为,但在 RS6000 上使用 -qextname 选项进行编译将导致它与其他平台执行相同的操作。
从 Fortran 调用 C
请注意下面的 Fortran 示例以及它如何调用 C 例程:
调用 initscr() 调用 clear() 。. . 调用 move(x, y) 。. . 调用 refresh() 调用 endwin() 结束
...其中 x 和 y 是指定新坐标的整数。
从 Fortran 调用诅咒
如果您正在调用“curses”例程“move()”,您可能会执行以下操作:
C 源文件包含“curses”库函数“move()”的接口例程,以及为其他一些“curses”函数提供接口的其他 C 函数:
#包括
initscr_() { initscr(); }
clear_() { clear(); }
move_(x, y) int *x, y; /这些是指针 */ { move(*x, *y); }
刷新_() { 刷新(); }
endwin_() { endwin(); }
使用以下命令编译例程:
cc -c curses.c f77 test.f curses.o -lcurses -ltermcap
如果您在 Fortran 文件中使用 /usr/include/curses.h 中定义的宏,请注意它们采用 C 语言的约定。请注意,这可能会影响您在 Fortran 中使用它们时获得的结果。
来自 https://engineering.purdue.edu/ECN/Support/KB/Docs/CallingCFromFortran