【问题标题】:DATA statement from Fortran to C从 Fortran 到 C 的 DATA 语句
【发布时间】:2016-06-23 12:31:49
【问题描述】:

我需要将 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 个空格,那么最后两个空格会发生什么?呵呵

【问题讨论】:

  • 不要在一篇文章中指定太多问题,这会使其过于宽泛。您可以通过在这里搜索轻松找到一些答案。 1.0d-6 的含义很容易找到(只是 1e-6 的双精度)。算术 if 在这个网站上也被处理了好几次。
  • data 语句中2*0 不是乘法,而是多重性。也就是说,一个得到两个零值,而不是一个(两倍的零)。如果那是您的困惑,应该还有其他问题可以找到。
  • 确实如此。我什至没有阅读那部分的细节。我发现了一个问题,其中提到但不完全相同。
  • 在 Fortran 中,数据存储在主行中。分配你的数据 COEF[0][0], COEF[1][0], COEF[2][0], COEF[0][1] ...否则当你翻译任何算法时,它会变得很糟糕.

标签: c fortran fortran77


【解决方案1】:

你不需要在 C 中使用可执行的赋值;如果您愿意,您可以在其定义中初始化一个变量,这是分配存储空间的声明。但是聚合初始化默认为存储顺序,正如@cup 评论的那样,Fortran 使用列优先,而 C 使用行优先(以及 0 源与默认 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 */

【讨论】:

    【解决方案2】:

    原始 DATA 语句中有 18 个值。

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      • 2012-02-26
      • 2017-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多