文書番号: 402042
最終更新日: 2004/04/27
#include <stdio.h> #include <stdlib.h> #include <vmemory.h> #include <malloc.h> #define HANDLE_MAX 100 // 最大のハンドル数 #define BLOCK_SIZE 60000L // 1ブロックに確保するメモリサイズ // 合計サイズは 100 X 60,000=6,000,000 (byte) void initvm( void ); // 仮想メモリの初期化処理 void termvm( void ); // 仮想メモリの終了処理 char d( long ); // 仮想メモリへの取得 void setd( long, char ); // 仮想メモリへの書き込み _vmhnd_t handle[ HANDLE_MAX ]; void initvm( void ) { int i; if( !_vheapinit( 0, _VM_ALLDOS, _VM_DISK ) ) // ここでは、DISKSWAP を利用 { // 必要に応じて変更して下さい printf( "Could not initialize virtual memory manager.\n" ); exit(-1); } for( i=0; i<HANDLE_MAX; i++ ) { if( ( handle[i]=_vmalloc( BLOCK_SIZE ) ) == _VM_NULL ) { _vheapterm(); printf( "Could not allocate virtual memory manager.\n" ); exit(-1); } } } void termvm( void ) { int i; for( i=0; i<HANDLE_MAX; i++ ) { _vfree( handle[i] ); } _vheapterm(); } char d( long pos ) { _vmhnd_t hnd; unsigned s; char _far *buf; if( pos > BLOCK_SIZE * HANDLE_MAX ) { printf( "Too large number:%ld",pos ); termvm(); exit(-1); } hnd = handle[ pos / BLOCK_SIZE ]; // pos の所属するハンドルは pos/BLOCK_SIZE となる s = (unsigned)( pos % BLOCK_SIZE ); // ハンドルの中での位置は pos/BLOCK_SIZE の余り buf = _vload( hnd, _VM_DIRTY ); return *( buf+s ); // 仮想メモリからの読み込み } void setd( long pos, char c ) { _vmhnd_t hnd; unsigned s; char _far *buf; if( pos > BLOCK_SIZE * HANDLE_MAX ) { printf("Too large number:%ld", pos); termvm(); exit(-1); } hnd = handle[ pos / BLOCK_SIZE ]; s = (unsigned)( pos % BLOCK_SIZE ); buf = _vload( hnd, _VM_DIRTY ); *( buf+s ) = c; // 仮想メモリへの書き込み } void main( void ) { long pos; initvm(); // 仮想メモリの初期化 for( pos=0; pos < BLOCK_SIZE * HANDLE_MAX; pos += 100000L ) { setd( pos, (char)(pos/100000) ); // 100000 個ごとに1加算して書き込む } for( pos=0; pos < BLOCK_SIZE * HANDLE_MAX; pos += 100000L ) { printf( "%d ",d(pos) ); // 検証の為、100000 個ごとの値を表示 } termvm(); // 仮想メモリの終了 }
Keywords: C7 KBHOWTO VC10 VC15 KB402042
Technology: kbAudDeveloper kbvc150 kbVCsearch kbZNotKeyword3 kbZNotKeyword8