1) Ваш сбой происходит из-за того, что вы выделили только 1 элемент для двоичного массива (:), и цикл while, предположительно, перешел к i = 2, и в этот момент ваш массив выходит за пределы индекса (сбой).
2) Фортран имеет ряд встроенных функций, которые напрямую работают с битами. Например,
а) Bit_Size(var) возвращает количество битов в «var», поэтому, если вы должны использовать выделяемый массив, теперь вы знаете требуемый размер массива заранее.
б) BTest(iVar, pos) возвращает .True. если бит pos в iVar равен 1
Например, используя другие объявления выше:
Integer :: n
n = Bit_Size(decimalnum)
If( Allocated(Binary) ) DeAllocate(Binary) ! good practice
Allocate( Binary(1:n) ) ! in general, should get IOStat, just in case
Binary(:) = 0
ForAll(i=1:n, Mask = BTest( decimalnum, i-1 ) ) ! remember, bit intrinsics index from 0
Binary(i) = 1
End ForAll
... это немного более эффективно по сравнению с Do and While и может помочь (немного) в отношении smp. Можно также использовать конструкцию Where/EndWhere, но я считаю, что ForAll немного более эффективна.
c) IBits(var, pos, len) извлекает биты из var, начиная с pos, для количества битов len, например, если вы хотите создать «явное» двоичное представление, это может быть одним из способов.
и т. д. и т. д.
3) Если вы «действительно имеете в виду» преобразование DecimalNum в Bin, то у вас есть (существенные) дополнительные проблемы, если Dec также включает Dec с плавающей запятой (т.е. Reals), поскольку битовое представление Reals выражается в показателях степени. Я предполагаю, что это не так, поскольку код/объяснение для этого гораздо сложнее.
Наконец, в Фортране числа обычно являются «знаковыми» числами, а начальный бит используется для определения +ve (0) или -ve (1). Поэтому, если вы шли в «другом» направлении (Bin2Dec), то предпочли бы дополнительный аргумент (возможно, необязательный), который контролирует, является ли результат подписанным или беззнаковым. Если без знака, то выходная переменная должна быть "больше" по сравнению с входной переменной (например, при преобразовании беззнакового 1-байтового целого числа в Fortran int необходимо использовать как минимум 2-байтовое целое число (т.е. входное целое число(1) должно быть вывод в Integer(2)) и т.д.
person
DrOli
schedule
26.06.2014
debug
? такой gdb - person Jack   schedule 08.10.2012allocate(binary(i) = 0)
, но компилятор вернулsyntax error in allocate statement
- person Progrmr   schedule 08.10.2012