本ページは公開が終了した情報の複製であり、掲載時点での情報です。本ページに記載されている内容について各所に問い合わせることはご遠慮下さい。
サポート技術情報

[MSC]仮想メモリ関数を利用した大きなデータを配列のように扱うサンプル

文書番号: 402042

最終更新日: 2004/04/27


この資料は以下の製品について記述したものです。


概要

この資料は、仮想メモリ関数を利用して大きなデータを配列のように扱うサンプルプ ログラムです。

サンプルをご覧になる前に

このサンプルプログラムは、関数の使用方法の一例として提示するもので、十分にテ ストされた信頼されるものではありません。個人の学習のための使用、修正、分割
については、自由に行っていただけますが、このサンプルに関しての、サポート、
説明等は一切お受けしかねますのであらかじめご了承ください。また、このプロ
グラムを実行し発生した、いかなる障害も、弊社では責任を負いません。

詳細

このサンプルプログラムは、仮想メモリ関数を利用する4つの関数とそれらの関数を呼 び出す1つのメインプログラムから構成されています。各関数の機能は以下の通りで す。

void initvm(void)

仮想メモリの初期化を行います。ここで HANDLE_MAX × BLOCK_SIZE byte の仮想メモリ ブロックを割り当てます。割り当てに失敗した場合は、エラーを表示しプログラムを 終了します。

void termvm( void )

initvm 関数で確保した仮想メモリを開放し、仮想メモリの終了処理を行います。

char d( long   pos )

引数 (pos) に配列の添字のように仮想メモリの位置として数値を指定し、仮想メモリ から値を読みだします。

char setd( long pos, char c )

第1引数 (pos) に仮想メモリの位置、第2引数 (c) に値を指定し、仮想メモリに値を書き 込みます。

メイン関数( main() )

仮想メモリ上に 100,000 byte おきに値を書き込み、正常に書き込まれた事を値を読み だして検証します。

サンプルプログラム

  #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();                             // 仮想メモリの終了
  }

詳細

  • Visual C++ は、米国 Microsoft Corporation の商標です。

Keywords: C7 KBHOWTO VC10 VC15 KB402042
Technology: kbAudDeveloper kbvc150 kbVCsearch kbZNotKeyword3 kbZNotKeyword8

inserted by FC2 system