● 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データ
widthpval の指す 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)));
}