繁体   English   中英

从Fortran到C的DATA语句

[英]DATA statement from Fortran to C

我需要将Fortran 77代码翻译为C语言,我大约有90%的翻译,但是我不了解Fortran的某些部分,例如,在Fortran中,我有:

DIMENSION COEF(3,3),EXPON(3,3) DATA COEF,EXPON/1.0D0,2*0.0D0,0.678914D0,0.430129D0,0.0D0, $ 0.444635D0,0.535328D0,0.154329D0,0.270950D0,2*0.0D0,0.151623D0, $ 0.851819D0,0.0D0,0.109818D0,0.405771D0,2.22766D0/

在这一部分中,我有两个长度为3的数组,因此,当我阅读DATA的文档时,需要将每个值放入两个数组中,因此我在C中拥有下一个代码块:

COEF[0][0] = 1.0;
COEF[0][1] = 2.0;
COEF[0][2] = 0.6789140;
COEF[1][0] = 0.4301290;
COEF[1][1] = 0.0;
COEF[1][2] = 0.4446350;
COEF[2][0] = 0.5353280;
COEF[2][1] = 0.1543290;
COEF[2][2] = 0.2709500;

EXPON[0][0] = 2.0;
EXPON[0][1] = 0.1516230;
EXPON[0][2] = 0.8518190;
EXPON[1][0] = 0.0;
EXPON[1][1] = 0.1098180;
EXPON[1][2] = 0.4057710;
EXPON[2][0] = 2.227660;
EXPON[2][1] = 0.0;
EXPON[2][2] = 0.0;

假设我需要将参数列表与值列表相关联,我只有16个值,但是两个数组之间有18个空格,那么最后两个空格会怎样? XD

原始DATA语句中 18个值。

我相信您对多重性感到困惑,正如francescalus所说

2 * 0表示:两个零。 它并不意味着2.0,也不意味着2x0。 意思是:“两个零,快到了!”

我认为您需要这样的东西:

COEF [0] [1] = 0.0; COEF [0] [2] = 0.0;

(以及EXPON中的2个零)

然后,您的18个值将按预期排列,并且C数组中将没有任何未初始化的插槽。

您无需在C中使用可执行文件分配; 如果需要, 可以在其定义中初始化变量 ,这是分配存储空间的声明。 但是聚合初始化默认为存储顺序,正如@cup所述,Fortran使用列优先,而C使用行优先(以及0来源vs默认值1),因此您必须转置数据:

float coef[3][3] = { 1.0, 0.678914, 0.444635,
    0, 0.430129, 0.535328,   0, 0, 0.154329 };

或(假设C99 +)使用指定的初始化程序语法:

float coef[3][3] = { [0][0]=1.0, [1][0]=0, [2][0]=0,
    [0][1]=0.678914,[1][1]=0.430129,[2][1]=0,
    [0][2]=0.444635,[1][2]=0.535328,[2][2]=0.154329 };
/* you can omit the zero-valued entries; in an aggregate 
    intializer any unspecified components are zero */

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM