Fortran 77可变大小的字符串数组?

时间:2011-09-12 07:16:28

标签: arrays fortran fortran77

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

我试过了:

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

但这不起作用......

1 个答案:

答案 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