2015-05-08 3 views
0

Я имею следующую команду, чтобы установить мой массивупреобразования Fortran типа

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] 
+2

вы должны показать декларацию 'Int8', чтобы улучшить качество вопроса. – agentp

ответ

5

High Performance Mark's answer о решает проблемы. Однако, если 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 не было.

+0

Да, бит утомительный, но это способ его исправить. – Zeus

+0

Is аналогичен при использовании символьных массивов, и элементы имеют разную длину. – Zeus

+1

Два типа спецификаций действительно тесно связаны (см. F2008 4.8). В этом ответе это параметры типа kind, с символами, которые вы упоминаете, это параметры типа длины (также), которые должны совпадать. Тем не менее, я не имею в виду последствия для преобразования и предупреждения. – francescalus

2

Попробуйте

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

Но это просто предупреждение, а другой способ остановить компилятор - установить или отключить флаг. Поскольку вы молчите, какой компилятор вы используете, я не буду угадать, что в его документации, или какой флаг установить значение.

+0

Разве это не незаконно: разные параметры вида в одном конструкторе? [Предполагая, что 'int8' не соответствует виду по умолчанию.] – francescalus

+0

Я так не думаю, но я не пробовал, я работаю на машине без компилятора Fortran. У меня есть небольшая память о том, какой вид берется из первого элемента, когда вы инициализируете массив таким образом. И я собираюсь вернуться домой, чтобы потом проверить, чтобы узнать, сколько мне оправдало мое опрометчивое предположение. –

+0

Я не хочу получать предупреждение, когда установлен флаг. Я использую 'gcc-5.0' – Zeus

Смежные вопросы