- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi, I am trying to understand ALLOCATED(), ASSOCIATED(), and the Fortran rules surrounding pointer objects. Different compilers seem to produce different results, which is distressing; maybe because of how the spec is interpreted? I created this code:
character(len=128), pointer :: pname
allocate(pname)
pname = "Testing"
print *, "Print2d1 ", pname
print *, "Print2d2 ", allocated(pname), associated(pname)
and ifort and ifx output the following:
cwe476-5.f90(63): error #7397: The argument of the ALLOCATED inquiry intrinsic function should have the ALLOCATABLE attribute. [PNAME]
print *, "Print2d2 ", allocated(pname), associated(pname)
-----------------------------------^
cwe476-5.f90(63): error #6547: The ARRAY argument of the ALLOCATED inquiry intrinsic function shall be an allocatable array. [PNAME]
print *, "Print2d2 ", allocated(pname), associated(pname)
-----------------------------------^
- I thought pointers were defacto allocatable?
- Section 13.7.9 of the F08 spec states that ALLOCATED() is applicable to an array or scalar.
On top of that, if I simply drop line 5 above (the print* containing ALLOCATED()), ifort compiles without complaint and outputs this:
Print2d1
Testing
so it seems pname was allocated (and thus is allocatable) and an anonymous target was created?
It's also important to note that, if I leave out "allocate(pname)", ifort compiles but aborts with "Program Exception - access violation", again seeming to confirm that pname is allocatable and indeed was allocated.
So, why does ifort raise the error messages? In contrast, ftn95 compiles the original code at top with a warning about PNAME not being allocatable, and produces this:
Print2d1 Testing
Print2d2 T T
Thank you!
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Your assumption that pointers were defacto allocatable is incorrect. While you can ALLOCATE a pointer, you cannot use the ALLOCATED intrinsic on a pointer.
Actual arguments you pass to ALLOCATED must have the ALLOCATABLE attribute.
Similarly, ASSOCIATED expects arguments to have the POINTER attribute.
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Your assumption that pointers were defacto allocatable is incorrect. While you can ALLOCATE a pointer, you cannot use the ALLOCATED intrinsic on a pointer.
Actual arguments you pass to ALLOCATED must have the ALLOCATABLE attribute.
Similarly, ASSOCIATED expects arguments to have the POINTER attribute.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
You may also want to review the Fortran Discourse site at Fortran Discourse - Fortran open source community (fortran-lang.discourse.group) for some discussions around objects of `POINTER` attribute and other aspects around Fortran.
Separately, you may want to note much water has flown under the bridge between when your `ftn95` was last updated and now. The current Intel Fortran compiler strives to conform to Fortran 2018 standard with increasing levels of Fortran 2023 being added with each revision. Thus you may want to refer to the current Fortran standard and its semantics to relate to Intel Fortran behavior.
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page