Хобрук: Ваш путь к мастерству в программировании

Почему переменная счетчика неожиданно увеличивается при каждом вызове подпрограммы?

[ОТ РЕДАКЦИИ: я прочитал этот вопрос, но ( в то время как в ретроспективе это в конечном счете связано таким же образом, как и каждый вопрос здесь, например, «Почему компьютеры работают со сбоями?»), этот ответ не является ответом на мой вопрос. Этот вопрос спрашивает, почему орган по стандартизации разработал определенную функцию в языке. И ответ не отвечает на мой вопрос, который спрашивает, что я пропустил при отладке этой проблемы.]

ВОПРОС: Почему выходные данные этой программы на Фортране (ExhaustiveListing.f08 + unicodeSupport.f08), показанные ниже, указывают на то, что DO WHILE в Fortran ошибка?

Вот вывод, за которым следует описание среды и, наконец, исходный код двух рассматриваемых файлов:

НЕОЖИДАННЫЙ РЕЗУЛЬТАТ

Hex теперь: 2500H.
2500─
2501━
2502│
2503┃
2504┄
2505┅
2506┆
> 2507┇
2508┈
2509┉
250A┊
250B┋
250C┌
250D┍
250E┎
250F┏
Hex теперь: 2510H.
Теперь шестнадцатеричное значение: 2520H.
Теперь шестнадцатеричное значение: 2530H.
Теперь шестнадцатеричное значение: >2540H.
Теперь шестнадцатеричное значение: 2550H.
Теперь шестнадцатеричное значение: 2560H.
Теперь шестнадцатеричное значение: 2570H .

ЗАПУСК ЗАВЕРШЕН; выходное значение 0; реальное время: 530 мс; пользователь: 0 мс; система: 0 мс

ОЖИДАЕМЫЙ РЕЗУЛЬТАТ

Я ожидал, что между каждой строкой «Hex is now: xxxxH» должно быть 16 строк детализации, например, между 2500H и 2510H строк.

ПРЕДЫДУЩИЕ ПОПЫТКИ РЕШЕНИЯ ПРОБЛЕМЫ

Эта программа — моя попытка решить проблему в гораздо более крупном проекте. Имея проблемы с этим проектом (одна из таких проблем связана с работой с Unicode в Fortran), я создал этот проект, чтобы изолировать проблему с Unicode. Сначала у меня был тривиальный модуль unicodeSupport, объединенный в одном файле с основной программой. Я удалил его в свой собственный файл. Нет, это не должно иметь значения и -- это не повлияло на результат. Эта программа настолько проста, что я не вижу ничего, что могло бы быть сделано неправильно. Следовательно, я пришел в SO в надежде, что новые глаза обнаружат мою ошибку. В противном случае пришло время отправить отчет об ошибке в gFortran.

ОКРУЖАЮЩАЯ ОБСТАНОВКА

Среда, в которой я работаю:
ОС: Ubuntu 17.10 IDE: Netbeans 8.2 < strong>JDK: Oracle (сборка 1.8.0_161-b12) КОМПИЛЬЕР: gFortran 7.2.0 ФЛАГИ КОМПИЛЯТОРА< /strong>: -std=f2008ts -fno-unsafe-math-optimizations -frounding-math -fsignaling-nans theGeeko61: 4 десятилетия разработки на BASIC, Pascal , FORTRAN, C, Prolog, C++, Java и многие другие (отсортированы в хронологическом порядке, в котором я их изучал)

Исчерпывающий список.f08

! File:   ExhaustiveListing.f08
! Author: geeko
!
! Created on March 25, 2018, 7:05 PM
!
! ☐ U2610 ☑ U2611 ☒ U2612
! Use above symbols for indicating items to
! be tested (☐), and items which have either
! passed (☑) or failed (☒) testing.
!
SUBROUTINE displayLine(hex)
    USE unicodeSupport
    IMPLICIT NONE
    INTEGER :: hex, counter=0, point

    DO WHILE (counter < 16)
        point = hex+counter
        WRITE(*,'(Z4.4,A)') point, CHAR(INT(point), ucs4)
        counter = counter+1
    END DO
END SUBROUTINE

PROGRAM ExhaustiveListingOfUnicodeBoxDrawingChars ! ☒
    USE ISO_FORTRAN_ENV
    USE unicodeSupport
!!!!!USE testUnicodeSupport         ! ☑
    IMPLICIT NONE
    INTEGER  :: hex

    open(output_unit, encoding='UTF-8')

    hex = 9472
    DO WHILE(hex<9600)
        PRINT '(A,Z4.4,A)', "Hex is now: ", hex, "H."
        CALL displayLine(hex)   ! ☒
        hex = hex+16
    END DO

!!!!CALL performTest()              ! ☑
END PROGRAM ExhaustiveListingOfUnicodeBoxDrawingChars

unicodeSupport.f08

! File:   unicodeSupport.f08
! Author: geeko
!
! Created on March 25, 2018, 10:09 PM
!

MODULE unicodeSupport
    INTEGER, PARAMETER  :: ASCII = SELECTED_CHAR_KIND('ASCII')
    INTEGER, PARAMETER  :: UCS4 = SELECTED_CHAR_KIND('ISO_10646')
END MODULE unicodeSupport

  • В будущем, если вы считаете, что нашли серьезную ошибку в Fortran, создайте как можно более минимальный пример, демонстрирующий ту же проблему. 26.03.2018
  • @francescalus: Это то, что я пытался сделать... минимум слишком субъективен... это был мой минимум... как бы выглядел ваш? ;) (Проект с 1 файлом, на Фортране, это минимум, не так ли?) 26.03.2018
  • Если вы видели некоторые из ужасов, которые я должен поддерживать, вы можете видеть, насколько неминимальным может быть один исходный файл :(. Но здесь вы можете легко продемонстрировать ту же проблему без каких-либо частей Unicode и закомментированного кода. 26.03.2018
  • @francescalus: Вы правы .. но у меня не было возможности (заранее) узнать, что это НЕ то, что нужно иметь дело с Unicode. Я специально выбрал проблемы Unicode в мини-проекте из-за всех предупреждений и обручей, через которые я перепрыгнул в отношении их поддержки gFortran... например, когда этот проект начинался, это был Fortran 95... мы перешли именно на Fortran 2008 из-за улучшения Unicode... что заставило меня считать ЭТО подозрительным. 26.03.2018
  • @francescalus: я не думал, что нашел серьезную ошибку. Не знаю, как вы неправильно поняли, что я имел. 26.03.2018
  • Почему выходные данные этой программы на Фортране, показанные ниже, указывают на то, что в инструкции Fortran DO WHILE есть серьезная ошибка? 26.03.2018
  • Фу. Виноват. Я был так измотан, что не понял, что сделал это. Мои извинения. 26.03.2018
  • Не беспокойся. Я согласен с тем, что инициализация подразумевает, что сохранение далеко не интуитивно понятно как источник таких проблем (и если бы это был действительно плохой вопрос, я бы проголосовал против него и не оглядывался назад). Однако сведение сложных дел к минимуму — очень ценный навык. 26.03.2018
  • Я согласен, что это хороший навык. В будущем я, по крайней мере, хорошо отдохну от проблемного кода, прежде чем публиковать на SO. :) 26.03.2018

Ответы:


1

Здесь объявлена ​​переменная counter

INTEGER :: hex, counter=0, point

обладает атрибутом save в силу того, что его значение определено в строке инициализации.

При втором входе в подпрограмму ее значение будет равно 16 и, следовательно, цикла не будет.

Удалите =0 из строки объявления и напишите

counter = 0

после.

26.03.2018
  • Отличное у вас зрение. Я так рада, что это была моя ошибка. Я ненавижу подавать отчеты об ошибках. :) 26.03.2018
  • Новые материалы

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..

    Обзор 20 основных и современных методов работы с массивами в JavaScript
    Вы знаете их всех? В этом коротком посте я покажу сводку методов, доступных в JavaScript для работы с массивами. Я надеюсь, что вы найдете это полезным! В конце поста вы найдете ссылку на..

    Да, но я чувствую необходимость указать, что это или не единственные два.
    Да, но я чувствую необходимость указать, что это или не единственные два. Обучение с подкреплением (в качестве примера) также является важным.


    © 2024 hobruk.ru, Хобрук: Ваш путь к мастерству в программировании