2016-11-29 2 views
0

Мне нужно использовать немного старую программу, написанную в fortran-77. Эта программа считывает 10 переменные из текстового файла в шестнадцатеричном форматеFortran читает hexademical из файла как ASCII

open (2,file=filename, status='old', iostat=ios) 
read (2,1) my_variables 
1 format (/(10z8)) 

И одна переменная строка (символ * 4) и я хочу, чтобы получить как «л 414E4950» в шестнадцатеричном к «АНИПУ». Но проблема в том, когда я пытаюсь прочитать данные из файла, я получаю сообщение об ошибке.

Fortran runtime error: Value overflowed during integer read 

Как я могу решить эту проблему?

EDIT

Похоже, я упростил проблему слишком много. У меня есть файл данных, который выглядит как:

DATA_BLOCK_NAME 

    3D3  1 23BE  0  0  0  0  0  0  0 
     041200000414E4950  03F800000  0  16 23BF  0  0 
     0  0  0  0  0  041200000414E4950  03F800000 
     0  1E 23C0  0  0  0  0  0  0  0 

И я хочу, чтобы прочитать эти данные в переменных.

 read (2,1) obj_num,((var_1(j,i),j=1,7),(var_2(j,i),j=1,3),var_3(i), 
+  name(i),var_4(i),var_5(i),var_6(i),i=1,obj_num) 

obj_num является целым числом * 4 var_1 является массив целочисленных * 4 var_2, var_3, VAR_4, Var_5, VAR_6 являются массивы вещественных чисел , но (!) Имя массив строк (символ * 4)

Как вы можете видеть в файле данных в каждом 12-значном имени кодированного объекта (например, «414E4950» на «ANIP»), и я хочу сохранить его как строку.

P.S.

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

read (2,1) obj_num,((var_1(j,i),j=1,7),(var_2(j,i),j=1,3),var_3(i), 
+  tmp(i),var_4(i),var_5(i),var_6(i),i=1,obj_num) 

    do j=1,numcn 
    do i=1,4 
     tmp_name(i:i) = CHAR(MOD(tmp(j), 256)) 
     tmp(j) = RSHIFT(tmp(j), 8) 
    end do 
    ccns(j) = tmp_name 
    end do 

Где ТМР целое число * 4 массива и tmp_str это символ * 4 Это некрасиво, но работает. Спасибо всем, кто ответил!

+1

Что вы подразумеваете под «одной переменной является строкой»? Дескриптор 'Z' предназначен для числовых типов. Возможно, вы можете показать, что такое 'my_variables', и как оно объявляется? – francescalus

+0

Как я могу ограничить это утверждение (я младший в лаборатории и не знаю fortran;() прочитал (2, 1), прочитал десять численных значений и попытался присвоить его переменным в списке. Каждая переменная в списке имеет числовой тип (integer * 4 или float * 8), но у одного есть символ * 4. – Vladislav

+0

Все становится немного сложнее, потому что 'Z' не находится в Fortran 77.Если у вас действительно есть программа, которая претендует на компилятор F77, это может означать, что она допускает другую интерпретацию 'Z'. Однако в стандартном Fortran 'Z' может использоваться для ввода только с целыми, вещественными и комплексными переменными. Список переменных должен соответствовать формату: если вы хотите прочитать в символьной переменной, вы должны сопоставить эту переменную с подходящей записью в формате. – francescalus

ответ

0

Ошибка возникает из-за того, что my_variables объявлен как целое, а ваш формат выглядит не совсем корректно. Следовательно, он пытается прочитать целые числа из файла, а не hex. И просто случайно значение 414E4950, прочитанное как целое число, является огромным числом, с которым не может справиться Fortran. Отсюда и ошибка.

Я бы поменял формат на 1 format (10z8). Слэш указывает, что конец текущей записи достигнут и пропускает все остальные, переходящие в новую строку. Поэтому использование его в начале спецификации формата выглядит не совсем корректно.

Кроме того, чтобы прочитать 10 переменных с различными типами данных вы должны использовать, например:

read (2,1), my_string_variable, my_variables(1), my_variables(2), my_variables(3), my_variables(4), my_variables(5), my_variables(6), my_variables(7), my_variables(8), my_variables(9) 

Наконец, вам, вероятно, нужно использовать DATA заявление.

+0

Я не согласен с большей частью этого ответа, но шестнадцатеричный '414E4950' является только десятичным '1095649616', который находится в диапазоне подписанных 32-битных целых чисел. –

+0

Что я имел в виду, так как формат был неправильным, он пытался читать целые числа, а не hex. Поэтому '414E4950' считать как целое число не входит в диапазон. –

+0

Я отредактирую это, чтобы сделать его более ясным. –

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