Проблема создания частотного массива данного массива - PullRequest
0 голосов
/ 12 апреля 2011

Я пытаюсь создать массив частот для данного массива на Fortran 95. Например, если у меня есть массив (\ 1 2 4 2 4 2 5), массив частот должен быть числом раз, которое появляется каждый элемент; (\ 1 3 2 3 2 3 1). Таким образом, поскольку в исходном массиве только 1 из 5, последняя запись в новом массиве равна 1, а в исходном массиве есть 3 из 2, соответствующие записи в новом массиве равны 2.

Ниже приведен пример кода, который у меня есть, но я продолжаю получать ошибки. Мне было интересно, если кто-нибудь захочет дать мне некоторое руководство и помощь в том, что я могу делать неправильно. Это было бы очень ценно.

Я не включил часть кода, которая генерирует мой исходный массив, потому что я почти уверен, что он правильный, поэтому здесь просто подпрограмма для частотного массива. Также исходный массив был отсортирован в порядке возрастания вне этой подпрограммы. Возможно, я не передал исходный массив, num (i) правильно ??

INTEGER, DIMENSION(100)::num(100)
    INTEGER, DIMENSION(100)::freq(100)
    INTEGER:: i=0, k=0, numinteger, count=0

CALL FreqArray(num, numinteger,freq)


SUBROUTINE FreqArray(num, numinteger, freq)

INTEGER, INTENT(IN):: num(100), numinteger
INTEGER, INTENT(OUT):: freq(100)

DO i=1,9
    count=0
    DO k=1, numinteger
        IF (num(k)==i)THEN
            count=count+1
        END IF
    END DO
    freq(i)=count
END DO

PRINT*, "Frequency of Digits"
PRINT*, " "
WRITE(*,'(1X,A,T35,A)'),"Digit","Frequency"
WRITE(*,'(1X,I1,T35,I1)'),num(i),freq(i)


END SUBROUTINE

Большое спасибо за ваше время.

Ответы [ 2 ]

2 голосов
/ 12 апреля 2011

Я полагаю, что "(9)" переопределяет "DIMENSION (100)", делая "freq" массивом длины 9. Таким образом, для третьего аргумента фактический аргумент имеет длину 9, а фиктивный - длину 100 Который вызывает ваше сообщение об ошибке "фактический аргумент ... меньше, чем фиктивный размер".

Другие предложения: вы можете сделать подпрограмму более общей, используя объявления "..., dimension (:) :: num". Затем используйте встроенный «размер», чтобы определить размер числа. Freq может быть установлен на 9, так как всегда есть 9 цифр.

1 голос
/ 12 апреля 2011

Что касается вашей проблемы с дисплеем, я подозреваю, что вы имели в виду цикл вокруг

WRITE(*,'(1X,I1,T35,I1)'),num(i),freq(i)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...