....
type(Typ_1) :: Typ1
Typ1 = Typ_1(100.,200.)
I want to ask that weather I can assign partial values of the Typ1
because I have already assgin the initial value(like a = 100.). E.g.
Typ1 = Typ_1(t = 200.) or use other format???
This is a F2003-style structure constructor. It is already implemented
in g95, for example. (www.g95.org)
A structure constructor expression list must agree in number and order
with the components of the derived type.
Thus, to assign a single value you need the reference form as
Typ1%t = 200.
--
"real(8)" is non-portable, so you might want to try:
integer, parameter :: rdp = kind(1.D0)
type :: Typ_1
real(rdp) :: a = 100._rdp, t
end type Typ_1
> I want to ask that weather I can assign partial values of the Typ1
> because I have already assgin the initial value(like a = 100.). E.g.
>
> Typ1 = Typ_1(t = 200.) or use other format???
What about "Typ1%t = 200._rdp"?
type :: Typ_1
real(8) :: a1 = 100.
real(8) :: a2 = 102.
real(8) :: a3 = 103.
real(8) :: a4
.....
.....
.....
.....
real(8) :: a10
end type Typ_1
type(Typ_1) :: Typ1
Typ1 = Typ_1(100.,102.,103.,104.....)
... and why it was changed for f2003. I understand that Cray and g95 already
implement the new style.
Regards,
Mike Metcalf
As an aside, do note (for the OP; I know Michael understands) that this
has nothing in particular to do with assignment. It is just a question
of structure constructor syntax, irrelevant to whether the constructor
is used in an assignment statement or some other context.
--
Richard Maine | Good judgement comes from experience;
email: last name at domain . net | experience comes from bad judgement.
domain: summertriangle | -- Mark Twain
I am not so sure what you are asking.
I believe that Fortran, even Fortran 2003, does not allow scalar
to structure assignment. Initialization is different from assignment,
but I believe it is also not allowed there. For large structures that
might mean a lot of assignment statements or initializations.
For comparison purposes note that PL/I does allow scalar to structure
assignment similar to scalar to array assignment. PL/I also allows
scalar/structure expressions, for example A=A+1; would add one to each
element of structure A.
> type :: Typ_1
> real(8) :: a1 = 100.
> real(8) :: a2 = 102.
> real(8) :: a3 = 103.
> real(8) :: a4
> .....
> .....
> .....
> .....
> real(8) :: a10
> end type Typ_1
> type(Typ_1) :: Typ1
> Typ1 = Typ_1(100.,102.,103.,104.....)
This example is confusing. Be sure that you know the
difference between initialization and assignment, especially
regarding the SAVE attribute.
-- glen
> Typ1 = Typ_1(100.,102.,103.,104.....)
Fortran 95 permits the syntax:
Typ1 = Typ_1_construct(a4 = 104.0)
--
write(*,*) transfer((/17.392111325966148d0,6.5794487871554595D-85, &
6.0134700243160014d-154/),(/'x'/)); end
> <li.s...@gmail.com> wrote in message
> news:1180968119.6...@g37g2000prf.googlegroups.com...
>
> > Typ1 = Typ_1(100.,102.,103.,104.....)
>
> Fortran 95 permits the syntax:
>
> Typ1 = Typ_1_construct(a4 = 104.0)
No. That's an f2003 feature - not f95.
I had to go check to make sure I had it right because I've been known to
confuse such things. Apparently I'm not the only one. :-)
> No. That's an f2003 feature - not f95.
> I had to go check to make sure I had it right because I've been known to
> confuse such things. Apparently I'm not the only one. :-)
Sigh. I send you back to check again.
! File: udt_assign.f90
! Public domain 2007 James Van Buskirk
module mykinds
implicit none
integer, parameter :: sp = kind(1.0)
integer, parameter :: dp = kind(1.0d0)
end module mykinds
module Typ1_mod
use mykinds
implicit none
type Typ_1
real(dp) :: a1 = 100.0_sp
real(dp) :: a2 = 102.0_sp
real(dp) :: a3 = 103.0_sp
real(dp) :: a4
real(dp) :: a5
real(dp) :: a6
real(dp) :: a7
real(dp) :: a8
real(dp) :: a9
real(dp) :: a10
end type Typ_1
interface assignment(=)
module procedure Typ_1_assign
end interface assignment(=)
contains
elemental function Typ_1_construct(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)
type(Typ_1) Typ_1_construct
real(sp), intent(in), optional :: a1
real(sp), intent(in), optional :: a2
real(sp), intent(in), optional :: a3
real(sp), intent(in), optional :: a4
real(sp), intent(in), optional :: a5
real(sp), intent(in), optional :: a6
real(sp), intent(in), optional :: a7
real(sp), intent(in), optional :: a8
real(sp), intent(in), optional :: a9
real(sp), intent(in), optional :: a10
if(present(a1)) then
Typ_1_construct%a1 = a1
end if
if(present(a2)) then
Typ_1_construct%a2 = a2
end if
if(present(a3)) then
Typ_1_construct%a3 = a3
end if
if(present(a4)) then
Typ_1_construct%a4 = a4
else
Typ_1_construct%a4 = 0
end if
if(present(a5)) then
Typ_1_construct%a5 = a5
else
Typ_1_construct%a5 = 0
end if
if(present(a6)) then
Typ_1_construct%a6 = a6
else
Typ_1_construct%a6 = 0
end if
if(present(a7)) then
Typ_1_construct%a7 = a7
else
Typ_1_construct%a7 = 0
end if
if(present(a8)) then
Typ_1_construct%a8 = a8
else
Typ_1_construct%a8 = 0
end if
if(present(a9)) then
Typ_1_construct%a9 = a9
else
Typ_1_construct%a9 = 0
end if
if(present(a10)) then
Typ_1_construct%a10 = a10
else
Typ_1_construct%a10 = 0
end if
end function Typ_1_construct
elemental subroutine Typ_1_assign(output, input)
type(Typ_1), intent(out) :: output
type(Typ_1), intent(in) :: input
output%a1 = input%a1
output%a2 = input%a2
output%a3 = input%a3
output%a4 = input%a4
output%a5 = input%a5
output%a6 = input%a6
output%a7 = input%a7
output%a8 = input%a8
output%a9 = input%a9
output%a10 = input%a10
end subroutine Typ_1_assign
end module Typ1_mod
program test
use mykinds
use Typ1_mod
implicit none
type(Typ_1) Typ1
Typ1 = Typ_1_construct(a4 = 104.0)
write(*,*) Typ1
end program test
! End of file: udt_assign.f90
Output with ifort:
100.000000000000 102.000000000000 103.000000000000
104.000000000000 0.000000000000000E+000 0.000000000000000E+000
0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000
0.000000000000000E+000
> "Richard Maine" <nos...@see.signature> wrote in message
> news:1hz6foy.1k1jqe4bxfembN%nos...@see.signature...
>
> > No. That's an f2003 feature - not f95.
>
> > I had to go check to make sure I had it right because I've been known to
> > confuse such things. Apparently I'm not the only one. :-)
>
> Sigh. I send you back to check again.
[sample code elided]
Oh. I see. You aren't actually talking about a structure constructor.
But then I guess you didn't say that you were. You are talking about a
reference to a user-written function. I missed the fact that the
function had a diferent name from the type, which should have clued me
in.
If f2003, this (with the type name) is directly the syntax of a
constructor.