#include <stdio.h>
#include <stdarg.h>
#define reg register
int
array_offset( int arrayinfo[], ... );
int
main()
{
int a[7] = { 3, 0, 3, 1,4, 2,6};
printf( "%d \n ", array_offset( a, 2, 3, 4 ) );
return 0;
}
int
array_offset( int arrayinfo[], ... )
{
reg int ndim;
reg int offset;
reg int lo, hi;
reg int i;
int s[ 10 ];
va_list subscripts;
ndim = *arrayinfo++;
if( ndim >= 1 && ndim <= 10 )
{
va_start( subscripts, arrayinfo );
for( i = 0; i < ndim; i++ )
{
s[i] = va_arg( subscripts, int );
}
va_end( subscripts );
offset = 0;
for( i = 0; i < ndim; i++ )
{
lo = *arrayinfo++;
hi = *arrayinfo++;
if( s[i] < lo || s[i] > hi )
{
return -1;
}
offset *= hi - lo + 1;
offset += s[i] - lo;
}
return offset;
}
return -1;
}
#include <stdio.h>
void matrix_multiply(int x, int y, int z, int (*m1)[y], int (*m2)[z], int (*r)[z] );
int main()
{
int a[2][2] = { 1, 1, 1, 1 };
int b[2][1] = { 1, 1 };
int r[2][1]={0, 0};
matrix_multiply( 2, 2, 1, a, b, r);
int i = 0;
for( i = 0; i < 2; i++)
printf( "%d \n", r[i][0] );
printf("\n");
return 0;
}
void matrix_multiply(int x, int y, int z, int (*m1)[y], int (*m2)[z], int (*r)[z] )
{
int i = 0;
int j = 0;
int k = 0;
for( i = 0; i < x; i++ )
for( j = 0; j < z; j++ )
{
k = 0; // 原来忘初始化k,出现了计算错误。谨记
while( k < y )
{
*( *(r+i) + j ) += (*( *(m1+i) + k )) * ( *( *(m2+k) + j ));
k++;
}
}
}