Multidimensional Arrays in C (Explained using date conversion program)
By: Abinaya Emailed: 1601 times Printed: 2075 times
Latest comments

Consider the problem of date conversion, from day of the month to day of the year and vice versa. For example, March 1 is the 60th day of a nonleap year, and the 61st day of a leap year. Let us define two functions to do the conversions: day_of_year converts the month and day into the day of the year, and month_day converts the day of the year into the month and day. Since this latter function computes two values, the month and day arguments will be pointers:
month_day(1988, 60, &m, &d)sets m to 2 and d to 29 (February 29th).
These functions both need the same information, a table of the number of days in each month (``thirty days hath September ...''). Since the number of days per month differs for leap years and nonleap years, it's easier to separate them into two rows of a twodimensional array than to keep track of what happens to February during computation. The array and the functions for performing the transformations are as follows:
static char daytab[2][13] = { {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} }; /* day_of_year: set day of year from month & day */ int day_of_year(int year, int month, int day) { int i, leap; leap = year%4 == 0 && year%100 != 0  year%400 == 0; for (i = 1; i < month; i++) day += daytab[leap][i]; return day; } /* month_day: set month, day from day of year */ void month_day(int year, int yearday, int *pmonth, int *pday) { int i, leap; leap = year%4 == 0 && year%100 != 0  year%400 == 0; for (i = 1; yearday > daytab[leap][i]; i++) yearday = daytab[leap][i]; *pmonth = i; *pday = yearday; }Recall that the arithmetic value of a logical expression, such as the one for leap, is either zero (false) or one (true), so it can be used as a subscript of the array daytab.
The array daytab has to be external to both day_of_year and month_day, so they can both use it. We made it char to illustrate a legitimate use of char for storing small noncharacter integers.
daytab is the first twodimensional array we have dealt with. In C, a twodimensional array is really a onedimensional array, each of whose elements is an array. Hence subscripts are written as
daytab[i][j] /* [row][col] */rather than
daytab[i,j] /* WRONG */Other than this notational distinction, a twodimensional array can be treated in much the same way as in other languages. Elements are stored by rows, so the rightmost subscript, or column, varies fastest as elements are accessed in storage order.
An array is initialized by a list of initializers in braces; each row of a twodimensional array is initialized by a corresponding sublist. We started the array daytab with a column of zero so that month numbers can run from the natural 1 to 12 instead of 0 to 11. Since space is not at a premium here, this is clearer than adjusting the indices.
If a twodimensional array is to be passed to a function, the parameter declaration in the function must include the number of columns; the number of rows is irrelevant, since what is passed is, as before, a pointer to an array of rows, where each row is an array of 13 ints. In this particular case, it is a pointer to objects that are arrays of 13 ints. Thus if the array daytab is to be passed to a function f, the declaration of f would be:
f(int daytab[2][13]) { ... }It could also be
f(int daytab[][13]) { ... }since the number of rows is irrelevant, or it could be
f(int (*daytab)[13]) { ... }which says that the parameter is a pointer to an array of 13 integers. The parentheses are necessary since brackets [] have higher precedence than *. Without parentheses, the declaration
int *daytab[13]is an array of 13 pointers to integers. More generally, only the first dimension (subscript) of an array is free; all the others have to be specified.
C Home  All C Tutorials  Latest C Tutorials
Sponsored Links 
If this tutorial doesn't answer your question, or you have a specific question, just ask an expert here. Post your question to get a direct answer.

Comments(0)
Be the first one to add a comment
Most Viewed Articles (in C )

Most Emailed Articles (in C)
