多维数组——整数类型

来源:互联网 发布:现代网络语言的英文 编辑:程序博客网 时间:2024/06/05 09:21
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>

#include <math.h>


class  CArray
{
public:
CArray();
CArray( int iDim, ... );
virtual ~CArray();


void SetDim( int iDim, va_list vp );


bool SetValue( int iValue, ... );
int GetValue( int iValue, ... );






protected:
int Locate( va_list vp );


private:
int m_iDim; //维数
int* m_pBound;//数组的维数元素个数
int* m_pBase; //数组基址
int* m_pConstants;//数组映像函数常量地址
};


CArray::CArray()
{

}


CArray::CArray( int iDim, ... )
{
va_list vl;
va_start( vl, iDim);
SetDim( iDim, vl );
va_end( vl );
}


CArray::~CArray()
{
if( m_pBase )
{
free( m_pBase );
m_pBase = NULL;
}


if( m_pBound )
{
free( m_pBound );
m_pBound = NULL;
}


if( m_pConstants )
{
free( m_pConstants );
m_pConstants = NULL;
}
}


bool CArray::SetValue( int iValue, ... )
{
va_list vl;
va_start( vl, iValue );


int iOff = Locate( vl );

m_pBase[iOff] = iValue;


return true;
}

//此处iValue无用 对va_start理解不完备

int CArray::GetValue( int iValue, ... )
{
va_list vl;
va_start( vl, iValue );


int iOff = Locate( vl );


iValue = m_pBase[iOff ];
return iValue;
}


int CArray::Locate( va_list vp )
{
int iOff = 0;
for( int i = 0; i < m_iDim; ++i )
{
int iCur = va_arg( vp, int );
iOff += iCur * m_pConstants[i];
}


return iOff;
}


void CArray::SetDim( int iDim, va_list vp )
{
m_iDim = iDim;
m_pBound = (int*)malloc( m_iDim * sizeof( int ) );
if( !m_pBound )
{
exit( OVERFLOW );
}

int iNum = 1;

for( int i = 0; i < iDim; ++i )
{
m_pBound[i] = va_arg( vp, const int );
iNum *= m_pBound[i];
}

m_pBase = (int*)malloc( iNum * sizeof( int ) );
m_pConstants = (int*)malloc( m_iDim * sizeof(int ) );

m_pConstants[ m_iDim - 1 ] = 1;

for( int iPos = m_iDim - 2; iPos >= 0; --iPos )
{
m_pConstants[iPos] = m_pConstants[iPos + 1] * m_pBound[ iPos + 1 ];
}
}


int main(int argc, char* argv[])
{
CArray arr( 3, 3, 2, 5);


int iValue = 0;
for( int i = 0; i < 3; ++i )
{
for( int j = 0; j < 2; ++j )
{
for( int k = 0; k < 5; ++k )
{
arr.SetValue(iValue++, i, j, k );
}
}
}


for( int iPos = 0; iPos < 3; ++iPos )
{
for( int j = 0; j < 2; ++j )
{
for( int k = 0; k < 5; ++k )
{
int iValue;
int iCur = arr.GetValue(iValue, iPos, j, k );

printf( "%d ", iCur );
}
printf( "\n");
}
printf( "\n");
}


return 0;
}

0 0
原创粉丝点击