Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP
Posting-Version: version B 2.10.1 6/24/83; site ecsvax.UUCP
Path: utzoo!watmath!clyde!burl!ulysses!allegra!bellcore!decvax!mcnc!ecsvax!dgary
From: dgary@ecsvax.UUCP
Newsgroups: net.lang.c,net.lang.f77
Subject: Re: Converting FORTRAN to C
Message-ID: <431@ecsvax.UUCP>
Date: Wed, 2-Jan-85 12:19:29 EST
Article-I.D.: ecsvax.431
Posted: Wed Jan  2 12:19:29 1985
Date-Received: Fri, 4-Jan-85 00:15:35 EST
References: <435@ukma.UUCP>
Organization: Duke U Comp Ctr
Lines: 56
Xref: watmath net.lang.c:3666 net.lang.f77:204

David Herron's posting prompts me to clarify and correct my comments on
C's lack of the valuable ability to pass varying sized arrays of two or
more dimensions.  To recap briefly, FORTRAN and a few other languages
allow the passing of arrays to subroutines without the subroutine
"knowing" in advance the size of the array.  This is true in C only for
one-dimensional arrays, or multi-dimensional "arrays" set up as a chain
of arrays of pointers to arrays.

David repeats a common misconception when he says:

>                          ... Meaning
> that a two dimensioned array is actually a one dimensioned array of
> int *'s to one dimensioned arrays of ints.  This builds as you build
> deeper levels of indexing.

It is, of course, possible to create such an "array" in C, but an array
declared, say, "float array[20][30]" is NOT set up as an array of
pointers to an array of floats; it is all in contiguous storage, and C
does a routine subscript calculation to determine the offset (see K&R,
for example).  In a sense, this is a case of ambiguity in the C notation
array[][]; the compiler has to know the kind of animal it's dealing
with.  In practice, of course, this information is readily available
from the symbol table, and I can't think of too many cases where
the exact semantics would be important to the programmer.  Perhaps a
notation of array[i;j] would be useful for two-dimensional arrays of the
conventional (i.e., continguous storage) variety.   Anyway, David goes
on to quote me:

>> It is possible to pass variant-sized arrays in C by passing an array of
>> pointers to arrays, or by simulating a 2-dimensional array by means of a
>> one-dimensional one (handling the subscript computation with a #define
>> or a subroutine would be easiest here).  But I would like to see this
>> simple feature added to C; I doubt it would break any existing programs.
>
>Why is this important?  The compiler doesn't need to know how big arrays
>are ... ?
>
> David Herron;  ARPA-> "ukma!david"@ANL-MCS
> (Try the arpa address w/ and w/o the quotes, I have had much trouble with both.)
>
> UUCP          -:--:--:--:--:--:--:--:--:-          (follow one of these routes)
>
>{ucbvax,unmvax,boulder,research} ! {anlams,anl-mcs} -----\  vvvvvvvvvvv
>							  >-!ukma!david
>   {cbosgd!hasmed,mcvax!qtlon,vax135,mddc} ! qusavx -----/  ^^^^^^^^^^^

The compiler needs to know all but the last dimension size to compute
the offset.  By the way, I was incorrect when I said that C did not
specify row-major storage; it does, in fact, and David's description of
why is accurate and succinct.
-- 

D Gary Grady
Duke University Computation Center, Durham, NC  27706
(919) 684-4146
USENET:  {decvax,ihnp4,akgua,etc.}!mcnc!ecsvax!dgary