Home
| Calendar
| Mail Lists
| List Archives
| Desktop SIG
| Hardware Hacking SIG
Wiki | Flickr | PicasaWeb | Video | Maps & Directions | Installfests | Keysignings Linux Cafe | Meeting Notes | Linux Links | Bling | About BLU |
On Fri, Aug 29, 2008 at 05:43:40PM -0400, Stephen Adler wrote: > Without doing pointer arithmatic, is it possible to use the standard > [][] notation somehow? If you really don't want to use pointer arithmetic, you can write a function to convert your multi-dimensional array into a single-dimensional array. What is logically represented as a multi-dimensional array in C is in actuality still a linear sequence of bytes (or words) in memory. The converted index is computed as: row * #columns + column int get_index(int x, int y, int columns){ return columns * y + x; } You could also write a getter and setter function that uses this. If we're bothering with all this, we prolly also want to check if we used values of x and y which are out of bounds for our array, so we'll use another variable to get the value, and pass its address to store the answer. The return value is -1 if x or y are out of bounds, 0 otherwise. int get_item(int x, int y, int columns, int rows, int *rc, int *data) { if ( x >= columns || y >= rows) return -1; *rc = data[get_index(x,y,columns)]; return 0; } int set_item(int x, int y, int columns, int rows, int value, int *data) { if ( x >= columns || y >= rows) return -1; data[get_index(x,y,columns)] = value; return 0; } Not exactly what you asked for, but it works. Note that in your example, data[y][x] is outside the range of your array, which has rows 0 to y-1, columns 0 to x-1. Thus this line is an error (plus it wouldn't have been the middle element). Here's a main function that uses the functions, more or less a copy of what you wrote: int main( int argc, char **argv ) { int *data; int value, x, y, i, j; x=3; y=3; data=(int *)malloc(x*y*sizeof(int)); /* populate the array */ for (i = 0; i < x; i++) for (j = 0; j < y; j++) set_item(i,j,x,y,(i+1) * (j+1), data); /* * This may or may not truly yeild the middle element... * there may not be any middle element, depending on the * values of x and y. */ if (get_item(x/2,y/2,x,y,&value,data)){ fprintf(stderr, "Index out of range\n"); return 1; } printf("Middle data element is %d\n", value); /* print the array (matrix) */ for (i = 0; i < x; i++){ for (j = 0; j < y; j++){ get_item(i,j,x,y,&value, data); printf("%3d ", value); } printf("\n"); } return 0; } Slap on an #include <stdio.h> and compile: $ gcc -o foo foo.c $ ./foo Middle data element is 4 1 2 3 2 4 6 3 6 9 -- Derek D. Martin http://www.pizzashack.org/ GPG Key ID: 0xDFBEAD02 -=-=-=-=- This message is posted from an invalid address. Replying to it will result in undeliverable mail due to spam prevention. Sorry for the inconvenience. _______________________________________________ Discuss mailing list [hidden email] http://lists.blu.org/mailman/listinfo/discuss foo.c (1K) Download Attachment
BLU is a member of BostonUserGroups | |
We also thank MIT for the use of their facilities. |