1

編集:私はこのソフトウェアのためにCでコーディングするしかないので、これを覚えておいてください。

ポイントのセットからのデータを比較するパラメータリストを使用しようとしています。これを行うためのより良い方法があるかもしれませんが、比較のために他のすべての引数を呼び出す必要があると思います。

基本的に、関数呼び出しは次のとおりです。

char * key1は独自仕様であり、データベース内のレコードの一意のIDを参照しますOSI_RECORDも独自仕様であり、レコード番号を参照するGET _ * _ VALUEも独自仕様であり、DOFRIを使用して特定のフィールドを指すために使用されます

size_t LAST_OFF ( int argCount, char * key1, ... )
{
va_list     parmlist;
int         dS1, dS2, retValue, nextArg, max = 0;
char        * keyN;
char        * keyS;
OSI_RECORD  ptRecord1;
float       argMax;


va_start( parmlist, key1 );

    nextArg = 2;

    for (size_t i = 0; i < key1; i +=2)
    {

        keyN = va_arg( parmlist, char * );
        keyS = va_arg( parmlist, char * );

        dS2 = GET_STATUS ( keyS );

        if (dS2 = 1) 
        {
            ptRecord1 = GET_R (keyN, "STATUS");
            dS1 = GET_FLOAT_VALUE ( 10, 4, 31, ptRecord1, 0); 

            if ( dS1 > max );
            {
                max = ( dS1 );

                if (nextArg < argCount)
                {
                    argMax = (((float)nextArg + 1 ) / 2 );
                }

                else if (nextArg = argCount)
                {
                    argMax = (1);
                }

            }



        nextArg++;

        }

        else if (dS2 /= 1)
        {

            nextArg++;

        }

    }

    retValue = max;

va_end ( parmlist);

PUT_ANALOG ( key1, argMax );


}

編集:これが計算の現在のバージョンです。間違いはたくさんあると思いますが、コンパイルに問題があります。

コンパイラから発生するエラーは次のとおりです。

 error C2143: syntax error: missing ';' before 'type'
 error C2143: syntax error: missing ';' before 'type'
 error C2143: syntax error: missing ';' before 'type'
 error C2143: syntax error: missing ';' before 'type'
 warning C4047: '<' : 'int' diffes in levels of indirection from 'char *'
 warning C4552: '<' : operator has no effect; expected operator with side-effect
 error C2059: syntax error : ')'
 error C2143: syntax error : missing ':' before '{'
 warning C4244: '=' : conversion from 'float' to 'int', possible loss of data

これらの警告の最後の2つを除くすべてが、次の行で示されています。

 for (size_t i = 0; i < key1; i +=2)
4

2 に答える 2

0
else if (nextArg = argCount)

割り当てて比較しないでよろしいですか?

基本的に、va_listで比較しているキーごとに、1または0のいずれかに等しくなるように設定されたペアのキーが必要です。そのキーが0の場合は次の引数にスキップし、1の場合は次の引数を使用します。その議論。

正しい引数数と適切に順序付けられた引数を渡すことを覚えている限り、これは非常に簡単です。これは、少なくともサイズfilterの配列と可変数の引数(常に偶数)を期待し、引数の直後の条件引数に基づいて選択された引数を返す単純な関数です。intargc / 2

size_t filter( int *out, int argc, ... )
{
  assert( argc % 2 == 0 );
  size_t nout = 0;
  va_list vl;
  va_start( vl, argc ); 
  for (size_t i = 0; i < argc; i += 2)
  {
    int val = va_arg( vl, int );
    int cond = va_arg( vl, int );
    if (cond) {
        out[ nout++ ] = val;
    }   
  }
  va_end( vl );
  return nout;
}

関数の使用も簡単です。

void test() 
{
    int *p = malloc( 4 * sizeof *p );
    if ( p ) {             /*4 pairs*/
        size_t n = filter( p, 4 * 2, 1, 0, 2, -1, -4, 1, 0, 0 );
                                    /*out*/ /*in!*/ /*in*/ /*out*/
        printa( p, n );
        free( p );
    }
}

コードには(マクロのように見える)いくつかの項目がありますが、私は気づいていません。そのため、コードを修正する方法を理解する必要があります。

于 2012-06-16T02:26:22.060 に答える
0

structを使用してペアを定義することになりました。最小限の変更で既存のコードを使用することができました。

typedef struct 
{
    char * key1;
    char * key2;
} UnitKeyPair;

UnitKeyPairsをparmlistにかなり簡単に渡しました。

于 2012-07-25T22:34:25.587 に答える