2015-06-04 4 views
0

Я пытаюсь преобразовать целое число в символ в моей программе на языке Фортран 90. Вот мой код:Преобразование целого числа в символ в Fortran90

Write(Array(i,j),'(I5)') Myarray(i,j) 

Array является целым массивом и Myarray является массив символов, и '(I5)', я не знаю, что это такое, просто работал для меня раньше!

Ошибка:

"Unit has neither been opened not preconnected"

и иногда

"Format/data mismatch"!

+5

Похоже на все вопросы, которые вы рассматривали до этого, и правильно пометить свой вопрос на языке, который вы используете. «integer» никоим образом не помогает. –

+1

Как написано, ваша строка кода пытается написать символ (из 'myarray (i, j)') в целое число (в 'array (i, j)'), вы заменили цель и пункт назначения. Вам может потребоваться не больше, чем обменять этих двух. –

ответ

2

Alexander Vogt explains смысл (I5) части. Этот ответ также указывает на некоторые другие проблемы и устраняет основную проблему. В нем не совсем четко указано решение, поэтому я напишу это здесь.

У вас есть две ошибки, но обе имеют ту же причину. Я переформулирую ваш оператор записи, явно указывая что-то, что неявно.

Write(unit=Array(i,j),'(I5)') Myarray(i,j) 

Эта неявная вещь unit=. Затем вы просите написать переменную символов Myarray(i,j) файлу, подключенному к блоку, заданному целочисленной переменной Array(i,j).

Для некоторых значений целочисленного элемента файл не предварительно подключен. Вы можете прочитать об этом. Когда вы не получите первую ошибку:

Unit has neither been opened not preconnected

Для некоторых значений Array(i,j), скажем, 5, 6 или некоторое другое значение в зависимости от компилятора, блок будет предварительно подключен. Тогда, что первая ошибка не приходит о, и вы получите

Format/data mismatch

, потому что вы пытаетесь записать переменные символы с дескриптором числа редактирования.

Этот ответ, то есть длинный способ сказать, что вы хотите сделать

Write(Myarray(i,j),'(I5)') array(i,j) 

Вы хотите записать целое значение символьной переменной.

Наконец, обратите внимание, что если вы сделали ту же ошибку с реальной переменной array вместо целого, вы бы получили a different error message. В одном случае вам просто не повезло, что ваш синтаксис верен, но намерение было неправильным.

3

'(I5)' является спецификатором формата для утверждения записи: записать значение в качестве integer с пятью символов в общей сложности.

Несколько вещь может пойти не так:

  • Убедитесь, что Myarray действительно является целым числом (а не например real)
  • Убедитесь array является массив символов с длиной не менее пяти символов для каждого элемента
  • Заботьтесь массива форм
  • Убедитесь, что i и j иметь действительные значения

Вот рабочий пример:

program test 
    implicit none 
    character(len=5) :: array(2,2) 
    integer,parameter :: myArray(2,2) = reshape([1, 2, 3, 4], [2, 2]) 
    integer   :: i, j 

    do j=1,size(myArray,2) 
    do i=1,size(myArray,1) 
     write(array(i,j), '(I5)') myArray(i,j) 
    enddo !i 
    enddo !j 

    print *, myArray(1,:) 
    print *, myArray(2,:) 
    print *,'--' 
    print *, array(1,:) 
    print *, array(2,:) 
end program 
+0

Спасибо, ребята. Задача решена! Я написал: Write (myarray (i, j), '(I5)') Array (i, j), и теперь я знаю, что такое «(I5)»! Спасибо, Александр! – mohammad

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