0

我是 Fortran 77 中的一个假人,并且一直是 C++ 编码器,但我必须修改多年前的代码......我想创建一个可变大小的字符串数组,但我在网上找不到如何在 Fortran 中执行此操作77. 理想情况下,它应该是两个维度都可变的数组,但如果不可能,我可以修复字符串的长度,但我需要有可变数量的字符串。

我试过这个:

CHARACTER*32 STR1*(VAR1)
...
WRITE(6,*) STR1(10)

但这不起作用...

4

1 回答 1

0

显然 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

于 2011-09-12T08:18:56.273 回答