[patch, libgfortran] PR24224 Generalized internal array IO not implemented.
Jerry DeLisle
jvdelisle@verizon.net
Tue Oct 18 03:09:00 GMT 2005
Paul Thomas wrote:
> Jerry,
>
> This is OK once you have responded to a few niggles and a question on
> the functioning of the patch:
>
>>
>> + array_loop_spec *ls; /* For traversing arrays */
>>
> I know that this is in keeping with the originator's style but could you
> start to set comments above and aligned with the line of code.
>
OK, will do.
>>
>> ! carry = 1;
>> ! record = 0;
>> ! rank = GFC_DESCRIPTOR_RANK(ioparm.internal_unit_desc);
>> ! ls = current_unit->ls;
>> ! for (i = 0; i < rank; i++)
>> ! {
>> ! if (carry)
>> ! {
>> ! ls[i].idx++;
>> ! if (ls[i].idx > ls[i].end)
>> ! {
>> ! ls[i].idx = ls[i].start;
>> ! carry = 1;
>> ! }
>> ! else
>> ! carry = 0;
>> ! }
>> ! record = record + (ls[i].idx - 1) * ls[i].step;
>> ! }
>>
> I think that it is worthwhile to break this out into a separate function
> while you are about it. I think that this section now appears four
> times between list_read.c and transfer.c?
>
I thought so also, will do.
>>
>> ! ! for (i=0; i<rank; ++i)
>> {
>> ! /* Initialize the loop specification */
>> ! internal_unit.ls[i].idx = 1;
>> ! internal_unit.ls[i].start = desc->dim[i].lbound;
>> ! internal_unit.ls[i].end = desc->dim[i].ubound;
>> ! internal_unit.ls[i].step = desc->dim[i].stride;
>> ! ! /* Determine the number of records */
>> ! ! record_count += (desc->dim[i].ubound -
>> desc->dim[i].lbound)
>> ! * desc->dim[i].stride;
>> }
>> return record_count;
>>
> ...and this too. This will make both this and the namelist code look a
> lot tidier.
>
Agree,
> Now for the question: I wonder if this behaves as it should?
>
> [prt@localhost mytests]# cat arrayio_test.f90
> character*4, dimension(8) :: abuf = (/"0123","4567","89AB","CDEF", &
> "0123","4567","89AB","CDEF"/)
> character*4, dimension(2,4) :: buf
> character*8 :: a
> equivalence (buf,abuf)
> read(buf(2, 1:3:2), '(a)') a
> print *,a
> end
>
> [prt@localhost mytests]# ./a.out
> 456789AB
>
> g95 and ifc yield
>
> 4567 ie. the end of record is acted upon.
>
> Paul
>
I will study this a bit. Without looking yet, I think s_alloc_r_at is not
catching the end of record. This may be a new bug. (I wonder if this really
should be a run time error, trying to read past end of record)
I will report back on this.
Thanks for comments,
Jerry
More information about the Fortran
mailing list