C,使用parm列表可以调用其他所有参数

时间:2012-06-15 21:42:57

标签: c variadic-functions

编辑:我别无选择只能用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 );


}

编辑:这是calc的当前版本。我确定它有很多问题但是我在编译时遇到了问题。

以下是我从编译器中获得的错误:

 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

除了最后两个警告之外的所有警告都指向这一行:

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

2 个答案:

答案 0 :(得分:0)

else if (nextArg = argCount)

您确定要分配而不是比较吗?

  

基本上我需要为每个键在va_list中比较一个设置为等于1或0的配对键。如果该键为0,我跳到下一个参数,如果它是1然后我使用那个论点。

只要你记得传递正确的参数计数和正确排序的参数,这就很容易了。这里是一个简单的filter函数,它需要一个大小至少int的{​​{1}}数组和可变数量的参数(总是偶数),并立即根据条件参数返回所选参数在论证之后:

argc / 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;
}

我的代码中有一些项目(看起来像宏),我不知道,所以你必须弄清楚如何修复你的代码。

答案 1 :(得分:0)

我最终使用struct来定义我的对。我能够以最少的修改使用我现有的代码。

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

我很简单地将UnitKeyPairs传递给我的parmlist。