メモリアクセス

  レイアウト

24バイトのメモリエリアのフォーマットを定義しています




  初期化

  
char Layout[24];

int i;

for( i = 0; i < sizeof(Layout); i++ ) {
	Layout[i] = 0x00;
}
  



  データーセット

  
*((long *)Layout+0)	= 101;
*((short *)(Layout+4))	= 102;
*((short *)(Layout+6))	= 103;
*(Layout+8)		= 'A';
*(Layout+8+1)		= 'B';
*(Layout+8+2)		= 'C';
*((long *)(Layout+20))	= 104;
  



  構造体による参照

  
struct LAYOUT {
	long a;
	short b;
	short c;
	char d[12];
	long e;
} *lo;

lo = (struct LAYOUT *)Layout;

printf( "%ld\n", lo->a );
printf( "%d\n", lo->b );
printf( "%d\n", lo->c );
printf( "%s\n", lo->d );
printf( "%ld\n", lo->e );
  

構造体は、要するに前述のアドレス計算やポインタのキャスト
等を C コンパイラにさせる為の方法です



  構造体使用による通常処理

  
#include <string.h>
#include <memory.h>
が必要です
  

  
typedef struct _LAYOUT {
	long a;
	short b;
	short c;
	char d[12];
	long e;
} LAYOUT;

LAYOUT Layout;

memset( &Layout, 0x00, sizeof( Layout ) );

Layout.a = 101;
Layout.b = 102;
Layout.c = 103;
strcpy( Layout.d, "ABC" );
Layout.e = 104;

printf( "%ld\n", Layout.a );
printf( "%d\n", Layout.b );
printf( "%d\n", Layout.c );
printf( "%s\n", Layout.d );
printf( "%ld\n", Layout.e );
  



  short 型の配列に対する処理



  
short Layout[12];

int i;

for( i = 0; i < sizeof(Layout)/2; i++ ) {
	Layout[i] = 0x0000;
}

*((long *)Layout+0)	= 101;
*(Layout+2)		= 102;
*(Layout+3)		= 103;
*(Layout+4)		= 0x4241;
*(Layout+5)		= 0x0043;
*((long *)(Layout+10))	= 104;

struct LAYOUT {
	long a;
	short b;
	short c;
	char d[12];
	long e;
} *lo;

lo = (struct LAYOUT *)Layout;

printf( "%ld\n", lo->a );
printf( "%d\n", lo->b );
printf( "%d\n", lo->c );
printf( "%s\n", lo->d );
printf( "%ld\n", lo->e );
  



  long 型の配列に対する処理



  
long Layout[6];

int i;

for( i = 0; i < sizeof(Layout)/4; i++ ) {
	Layout[i] = 0x00000000;
}

*(Layout+0)	= 101;
*(Layout+1)	= 0x00670066;
*(Layout+2)	= 0x00434241;
*(Layout+5)	= 104;

struct LAYOUT {
	long a;
	short b;
	short c;
	char d[12];
	long e;
} *lo;

lo = (struct LAYOUT *)Layout;

printf( "%ld\n", lo->a );
printf( "%d\n", lo->b );
printf( "%d\n", lo->c );
printf( "%s\n", lo->d );
printf( "%ld\n", lo->e );
  



  構造体のポインタ渡し

  
#include <memory.h>

// 構造体の定義
struct LAYOUT {
	long a;
	short b;
	short c;
	char d[12];
	long e;
};

// 関数の宣言
void test( struct LAYOUT * );

int main()
{

	long Layout[6];

	int i;

	for( i = 0; i < sizeof(Layout)/4; i++ ) {
		Layout[i] = 0x00000000;
	}

	*(Layout+0)	= 101;
	*(Layout+1)	= 0x00670066;
	*(Layout+2)	= 0x00434241;
	*(Layout+5)	= 104;

	// 構造体の定義 (メモリエリア確保)
	struct LAYOUT lo;

	// Layout より構造体へデータをコピー
	memcpy( &lo, Layout, sizeof( struct LAYOUT ) );

	// 関数呼び出し
	test( &lo );

	return 0;
}

void test( struct LAYOUT *a )
{

	printf( "%ld\n", a->a );
	printf( "%d\n", a->b );
	printf( "%d\n", a->c );
	printf( "%s\n", a->d );
	printf( "%ld\n", a->e );

}
  



  typedef による簡素化

  
#include <memory.h>

// _LAYOUT はなんでもかまいませんが、偶然使われる可能性の低い文字列を指定します
// この記述によって、データ型 LAYOUT が定義されます
typedef struct _LAYOUT {
	long a;
	short b;
	short c;
	char d[12];
	long e;
} LAYOUT;

void test( LAYOUT * );

int main()
{

	long Layout[6];

	int i;

	for( i = 0; i < sizeof(Layout)/4; i++ ) {
		Layout[i] = 0x00000000;
	}

	*(Layout+0)	= 101;
	*(Layout+1)	= 0x00670066;
	*(Layout+2)	= 0x00434241;
	*(Layout+5)	= 104;

	LAYOUT lo;

	memcpy( &lo, Layout, sizeof( LAYOUT ) );

	test( &lo );

	return 0;
}

void test( LAYOUT *a )
{

	printf( "%ld\n", a->a );
	printf( "%d\n", a->b );
	printf( "%d\n", a->c );
	printf( "%s\n", a->d );
	printf( "%ld\n", a->e );

}
  










  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ