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