Powered by SmartDoc

ソフトウェア概論A/B (2014/01/17)
Ver. 1.0

2014年1月17日
栗野 俊一
kurino@math.cst.nihon-u.ac.jp
http://edu-gw2.math.cst.nihon-u.ac.jp/~kurino/2013/soft/soft.html
ソフトウェア概論 A/B2014年1月17日 の資料

目次

講義資料

当日の OHP 資料

Download

講義で利用するサンプルプログラム

Download : sample-001.c ( SJIS 版 )

sample-001.c
/*
 * 2014/01/10 sample-001.c
 */

/*
 *
 */

#include <stdio.h>

/*
 *
 */

int main ( void ) {
	int a = 111;	/* 並んだ変数は、恐らく、連続したメモリにある(保証はない) */
	int b = 222;	/* a, b, c の順か c, b, a の順かは解らない */
	int c = 999;	/* 並んでいれば b は a と c の間にある */
					/* それならば、「&a + ((&c-&a)/2) 」は「&b」に一致する筈 */

  /*
   *	以下の結果は、人によって異なるし、場合によれば、毎回異なるかもしれない
   */

	printf ( "&a = %x\n", &a );
	printf ( "&b = %x\n", &b );
	printf ( "&c = %x\n", &c );

  /*
   *	次の結果は、(a,b,c が並んでいれば..) 絶対値は 2 になる
   */

	printf ( "&c - &a = %d\n", &c - &a );

  /*
   *	次のアドレス計算の結果は、&b と同じになるはず..
   */

	printf ( "&a + (&c-&a)/2 = %x ( &b = %x )\n", &a + (&c-&a)/2, &b );

  /*
   * 変数 a と変数 c の間の変数 (b) の値を出す
   * 「b」という「変数名」の代りに「*(&a + (&c-&a)/2)」という「式」が使える
   */

   printf ( "*(&a + (&c-&a)/2) = %d ( b = %d )\n", *(&a + (&c-&a)/2), b );

  /*
   * 
   */

  return 0;
}

/*
 *
 */
sample-001.c の実行結果
C:\usr\c>sample-001
&a = bfdb4364
&b = bfdb4368
&c = bfdb436c
&c - &a = 2
&a + (&c-&a)/2 = bfdb4368 ( &b = bfdb4368 )
*(&a + (&c-&a)/2) = 222 ( b = 222 )
C:\usr\c> 

Download : sample-002.c ( SJIS 版 )

sample-002.c
/*
 * 2014/01/10 sample-002.c
 */

/*
 *
 */

#include <stdio.h>

/*
 *
 */

int main ( void ) {
	int a = 345;	/* 整数型の変数 a */
	int b = 321;	/* 整数型の変数 b */
	int *p;			/* 整数へのポインター型の変数 p */

  /*
   * 
   */

	p = &a;			/* p に変数 a のポインタ値を代入 (p が a を指す) */

  /*
   * 
   */

   printf ( "p = %x (&a = %x)\n", p, &a );			/* p の値 */
   printf ( "*p = %d (a=%d, b=%d)\n", *p, a, b );	/* *p の値は 変数 a の値と同じ */

  /*
   * 
   */

   a = 666;									/* 変数 a の値を変更 */
   printf ( "*p = %d (a=%d, b=%d)\n", *p, a, b );	/* *p の値は 変数 a の値と同じ */

  /*
   * 
   */

   *p = 789;								/* *p を経由して変数 a の値を変更 */
   printf ( "*p = %d (a=%d, b=%d)\n", *p, a, b );	/* 変数 a の値と同じ */
   printf ( "p = %x (&a = %x)\n", p, &x );		/* p の値が変るわけではない */

  /*
   * 
   */

   p = &b;			/* 今度は p が b を指す (pの値が変化) */

   printf ( "*p = %d (a=%d, b=%d)\n", *p, a, b );	/* 変数 b の値と同じ */

  /*
   * 
   */

   *p = 111;								/* *p を経由して変数 b の値を変更 */
   printf ( "*p = %d (a=%d, b=%d)\n", *p, a, b );	/* 変数 b の値が変化 */

  /*
   * 
   */

  return 0;
}

/*
 *
 */
sample-002.c の実行結果
C:\usr\c>sample-002
&a = bf90b564
&b = bf90b568
&c = bf90b56c
&c - &a = 2
&a + (&c-&a)/2 = bf90b568 ( &b = bf90b568 )
*(&a + (&c-&a)/2) = 222 ( b = 222 )
C:\usr\c> 

Download : sample-003.c ( SJIS 版 )

sample-003.c
/*
 * 2014/01/10 sample-003.c
 */

/*
 *
 */

#include <stdio.h>

/*
 *
 */

void print_and_inc_with_pointer ( int *p )	{

	/*
	 * ポインター値も「値」なので、引数に渡す事ができる
	 */

	/* 引数で指定されたポインタで指す変数の値を表示し、10 倍にする */

	printf ( "(P) Pre  : *p = %d ( p = %x )\n", *p, p );	/* p は &a 等と同じ */

	*p = *p * 10;		/* 10 倍する */

	printf ( "(P) Post : *p = %d ( p = %x )\n", *p, p );

}

/*
 *
 */

void print_and_inc_without_pointer ( int v )	{

	/* 引数で指定された値は、仮引数変数 (v) にコピーされる */

	/* 引数で指定された値を表示し、10 倍にする */

	printf ( "(V) Pre  : v = %d ( &v = %x )\n", v, &v );	/* &v は &a と違う */

	v = v * 10;		/* 10 倍する : 変更されるのはコピーの方 */

	printf ( "(V) Post : v = %d ( &v = %x )\n", v, &v );

}

/*
 *
 */

int main ( void ) {
	int a = 12;
	int b = 78;
	int *p = &a;

  /*
   *
   */

   printf ( "1: a = %d, b = %d, *p = %d(p=%x)\n\n", a, b, *p, p );	/* 最初 */

   a = a * 10;								/* a も b を 10 倍に */
   b = b * 10;
   printf ( "2: a = %d, b = %d, *p = %d(p=%x)\n\n", a, b, *p, p );

   *p = *p * 10;							/* ポインタ経由で a だけ 10 倍に */
   printf ( "3: a = %d, b = %d, *p = %d(p=%x)\n\n", a, b, *p, p );

   printf ( "*p without pointer\n" );
   print_and_inc_without_pointer ( *p );
   printf ( "4: a = %d, b = %d, *p = %d(p=%x)\n\n", a, b, *p, p );

   printf ( "p with pointer\n" );
   print_and_inc_with_pointer ( p );	/* &a でも OK */
   printf ( "5: a = %d, b = %d, *p = %d(p=%x)\n\n", a, b, *p, p );

   printf ( "b with pointer\n" );
   print_and_inc_with_pointer ( &b );
   printf ( "6: a = %d, b = %d, *p = %d(p=%x)\n\n", a, b, *p, p );

  /*
   * 
   */

  return 0;
}

/*
 *
 */
sample-003.c の実行結果
C:\usr\c>sample-003
1: a = 12, b = 78, *p = 12(p=bf8d4ca4)

2: a = 120, b = 780, *p = 120(p=bf8d4ca4)

3: a = 1200, b = 780, *p = 1200(p=bf8d4ca4)

*p without pointer
(V) Pre  : v = 1200 ( &v = bf8d4c80 )
(V) Post : v = 12000 ( &v = bf8d4c80 )
4: a = 1200, b = 780, *p = 1200(p=bf8d4ca4)

p with pointer
(P) Pre  : *p = 1200 ( p = bf8d4ca4 )
(P) Post : *p = 12000 ( p = bf8d4ca4 )
5: a = 12000, b = 780, *p = 12000(p=bf8d4ca4)

b with pointer
(P) Pre  : *p = 780 ( p = bf8d4ca8 )
(P) Post : *p = 7800 ( p = bf8d4ca8 )
6: a = 12000, b = 7800, *p = 12000(p=bf8d4ca4)

C:\usr\c> 

Download : sample-004.c ( SJIS 版 )

sample-004.c
/*
 * 2014/01/10 sample-004.c
 */

/*
 *
 */

#include <stdio.h>

/*
 *
 */

int main ( void ) {
	int a0 = 10;
	int a1 = 11;
	int a2 = 12;
	int a3 = 13;
	int a4 = 14;
	int *p;
	int i;

	printf ( "&a0 = %x\n", &a0 );
	printf ( "&a1 = %x\n", &a1 );
	printf ( "&a2 = %x\n", &a2 );
	printf ( "&a3 = %x\n", &a3 );
	printf ( "&a4 = %x\n", &a4 );

	printf ( "a2 = %d\n", a2 );

	p = &a0;

	for ( i = 0; i < 5; i++ ) {
		*p = *p * 100;				/* p の指す場所を 100 倍する */
		printf ( "p = %x\n", p );
		p = p + ((&a4 - &a0)/4);	/* p の指す場所を一つずらす */
	}

	printf ( "a0 = %d\n", a0 );
	printf ( "a2 = %d\n", a2 );
	printf ( "a3 = %d\n", a3 );

  return 0;
}

/*
 *
 */
sample-004.c の実行結果
C:\usr\c>sample-004
&a0 = bffdaba4
&a1 = bffdaba8
&a2 = bffdabac
&a3 = bffdabb0
&a4 = bffdabb4
a2 = 12
p = bffdaba4
p = bffdaba8
p = bffdabac
p = bffdabb0
p = bffdabb4
a0 = 1000
a2 = 1200
a3 = 1300
C:\usr\c> 

Download : sample-005.c ( SJIS 版 )

sample-005.c
/*
 * 2014/01/10 sample-005.c
 */

/*
 *
 */

#include <stdio.h>

/*
 *
 */

int main ( void ) {
	int a[5] = { 10, 11, 12, 13, 14 };
	int *p;
	int i;

	printf ( "&a[0] = %x\n", &a[0] );
	printf ( "&a[1] = %x\n", &a[1] );
	printf ( "&a[2] = %x\n", &a[2] );
	printf ( "&a[3] = %x\n", &a[3] );
	printf ( "&a[4] = %x\n", &a[4] );

	printf ( "a[2] = %d\n", a[2] );

	p = &a[0];

	for ( i = 0; i < 5; i++ ) {
		*p = *p * 100;				/* p の指す場所を 100 倍する */
		printf ( "p = %x\n", p );
		p = p + ((&a[4] - &a[0])/4);	/* p の指す場所を一つずらす */
	}

	printf ( "a[0] = %d\n", a[0] );
	printf ( "a[2] = %d\n", a[2] );
	printf ( "a[3] = %d\n", a[3] );

  return 0;
}

/*
 *
 */
sample-005.c の実行結果
C:\usr\c>sample-005
&a[0] = bf9ccd94
&a[1] = bf9ccd98
&a[2] = bf9ccd9c
&a[3] = bf9ccda0
&a[4] = bf9ccda4
a[2] = 12
p = bf9ccd94
p = bf9ccd98
p = bf9ccd9c
p = bf9ccda0
p = bf9ccda4
a[0] = 1000
a[2] = 1200
a[3] = 1300
C:\usr\c> 

Download : sample-006.c ( SJIS 版 )

sample-006.c
/*
 * 2014/01/10 sample-006.c
 */

/*
 *
 */

#include <stdio.h>

/*
 *
 */

int main ( void ) {
	int a[5] = { 10, 11, 12, 13, 14 };
	int *p;
	int i;

	printf ( "&a[0] = %x\n", &a[0] );
	printf ( "&a[1] = %x\n", &a[1] );
	printf ( "&a[2] = %x\n", &a[2] );
	printf ( "&a[3] = %x\n", &a[3] );
	printf ( "&a[4] = %x\n", &a[4] );

	printf ( "a[2] = %d\n", a[2] );

	p = a;		/* a = &a[0] */

	for ( i = 0; i < 5; i++ ) {
		*p = *p * 100;				/* p の指す場所を 100 倍する */
		printf ( "p = %x\n", p );
		p = p + 1;					/* ((&a[4] - &a[0])/4) == 1 が保証される */
	}

	printf ( "a[0] = %d\n", a[0] );
	printf ( "a[2] = %d\n", a[2] );
	printf ( "a[3] = %d\n", a[3] );

  return 0;
}

/*
 *
 */
sample-006.c の実行結果
C:\usr\c>sample-006
&a[0] = bfff6d74
&a[1] = bfff6d78
&a[2] = bfff6d7c
&a[3] = bfff6d80
&a[4] = bfff6d84
a[2] = 12
p = bfff6d74
p = bfff6d78
p = bfff6d7c
p = bfff6d80
p = bfff6d84
a[0] = 1000
a[2] = 1200
a[3] = 1300
C:\usr\c> 

Download : sample-007.c ( SJIS 版 )

sample-007.c
/*
 * 2014/01/10 sample-007.c
 */

/*
 *
 */

#include <stdio.h>

/*
 *
 */

int main ( void ) {
	int a[5] = { 10, 11, 12, 13, 14 };
	int *p;
	int i;

	printf ( "&a[0] = %x\n", &a[0] );
	printf ( "&a[1] = %x\n", &a[1] );
	printf ( "&a[2] = %x\n", &a[2] );
	printf ( "&a[3] = %x\n", &a[3] );
	printf ( "&a[4] = %x\n", &a[4] );

	printf ( "a[2] = %d\n", a[2] );

	p = a;		/* a = &a[0] */

	for ( i = 0; i < 5; i++ ) {
		*(p+i) = *(p+i) * 100;		/* p + i の指す場所を 100 倍する */
		printf ( "p + i = %x\n", p + i );
									/* p を増やさなくても i が増えれば良い */
	}

	printf ( "a[0] = %d\n", a[0] );
	printf ( "a[2] = %d\n", a[2] );
	printf ( "a[3] = %d\n", a[3] );

  return 0;
}

/*
 *
 */
sample-007.c の実行結果
C:\usr\c>sample-007
&a[0] = bfefc3c4
&a[1] = bfefc3c8
&a[2] = bfefc3cc
&a[3] = bfefc3d0
&a[4] = bfefc3d4
a[2] = 12
p + i = bfefc3c4
p + i = bfefc3c8
p + i = bfefc3cc
p + i = bfefc3d0
p + i = bfefc3d4
a[0] = 1000
a[2] = 1200
a[3] = 1300
C:\usr\c> 

Download : sample-008.c ( SJIS 版 )

sample-008.c
/*
 * 2014/01/10 sample-008.c
 */

/*
 *
 */

#include <stdio.h>

/*
 *
 */

int main ( void ) {
	int a[5] = { 10, 11, 12, 13, 14 };
	int i;

	printf ( "&a[0] = %x\n", &a[0] );
	printf ( "&a[1] = %x\n", &a[1] );
	printf ( "&a[2] = %x\n", &a[2] );
	printf ( "&a[3] = %x\n", &a[3] );
	printf ( "&a[4] = %x\n", &a[4] );

	printf ( "a[2] = %d\n", a[2] );

	for ( i = 0; i < 5; i++ ) {
		*(a+i) = *(a+i) * 100;		/* a + i の指す場所を 100 倍する */
		printf ( "a + i = %x\n", a + i );
									/* p を変えないなら、いらない (a でよい) */
	}

	printf ( "a[0] = %d\n", a[0] );
	printf ( "a[2] = %d\n", a[2] );
	printf ( "a[3] = %d\n", a[3] );

  return 0;
}

/*
 *
 */
sample-008.c の実行結果
C:\usr\c>sample-008
&a[0] = bf8cadc8
&a[1] = bf8cadcc
&a[2] = bf8cadd0
&a[3] = bf8cadd4
&a[4] = bf8cadd8
a[2] = 12
a + i = bf8cadc8
a + i = bf8cadcc
a + i = bf8cadd0
a + i = bf8cadd4
a + i = bf8cadd8
a[0] = 1000
a[2] = 1200
a[3] = 1300
C:\usr\c> 

Download : sample-009.c ( SJIS 版 )

sample-009.c
/*
 * 2014/01/10 sample-009.c
 */

/*
 *
 */

#include <stdio.h>

/*
 *
 */

int main ( void ) {
	int a[5] = { 10, 11, 12, 13, 14 };
	int i;

	printf ( "a[2] = %d\n", a[2] );

	for ( i = 0; i < 5; i++ ) {
		a[i] = a[i] * 100;		/* a[i] == *(a+i) なので.. */
								/* ポインターの事は忘れてよい */
	}

	printf ( "a[0] = %d\n", a[0] );
	printf ( "a[2] = %d\n", a[2] );
	printf ( "a[3] = %d\n", a[3] );

  return 0;
}

/*
 *
 */
sample-009.c の実行結果
C:\usr\c>sample-009
a[2] = 12
a[0] = 1000
a[2] = 1200
a[3] = 1300
C:\usr\c> 

Download : sample-010.c ( SJIS 版 )

sample-010.c
/*
 * 2014/01/10 sample-010.c
 */

/*
 *
 */

#include <stdio.h>

/*
 *
 */

void nat ( int n ) {

	if ( n > 0 ) {	/* 整数が 0 より大きいなら自然数 */
		printf ( "%d は自然数です\n", n );
			/* 大学数学では 0 を自然数とする事も多いが、まあ今回は高校数学で.. */
	} else {
		printf ( "%d は自然数ではありません\n", n );
	}

}

/*
 *
 */

void sign ( int n ) {

	if ( n < 0 ) {				/* 0 より小さい */
		printf ( "%d の符号は - です\n", n );
	} else if ( n > 0 ) {		/* 0 より大きい */
		printf ( "%d の符号は + です\n", n );
	} else {
		printf ( "%d の符号は +- です\n", n );
	}

}

/*
 *
 */

void week_1 ( int w ) {

	printf ( "Week 1 : " );

	if ( w == 0 ) {
	 	printf ( "日曜日\n" );
	} else if ( w == 1 ) {
	 	printf ( "月曜日\n" );
	} else if ( w == 2 ) {
	 	printf ( "火曜日\n" );
	} else if ( w == 3 ) {
	 	printf ( "水曜日\n" );
	} else if ( w == 4 ) {
	 	printf ( "木曜日\n" );
	} else if ( w == 5 ) {
	 	printf ( "金曜日\n" );
	} else if ( w == 6 ) {
	 	printf ( "土曜日\n" );
	} else {
		printf ( "わかりません\n" );
	}

}

/*
 *
 */

void week_2 ( int w ) {

	printf ( "Week 2 : " );

	 switch ( w ) {
	 case 0:
	 	printf ( "日曜日\n" );
		break;
	 case 1:
	 	printf ( "月曜日\n" );
		break;
	 case 2:
	 	printf ( "火曜日\n" );
		break;
	 case 3:
	 	printf ( "水曜日\n" );
		break;
	 case 4:
	 	printf ( "木曜日\n" );
		break;
	 case 5:
	 	printf ( "金曜日\n" );
		break;
	 case 6:
	 	printf ( "土曜日\n" );
		break;
	 default:
		printf ( "わかりません\n" );
		break;
	}

}


/*
 *
 */

void time_zone ( int time ) {

	 printf ( "%d 時は", time );

	 switch ( time ) {
	 case 18:
	 case 19:
	 case 20:
	 case 21:
	 case 22:
	 case 23:
	 case 0:
	 case 1:
	 case 2:
	 case 3:
	 	printf ( "夜" );
		break;
	 case 4:
	 case 5:
	 case 6:
	 case 7:
	 case 8:
	 case 9:
	 case 10:
	 	printf ( "朝" );
		break;
	 case 11:
	 case 12:
	 case 13:
	 case 14:
	 case 15:
	 case 16:
	 case 17:
	 	printf ( "昼" );
		break;
	 default:
		printf ( "不明" );
		break;
	}

	printf ( "です\n" );

}

/*
 *
 */

int main ( void ) {

  /*
   * 
   */

   nat ( 3 );
   nat ( -10 );
   nat ( 0 );

  /*
   * 
   */

   sign ( 3 );
   sign ( -10 );
   sign ( 0 );

  /*
   * 
   */

   week_1 ( 1 );
   week_1 ( 5 );
   week_1 ( 100 );

   week_2 ( 1 );
   week_2 ( 5 );
   week_2 ( 100 );

  /*
   * 
   */

	time_zone ( 9 );
	time_zone ( 12 );
	time_zone ( 18 );

	time_zone ( 100 );

  /*
   * 
   */


  return 0;
}

/*
 *
 */
sample-010.c の実行結果
C:\usr\c>sample-010
3 は自然数です
-10 は自然数ではありません
0 は自然数ではありません
3 の符号は + です
-10 の符号は - です
0 の符号は +- です
Week 1 : 月曜日
Week 1 : 金曜日
Week 1 : わかりません
Week 2 : 月曜日
Week 2 : 金曜日
Week 2 : わかりません
9 時は朝です
12 時は昼です
18 時は夜です
100 時は不明です
C:\usr\c> 

Download : sample-011.c ( SJIS 版 )

sample-011.c
/*
 * 2014/01/10 sample-011.c
 */

/*
 *
 */

#include <stdio.h>

/*
 *
 */

int print_and_return ( int value ) {

	/* 引数で渡された整数値を表示して、その値を結果として返す */

	printf ( "PAR: value = %d\n", value );

	return value;
}

/*
 *
 */

void print_two_value ( int first, int second ) {

	/* 引数で指定された二つの値を表示する */

	printf ( "PTV: first = %d\n", first );
	printf ( "PTV: second = %d\n", second );

}

/*
 *
 */

int main ( void ) {

  /*
   *
   */

   printf ( "call print_and_return = %d\n",  print_and_return ( 123 ) );
   printf ( "-----\n" );

  /*
   * 
   */

   print_two_value ( 444, 555 );
   printf ( "-----\n" );

  /*
   * 
   */

   print_two_value ( print_and_return ( 678 ), print_and_return ( 999 ) );

  /*
   * 
   */

  return 0;
}

/*
 *
 */
sample-011.c の実行結果
C:\usr\c>sample-011
PAR: value = 123
call print_and_return = 123
-----
PTV: first = 444
PTV: second = 555
-----
PAR: value = 999
PAR: value = 678
PTV: first = 678
PTV: second = 999
C:\usr\c> 

Download : sample-012.c ( SJIS 版 )

sample-012.c
/*
 * 2014/01/10 sample-012.c
 */

/*
 *
 */

#include <stdio.h>

/*
 *
 */

void nPrint ( int n, ... ) {	/* 複数の整数を引数にして出力 */
	int *p = &n;
	int i;

	for ( i = 0; i < n; i++ ) {
		printf ( "%d'th arg = %d\n", i + 1, p[i+1] );
			/* p[0] は n そのもの、最初の引数は p[1] == p[0+1] になる */
	}
}

/*
 *
 */

int main ( void ) {

  /*
   *
   */

   nPrint ( 2, 123, 456 );
   printf ( "---\n" );
   nPrint ( 5, 100, 120, 140, 160, 180 );
   printf ( "---\n" );
   nPrint ( 2, 111, 222, 333, 444 );
   printf ( "---\n" );
   nPrint ( 3, 9 );

  /*
   *
   */

  return 0;
}

/*
 *
 */
sample-012.c の実行結果
C:\usr\c>sample-012
1'th arg = 123
2'th arg = 456
---
1'th arg = 100
2'th arg = 120
3'th arg = 140
4'th arg = 160
5'th arg = 180
---
1'th arg = 111
2'th arg = 222
---
1'th arg = 9
2'th arg = 222
3'th arg = 333
C:\usr\c> 

Download : sample-013.c ( SJIS 版 )

sample-013.c
/*
 * 2014/01/10 sample-013.c
 */

/*
 *
 */

#include <stdio.h>

/*
 *
 */

void nPrint ( int n, ... ) {	/* 複数の整数を引数にして出力 */
	int *p = &n;
	int i;

	for ( i = 0; i < n; i++ ) {
		printf ( "%d'th arg = %d (%x)\n", i + 1, p[i+1], p + (i + 1) );
			/* p[0] は n そのもの、最初の引数は p[1] == p[0+1] になる */
	}
}

/*
 *
 */

int main ( void ) {

  /*
   *
   */

   nPrint ( 2, 123, 456 );
   printf ( "---\n" );
   nPrint ( 5, 100, 120, 140, 160, 180 );
   printf ( "---\n" );
   nPrint ( 2, 111, 222, 333, 444 );
   printf ( "---\n" );
   nPrint ( 3, 9 );

  /*
   *
   */

  return 0;
}

/*
 *
 */
sample-013.c の実行結果
C:\usr\c>sample-013
1'th arg = 123 (bfbbc7f4)
2'th arg = 456 (bfbbc7f8)
---
1'th arg = 100 (bfbbc7f4)
2'th arg = 120 (bfbbc7f8)
3'th arg = 140 (bfbbc7fc)
4'th arg = 160 (bfbbc800)
5'th arg = 180 (bfbbc804)
---
1'th arg = 111 (bfbbc7f4)
2'th arg = 222 (bfbbc7f8)
---
1'th arg = 9 (bfbbc7f4)
2'th arg = 222 (bfbbc7f8)
3'th arg = 333 (bfbbc7fc)
C:\usr\c>