nixp.ru v3.0

30 мая 2017,
вторник,
08:37:58 MSK

DevOps с компанией «Флант»
Longobard написал 6 августа 2004 года в 10:57 (331 просмотр) Ведет себя как мужчина; открыл 291 тему в форуме, оставил 2499 комментариев на сайте.

Сегоня нашел баг в классе конфиге (не парсер а обьект конфига именно моей проги). Итак есть такая вот лабудень (сократил я ее для упрощения вашей мыслительной деятельности):

void
FL_Config::HandleVhostOpts( list < struct element > * tree, struct VhostOpts * vhost )
{
      string tag, arg;
              const  int RequiredParamsNum = 2, OptionalParamsNum = 2;
      struct ParamPairs
      {
            string param;
            void * OutPointer;
      }
      RequiredParams[RequiredParamsNum] =
      {
            { FL_VHOST_ROOT, & vhost->VhostRoot },
            { FL_VHOST_DOC_ROOT, & vhost->VhostDocRoot }
      },
      OptionalParams[OptionalParamsNum] =
      {
            { FL_VHOST_ILIMIT, & vhost->InputLimit },
            { FL_VHOST_OLIMIT, & vhost->OutputLimit }
      };
      while ( !tree->empty() )
      {
              list < struct element >::reference  ref = tree->front();
            tag = ref.tag;
            arg = ref.arg;
            for ( int i = 0; i < RequiredParamsNum; i++ )
            {
                  if ( tag == RequiredParams[i].param )
                  {
//Воть где-та тут трабла!
                        if ( ((string*) RequiredParams[i].OutPointer )->length() <= 0 )
                              *((string*) ( RequiredParams[i].OutPointer )) = arg;
                        else
                        {
                              cerr << *( (string*)( RequiredParams[i].OutPointer )) << " may be set only once!\n";
                              HasErrors = true;
                        }
                  }
            }
            for ( int i = 0; i < OptionalParamsNum; i++ )
            {
                  if ( tag == OptionalParams[i].param )
                  {
                        if ( ((string*)( OptionalParams[i].OutPointer ))->length() <= 0 ) {
                               * ((string*)( OptionalParams[i].OutPointer )) = arg;
                        }
                        else
                        {
                              cerr << * ((string*)( OptionalParams[i].OutPointer )) << " may be set only once!\n";
                              HasErrors = true;
                        }
                  }
            }
            tree->pop_front();
      }
      for ( int i = 0; i < RequiredParamsNum; i++ )
            if (  ((string*) RequiredParams[i].OutPointer )->length() <= 0)
            {
                  cerr << * ((string*) ( RequiredParams[i].OutPointer )) << " must be set!\n";
                  HasErrors = true;
            }
}

Короче мне нада получить доступ к обьекту RequiredParams.OutPointer. Дело в том что часть этих обьектов — string, часть — обьекты других классов, поентому он имеет тип void*. Вопщема у меня строка *( (string*)( RequiredParams.OutPointer )) вместо нужного элемента (которые является строкой, опеределенной в хидере через #define) содержит пустую строку. Короче че-та я намудрил с указателями и преобразованиями :) Помогите плз :)

Longobard

Ой короче меня проглючило, нифига я не намудрил, просто перепутал поля структуры и дефайны блин :) Короче тема снята :) Пойду ка я посплю чутка….