Терминология компилятора Фортрана: фиктивные переменные и атрибуты

Ни один из этих ответов не работал для меня во всех случаях. Мне пришлось перейти непосредственно к Документации Google https://developer.android.com/guide/topics/providers/document-provider.html по этой теме и найти этот полезный метод:

private Bitmap getBitmapFromUri(Uri uri) throws IOException {
    ParcelFileDescriptor parcelFileDescriptor =
    getContentResolver().openFileDescriptor(uri, "r");
    FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
    Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor);
    parcelFileDescriptor.close();
    return image;
}

Вы можете использовать это растровое изображение для отображения его в режиме просмотра изображений.

7
задан Cetin Sert 28 June 2009 в 05:59
поделиться

1 ответ

Фортран передает по ссылке. Фиктивный атрибут соответствует тем переменным, которые передаются в функцию ( X и Y в вашем случае). Оператор параметра ожидает чего-то статического, но поскольку X - это все, что передается в функцию, это действительно не имеет никакого смысла. Оператор параметра - это способ установки констант - он не имеет ничего общего с параметрами подпрограммы.

Когда вы получаете сообщение об ошибке, говорящее, что C не является DUMMY переменная, значит, она не находит C в списке переменных, которые будут переданы в / из функции - ваше объявление только F (X, Y) : нет C в поле зрения. Хотя вы явно не используете атрибут DUMMY , у вас есть атрибут INTENT (INOUT) , что означает, что эти переменные соответствуют вводу / выводу подпрограммы.

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

subroutine F(X, Y)
    implicit none

    ! These are the dummy variables
    real, intent(inout) :: X, Y

    ! These are the variables in the scope of this subroutine
    real                  :: a, b
    real, parameter, save :: c = 3.14E0

    X = Y + 2*sin(Y)
end subroutine F

Я не совсем уверен, что вы пытаетесь сделать - вы объявляете подпрограмму pure , что означает подпрограмму без побочных эффектов, но вы используют intent (inout) для ваших переменных, что означает, что X и Y могут быть изменены в ходе выполнения.

Я бы добавил также, что внутри подпрограммы инициализация переменной в ее операторе объявления, таком как REAL :: C = 3.14E0 , дает переменную с неявным атрибутом save . Однако, если вы хотите, чтобы он сохранялся от вызова к вызову, вы поступили правильно, явно добавив атрибут save , чтобы было ясно, что вы делаете именно это.

I ' я не парень парсеров / компиляторов,

10
ответ дан 6 December 2019 в 19:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: