swatt (09/27/82)
From decvax!ucbvax!mark.umcp-cs@UDel-Relay Mon Sep 27 00:41:47 1982
Date: 25 Sep 82 0:54:15-EDT (Sat)
From: Mark Weiser <ucbvax!mark.umcp-cs@UDel-Relay>
Subject: Why Watt is not much better than... (at times)
Message-Id: <8208270307.11478@UCBVAX.BERKELEY.ARPA>
Received: by UCBVAX.BERKELEY.ARPA (3.207 [9/26/82])
id A11478; 26-Sep-82 20:07:58-PDT (Sun)
To: unix-wizards@Sri-Unix
Cc: decvax!ittvax!swatt@Ucb-C70
Via: UMCP-CS; 25 Sep 82 2:59-EDT
About the advice recently seen here about how to do double subscripting
trickily: it doesn't work. I copied the following program straight
off the mail. Is my C compiler funny or what (Berkeley 4.1)?
The output is given at the bottom.
#define MATRIX(X,Y) matrix[((X)*n) + (Y)]
double norm (n, matrix)
register n;
register double *matrix; /* It's REALLY a pointer; don't
* believe the manuals on
* "matrix[]" as function arguments!
*/
{
int i,j;
double z;
MATRIX(0, 0) = 3.14159;
}
main()
{
double m[10][10];
norm(10,m);
m[1][1] = 3.1415926;
printf("%7.2f %7.2f\n",m[0,0],m[1,1]);
}
OUTPUT:
-375522559659364100000000000.000000 3.14
I hope this gets back to you; I've had trouble with internet
replies before.
You are mixing Pascal and C subscripting conventions. A
two-dimensional array in C is subscripted "a[e1][e2]", NOT
"a[e1,e2]" as your example shows. Your example is perfectly
legal: the ',' operator means "evaluate expression on left;
discard; evaluate expression on right, which is the value of the
expression as a whole". Thus "m[0,0]" means evaluate 0 (not hard
to do); discard; evaluate 0 again (no harder second time around),
and this is the value of the subscript expression. Under C
conversion rules "m[0]" is a pointer which is equal to
"&m[0][0]". What you passed on the stack to "printf" was an
address; the resulting interpretation as a floating point number
is justifiably garbage (I know; Pascal wouldn't let you mismatch
parameter types on function calls).
With the offending line in your example changed to:
printf("%7.2f %7.2f\n",m[0][0],m[1][1]);
The output is now:
3.14 3.14
I was not trying to put down Pascal; I was just trying to offer
some advice to people like yourself who are interested in getting
certain kinds of jobs done with a minimum of interference from
the programming language involved. I don't regard the techniques
offered as "tricky", since they rely not on details of any
particular implementation of the language, but rules of the
language itself.
Granted, it is not as nice as a language like Pascal (or
Fortran), which allows you to declare array bounds passed to
procedures as variables, and you have to be careful to understand
what you're doing with more than two dimensions, but it DOES get
the job done. Isn't that what it all comes down to?
- Alan S. Watt