【问题标题】:Avoiding conversion warning in Fortran array of non-default kindFortran 类型转换
【发布时间】:2015-07-19 15:11:27
【问题描述】:

我有以下命令来设置我的数组

Use, Intrinsic :: iso_fortran_env
Integer (Int8), Allocatable :: iu(:)

Allocate (iu(4))
iu = [4,3,2,1]

我怎样才能阻止编译器给我

Allocate (iu(4));  iu = [4,3,2,1]
                       1
Warning: Possible change of value in conversion 
from INTEGER(4) to INTEGER(1) at (1) [-Wconversion]

【问题讨论】:

  • 您应该出示Int8的声明以提高问题质量。

标签: arrays fortran converter


【解决方案1】:

High Performance Mark's answerabout 解决了您的问题。但是,假设 int8 不是默认类型(错误消息支持),该答案中给出的数组构造函数中的每个元素都应该具有相同的类型(它们有)和类型(它们没有)参数。所以:

iu = [4_int8,3_int8,2_int8,1_int8]

是一个有效的构造函数,不应涉及转换。

这样做有点乏味,尤其是对于许多元素,因此值得注意的是(如 Fortran 2008 4.8 中所述)可以在数组构造函数中使用类型规范来指定数组的类型和类型参数.然后,你可以写

iu = [integer(Int8) :: 4, 3, 2, 1]

现在只需要符合integer(Int8) 的值。

gfortran 是否抱怨转换似乎取决于编译器版本。用旧版本测试仍然有警告,用 4.9.0 没有。

【讨论】:

  • 是的,有点乏味,但这是解决它的方法。
  • 使用字符数组时类似,元素长度不同。
  • 这两个类型规范确实密切相关(参见 F2008 4.8)。在这个答案中,它是类型参数,您提到的字符是长度类型参数(也是),必须匹配。但是,我不知道对转换和警告的影响。
  • 我会尝试并报告。
  • 我确认iu = [integer(Int8) :: 4, 3, 2, 1] 看起来比iu = [4_int8,3_int8,2_int8,1_int8] 整洁时不会报告警告
【解决方案2】:

试试

iu = [4_int8,3,2,1]

但这只是一个警告,停止编译器的另一种方法是设置或取消设置标志。由于您对所使用的编译器保持沉默,因此我不会猜测其文档中的内容或将哪个标志设置为什么值。

【讨论】:

  • 这不是非法的:同一个构造函数中的不同种类的参数吗? [假设int8 不对应默认类型。]
  • 我不这么认为,但我没有尝试过,我正在使用没有 Fortran 编译器的机器。当您以这种方式初始化数组时,我从第一个元素中获取了一些模糊的记忆。而且我要回家了,所以稍后会检查一下我的轻率猜测花了我多少代表。
  • 我不想在设置标志时收到警告。我正在使用gcc-5.0
  • 如果您不想收到特定警告,您有两种选择:要么避免导致编译器发出警告的条件,要么让编译器保持安静。由你决定选择哪一个。
  • 我将使用_int8 声明。
猜你喜欢
  • 2012-06-10
  • 2019-06-21
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
  • 2019-03-02
  • 1970-01-01
相关资源
最近更新 更多