● fixed X - 関数リファレンス
FIXEDVAL値が指定データだけで構成されているかを調べる
int __stdcall fixed_searchnd(PFIXEDVAL pval ,unsigned long ulpat ,int size );
int __stdcall fixed_searchndi(PFIXEDVAL pval ,unsigned long ulpat ,int size );
int __stdcall fixed_searchndir(PFIXEDVAL pval ,unsigned long ulpat ,int size );
引数
引数名 | 意味 |
pval | 調査対象の値が格納されている FIXEDVAL領域の先頭アドレス |
ulpat | データ |
width | pval の指す FIXEDVAL値の数値幅(バイト単位) |
戻り値
関数fixed_searchnd は、指定された FIXEDVAL値が ulpat だけで構成されている場合は 1 、それ以外はゼロを返します。
関数fixed_searchndi 、fixed_searchndir は、一致しなかった要素のインデックス(long単位)を返し、全てが一致した場合は -1 を返します。
説明
fixed_searchnd は、pval の指す FIXEDVAL値が ulpat で指定した unsigned long のビットパターンだけで構成されているかを調べ、全て一致している場合は 1 、それ以外は 0 を返します。
fixed_searchndi は、下位側から上位側に向かって ulpat ではない値 を検索し、発見した場合はその場所の long型インデックスを返し、それ以外は -1 を返します。
fixed_searchndir は関数fixed_searchndi と同じような処理を行いますが、上位側から下位側に向かって検索する点が異なります。
引数 pval の指す領域は、width が示す数値幅以上のサイズを持っている必要があり、width は 4 の倍数である必要があります。
テスト1.
#include <stdio.h>
#include "fixedX.h"
#define BIT 256
#define SIZE (BIT / 8)
#define VAL 0x12345678
void main(void )
{
unsigned long test[] = {
VAL, VAL, VAL, VAL, VAL, VAL, VAL, VAL
};
PFIXEDVAL ptest = (PFIXEDVAL )test;
char buf[SIZE * 2 + 1];
/*
この時点では、全ての要素が 0x12345678 なので、
fixed_searchnd は 1 を返し、fixed_searchndi 、fixed_searchndir は -1 を返します。
*/
fixed_tohexstr(ptest,SIZE,buf);
printf("%s ... %d %d %d\n",buf,
fixed_searchnd(ptest,VAL,SIZE),
fixed_searchndi(ptest,VAL,SIZE),
fixed_searchndir(ptest,VAL,SIZE)
);
test[5]--; /* 6 要素目の内容を破壊します */
/* 変わった内容の表示 */
fixed_tohexstr(ptest,SIZE,buf); printf("\n%s\n",buf);
/*
内容が全て同じではなくなったので、
fixed_searchnd は 0 を返します。
*/
printf("result : %d\n",fixed_searchnd(ptest,VAL,SIZE));
/*
インデックスを表示します。
ゼロベースなので 5 を返します。
*/
printf("pos : %d\n\n",fixed_searchndi(ptest,VAL,SIZE));
test[6]++; /* 7 要素目の内容を破壊します */
/* 変わった内容の表示 */
fixed_tohexstr(ptest,SIZE,buf); printf("\n%s\n",buf);
/*
pos_l は pos と同じ 5 になりますが、
pos_h は上位側からの検索なので 6 になります。
*/
printf("pos_l : %d\n",fixed_searchndi(ptest,VAL,SIZE));
printf("pos_h : %d\n",fixed_searchndir(ptest,VAL,SIZE));
}
テスト2.fixed_mul の結果格納領域が何バイト使用されるかを調べます。
大きな領域を特定パターンで埋めておき、fixed_mul にその領域を使用させます。
その後、上位側からパターンに一致しない場所のインデックスを調べます。
#include <stdio.h>
#include "fixedX.h"
#define BIT 128
#define SIZE (BIT / 8)
#define SIZE2 (SIZE * 2)
/* テスト領域のサイズ:とりあえず SIZE の 10 倍にしておきます */
#define CNT 10
void main(void)
{
FIXEDVAL test[SIZE * CNT],a[SIZE] = {1};
PFIXEDVAL ptr;
unsigned long *pul;
int i,j;
/* 最初に test を 0xcc で埋めておきます */
memset(test,0xcc,sizeof(test));
/* 乗算の実行 */
fixed_mul(a,a,test,SIZE);
/* test の内容を 16進数で表示します */
printf("result:\n");
i = 0; ptr = test;
do{
printf("\t%d : ",i);
/* 8桁ずつ表示。左側が上位、右側が下位 */
j = 0; pul = (unsigned long *)(ptr += SIZE);
while(1){
printf("%08X",*--pul);
if ((j += 4) >= SIZE) break;
printf(" ");
}
printf("\n");
}while(++i < CNT);
/*
上位側から下位側に向かって 0xcccccccc ではない位置を調べます。
7 が表示されるので、最下位から 8 要素分が使用されていると判ります。
[0] [1] [2] … [7]
1 要素 4 byte 4 * 8 = 32 byte
*/
printf("\nindex : %d\n",fixed_searchndir(test,0xcccccccc,sizeof(test)));
}