Поиск:

Ответ в темуСоздание новой темы Создание опроса
> приватность поля производного типа и конструктор 
V
    Опции темы
FCM
Дата 31.1.2013, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 8
Всего: 9



Что-то никак не пойму:
может ли (согласно стандарту 2008) конструктор по умолчанию вызываться вне модуля, где определен производный тип, если какое-либо поле типа приватное (в модуле)? - на практике
   a) в Intel Fortran вызывается без проблем
   b) в mingw-gfortran не вызывается.

Это сообщение отредактировал(а) FCM - 31.1.2013, 12:04
PM MAIL   Вверх
kemiisto
  Дата 12.2.2013, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



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

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



FCM, минимальный бы пример, а то я не совсем понимаю, о чём речь.

Например, вот такое

Код

MODULE foo

  IMPLICIT NONE

  PRIVATE

  PUBLIC :: foo_bar

  TYPE foo_bar
    PRIVATE
    INTEGER :: i
  END TYPE foo_bar

END MODULE foo


Код

PROGRAM test_foo

  USE foo

  IMPLICIT NONE

  TYPE(foo_bar) :: test_bar

  test_bar = foo_bar(10)

END PROGRAM test_foo


Не должно даже компилироваться по стандарту. Так и есть:

ifort 13.1.0
Код

$ ifort foo.f90 test_foo.f90
test_foo.f90(9): error #6292: The parent type of this field is use associated with the PRIVATE fields attribute   [10]
  test_bar = foo_bar(10)
---------------------^
compilation aborted for test_foo.f90 (code 1)


gfortran 4.7.2
Код

gfortran foo.f90 test_foo.f90
test_foo.f90:9.13:

  test_bar = foo_bar(10)
             1
Error: Component 'i' at (1) is a PRIVATE component of 'foo_bar'


Это сообщение отредактировал(а) kemiisto - 12.2.2013, 11:28


--------------------
PM MAIL WWW GTalk Jabber   Вверх
kemiisto
  Дата 12.2.2013, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



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

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



Вот, собственно, цитата из стандарта. Раздел 4.5.10 Construction of derived-type values.
Цитата
C495 (R455) The type name and all components of the type for which a component-spec appears shall be accessible in the scoping unit containing the structure constructor.


Это сообщение отредактировал(а) kemiisto - 13.2.2013, 11:57


--------------------
PM MAIL WWW GTalk Jabber   Вверх
kemiisto
  Дата 12.2.2013, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



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

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



В предположении, что проблемма именно та, вот решение:

Код

MODULE foo

  IMPLICIT NONE

  PRIVATE

  PUBLIC :: foo_bar

  INTERFACE foo_bar
    MODULE PROCEDURE bar
  END INTERFACE foo_bar

  TYPE foo_bar
    PRIVATE
    INTEGER :: i
  END TYPE foo_bar

CONTAINS

  PURE FUNCTION bar(i) RESULT(f)
    TYPE(foo_bar) :: f
    INTEGER, INTENT(IN) :: i

    f%i = i
  END FUNCTION bar

END MODULE foo


Только компиллятор свеженький должен быть. На обозначенных выше - работает. smile 


--------------------
PM MAIL WWW GTalk Jabber   Вверх
FCM
Дата 13.2.2013, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 8
Всего: 9



Цитата(kemiisto @  12.2.2013,  14:53 Найти цитируемый пост)
от, сосбвтенно, цитата из стандарта. Раздел 4.5.10 Construction of derived-type values.
Цитата
C495 (R455) The type name and all components of the type for which a component-spec appears shall be accessible in the scoping unit containing the structure constructor.


1) kemiisto, спасибо! Это то что я высматривал, да не высмотрел (надо мне  чего-нибудь выпить для повышения внимательности  smile )

2) Что касается Intel, посмотри, как он себя поведет, если  в твоем примере определение типа изменить так (что совершенно законно)
Код

 TYPE foo_bar
    INTEGER, PRIVATE ::  i
  END TYPE foo_bar


3) 
Цитата(kemiisto @  12.2.2013,  15:22 Найти цитируемый пост)
В предположении, что проблемма именно та, вот решение: ... 

Да , это штука известная. Называют ее обычно перегрузкой конструктора. Однако перегрузка, в отличие от default-контсруктора, не может использоваться при инициализации. 


PM MAIL   Вверх
kemiisto
Дата 13.2.2013, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



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

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



Цитата(FCM @  13.2.2013,  09:18 Найти цитируемый пост)
1) kemiisto, спасибо! Это то что я высматривал, да не высмотрел (надо мне  чего-нибудь выпить для повышения внимательности

Да уж, стандарт написан суровым языком. smile 

Цитата(FCM @  13.2.2013,  09:18 Найти цитируемый пост)
Что касается Intel, посмотри, как он себя поведет, если  в твоем примере определение типа изменить так (что совершенно законно)

Видимо, баг в компиляторе. smile  Пропускает без ошибок. А gfortran ругается, как и положено.

Цитата(FCM @  13.2.2013,  09:18 Найти цитируемый пост)
Однако перегрузка, в отличие от default-контсруктора, не может использоваться при инициализации.

Есть такое дело. Это, вроде, никак не обойти. Объявление переменно и её инициализация - две совсем разные истории. Едиснтвенное, что можно сделать это инициализировать поля неким значением по-умолчанию:

Код

TYPE foo_bar
    PRIVATE
    INTEGER :: i = 0
  END TYPE foo_bar


тогда можно вызывать конструктор по-умолчанию даже при наличии PRIVATE компонент:

Код

TYPE(foo_bar) :: test_bar = foo_bar()


Но такая инициализация ограничена некими константными значениями. Единственный выигрыш тут в том, что сразу после создания и одновременной инициализации объект валиден.

Это сообщение отредактировал(а) kemiisto - 15.2.2013, 10:27


--------------------
PM MAIL WWW GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Fortran | Следующая тема »


 




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


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

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