Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [General] Аттрибут SAVE. Зачем? 
V
    Опции темы
valvliv
Дата 30.1.2006, 04:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 25.1.2006

Репутация: нет
Всего: 1



Не поняла, зачем этот атрибут?? Смысл?
smile
PM MAIL   Вверх
valvliv
Дата 30.1.2006, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 25.1.2006

Репутация: нет
Всего: 1



Так, поняла smile Я когда спрашиваю, быстрее соображаю, - даже если никто не отвечает smile
PM MAIL   Вверх
Cr@$h
Дата 30.1.2006, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: 1
Всего: 41



Атрибут save применяется, когда мы хотим сохранить для внутренней переменной после завершения процедуры:
  • ее значение;
  • статус определенности;
  • статус ассоциирования (associated(var) = .true.) для ссылок (pointers);
  • статус размещения для размещаемых переменных или массивов (allocated(var) == .true.).

Задания атрибута:
Код

save [[::] list]
type-specification, save [, другие-атрибуты] :: список-объектов


Пример
Код

program SaveArgument

    implicit none
    
    print *, "First time: "
    call PrintNumber
    print *, "Second time: "
    call PrintNumber
    
    read *

contains
    subroutine PrintNumber
        integer :: b = 10
        integer, save :: a = 20
        integer c
        
        print *, b, a, c

        ! Это значение сохранится для внутренней переменной b.
        b = 15
        
        ! Это значение сохранится для внутренней переменной a.
        a = 25
        
        ! Это значение не сохранится для внутренней переменной c.
        c = 35
    end subroutine PrintNumber
end program SaveArgument


Результаты выполнения
Код

 First time:
          10          20           0
 Second time:
          15          25           0


Правила работы с атрибутом:
  • объект может появляться в списке save один раз;
  • при задании атрибута без списка-объектов все объекты в данной программной единице приобретают атрибут save, если могут его иметь;
  • задание атрибута save в главной программе не имеет никаого значения;
  • при задании commom-блока в главной программе и при помещении в список-объектов commom-блок, этот атрибут приобретают он и все его переменные;
  • при задании commom-блока в процедуре и при помещении в список-объектов commom-блок, этот атрибут приобретают он и все его переменные, которые сохраняют свое уникальное значение в каждой процедуре, где они присутствуют в списке-объектов атрибута save.

Атрибут save по умолчанию получают:
  • переменные, инициализированные при объявлении;
  • переменные, инициализированные в операторе data.

По умолчанию этот атрибут не имеют переменные производного типа, которые в своем описании имеют значения для компонент по умолчанию.
Код

type Point
    real :: x = 10
    real :: y = 20
end type Point


Атрибут save не могут иметь:
  • пустой common-блок;
  • отдельно объект в common-блоке;
  • процедура;
  • формальный параметр процедуры;
  • результат функции или результирующей переменной функции;
  • автоматический объект (внутренние массив или строка);
  • именнованная константа;
  • объекты, явно объявленные автоматическими черех атрибут automatic.

В разных компиляторах по умолчанию этот атрибут приписывается еще некоторым объектам.
Для CVF и FPS по умолчанию атрибут save имеют все переменные кроме:
  • объектов с атрибутом allocatable;
  • объектов с атрибутом pointer;
  • автоматических объектов, например внутренний массив LocalArray(50) всегда будет размещаться заново при входе в процедуру, но не исключено, что он может быть случайно размещен в том же месте памяти.
Для IVFC так же по умолчанию этот атрибут получают:
  • common-блоки;
  • локальные переменные нерекурсивных процедур.


Зачем использовать этот атрибут? Может пригодиться, когда вы по каким-то причинам хотите, чтобы переменная помнила свое значение при следуещем входе в проуедуру. Например, чтобы начать с того же места, на котором остановился бинарный боиск в предположении, что очередное значение поиска в массиве лежит рядом или следует в массиве за тем, которое искалось при предыдущем вызове. Тогда поиск будет проходить быстрее.
PM MAIL ICQ   Вверх
valvliv
Дата 30.1.2006, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 25.1.2006

Репутация: нет
Всего: 1



Спасибочки smile
PM MAIL   Вверх
Cr@$h
Дата 30.1.2006, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: 1
Всего: 41



Цитата(valvliv @ 30.1.2006, 16:36 Найти цитируемый пост)

Так, поняла  Я когда спрашиваю, быстрее соображаю, - даже если никто не отвечает 

smile smile
Если автор темы считает, что вопрос закрыт, лучше найти и нажать в теме Пометить вопрос решенным. Эта ссылка находится в верхней части формы быстрого ответа, кажись. В списке у темы появится галочка.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Fortran | Следующая тема »


 




[ Время генерации скрипта: 0.1120 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.