Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Fortran到C的数据语句_C_Fortran_Fortran77 - Fatal编程技术网

从Fortran到C的数据语句

从Fortran到C的数据语句,c,fortran,fortran77,C,Fortran,Fortran77,我需要将Fortran 77代码翻译成C语言,我有大约90%的翻译,但我不理解Fortran的某些部分,例如,在Fortran中,我有: 维数COEF(3,3),EXPON(3,3) 数据系数,指数/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.

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

维数COEF(3,3),EXPON(3,3)
数据系数,指数/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的两个数组,因此,当我阅读数据文档时,我需要将每个值放在两个数组中,这样我就有了下一个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

原始数据语句中有18个值

我相信你对这种多样性感到困惑,正如弗朗西斯卡勒斯所说的那样

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

我想你需要这样的东西:

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

(也适用于EXPON中的2个零)


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

原始数据语句中有18个值

我相信你对这种多样性感到困惑,正如弗朗西斯卡勒斯所说的那样

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

我想你需要这样的东西:

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

(也适用于EXPON中的2个零)


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

您不需要在C中使用可执行赋值;如果愿意,可以在变量定义中初始化变量,变量定义是分配存储的声明。但是聚合初始化默认为存储顺序,正如@cup注释的Fortran使用列主目录,而C使用行主目录(以及0-origin与默认值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 */

您不需要在C中使用可执行赋值;如果愿意,可以在变量定义中初始化变量,变量定义是分配存储的声明。但是聚合初始化默认为存储顺序,正如@cup注释的Fortran使用列主目录,而C使用行主目录(以及0-origin与默认值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 */

不要在一篇文章中指定太多的问题,这会使文章过于宽泛。你可以通过在这里搜索很容易找到答案。1.0d-6的含义很容易找到(仅为1e-6的两倍前体)。这个算法在这个网站上也被处理了好几次。我删除了没有连接的部分。参见和,在
data
语句中
2*0
并不表示乘法,而是多重性。也就是说,一个得到两个零值,而不是(两倍于零的)一个。如果你对此感到困惑的话,应该还有其他问题需要解决。这是真的。我甚至没有读过那部分的细节。我发现了一个问题,其中提到了这一点,但不是完全重复的。在Fortran中,数据存储在row MARGER中。分配数据COEF[0][0]、COEF[1][0]、COEF[2][0]、COEF[0][1]。。。否则,当你翻译任何算法时,它将变成bezerk。不要在一篇文章中指定太多的问题,这会使它太宽泛。你可以通过在这里搜索很容易找到答案。1.0d-6的含义很容易找到(仅为1e-6的两倍前体)。这个算法在这个网站上也被处理了好几次。我删除了没有连接的部分。参见和,在
data
语句中
2*0
并不表示乘法,而是多重性。也就是说,一个得到两个零值,而不是(两倍于零的)一个。如果你对此感到困惑的话,应该还有其他问题需要解决。这是真的。我甚至没有读过那部分的细节。我发现了一个问题,其中提到了这一点,但不是完全重复的。在Fortran中,数据存储在row MARGER中。分配数据COEF[0][0]、COEF[1][0]、COEF[2][0]、COEF[0][1]。。。否则,当您翻译任何算法时,它将变成bezerk。