Revision: 470
http://assorted.svn.sourceforge.net/assorted/?rev=470&view=rev
Author: yangzhang
Date: 2008-02-18 19:58:19 -0800 (Mon, 18 Feb 2008)
Log Message:
-----------
more md-array fun
Modified Paths:
--------------
sandbox/trunk/src/c/mdarray.c
Modified: sandbox/trunk/src/c/mdarray.c
===================================================================
--- sandbox/trunk/src/c/mdarray.c 2008-02-19 00:13:41 UTC (rev 469)
+++ sandbox/trunk/src/c/mdarray.c 2008-02-19 03:58:19 UTC (rev 470)
@@ -1,18 +1,48 @@
-int xss[3][5];
+#include <stdio.h>
+enum { outer = 3, inner = 5 };
+
+// This is an Array[outer, Array[inner, Int]]
+int xss[outer][inner];
+
int
main()
{
- // Don't work.
+ // These don't work.
// int **yss = xss;
- // int *yss = xss;
- // int **yss = xss;
- // int **yss = &&xss[0];
- int (*yss)[5] = xss;
+ // int **yss = &xss[0];
+ // int **yss = &&xss[0][0];
- int sum = 0;
- for (int i = 0; i < 3; i++)
- for (int j = 0; j < 5; j++)
- sum += yss[i][j];
- return sum;
+ // This is a Pointer[Array[inner, Int]].
+ int (*yss)[inner] = xss;
+
+ {
+ // This is safe.
+ printf("method 0: indexing\n");
+ int sum = 0;
+ for (int i = 0; i < outer; i++) {
+ printf("outer visiting: %p\n", &yss[i]);
+ for (int j = 0; j < inner; j++) {
+ printf("inner visiting: %p\n", &yss[i][j]);
+ sum += yss[i][j];
+ }
+ }
+ printf("sum = %d\n", sum);
+ }
+
+ {
+ // This method is wrong, running off into segfault land.
+ printf("method 1: pointers\n");
+ int sum = 0;
+ for (int (*p)[5] = yss; p < yss + outer; p++) {
+ printf("outer visiting: %p\n", p);
+ for (int *q = *p; q < q + inner; q++) {
+ printf("inner visiting: %p\n", q);
+ sum += *q;
+ }
+ }
+ printf("sum = %d\n", sum);
+ }
+
+ return 0;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|