Libconfig и без подписи долго. Как работать с UL?

#c #types #byte #unsigned #libconfig

Вопрос:

У меня проблема:

 name = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
// Store inventory:
params =
{
  myparams= ( {  max_len  = 1024UL;
              author = "Robert Louis Stevenson";
              price  = 29.99;
              qty    = 5; }
                );
            };
 

Знаете ли вы, как удалить из основного это значение 1024UL? Это не целое число, а конкретное значение int (длинное без знака). Я не нашел функции для этого. Вы можете увидеть функцию config_setting_lookup_int, но, очевидно, она не работает, потому что получаемое значение не является значением int (1024UL). Спасибо всем вам за вашу помощь!

 config_t cfg;
config_setting_t *setting;
const char *str;
config_init(amp;cfg);

/* Read the file. If there is an error, report it and exit. */
if(! config_read_file(amp;cfg, "file.cfg"))
{
fprintf(stderr, "%s:%d - %sn", config_error_file(amp;cfg),
        config_error_line(amp;cfg), config_error_text(amp;cfg));
config_destroy(amp;cfg);
return(EXIT_FAILURE);
}else{
printf("Config file is OKn");
}

    /* Get the store name. */
        if(config_lookup_string(amp;cfg, "name", amp;str))
        printf("Store name: %snn", str);
        else
        fprintf(stderr, "No 'name' setting in configuration file.n");
    
    
    
        setting = config_lookup(amp;cfg, "params.myparams");
      if(setting != NULL)
      {
        int count = config_setting_length(setting);
        int i;
    
        printf("%-30s  %-30s   %-6s  %sn", "TITLE", "AUTHOR", "PRICE", "QTY");
    
        for(i = 0; i < count;   i)
        {
          config_setting_t *book = config_setting_get_elem(setting, i);
    
          /* Only output the record if all of the expected fields are present. */
          const char *author;
          int max_len;
          double price;
          int qty;
    
          if(!(config_setting_lookup_int(book, "max_len", amp;max_len)
               amp;amp; config_setting_lookup_string(book, "author", amp;author)
               amp;amp; config_setting_lookup_float(book, "price", amp;price)
               amp;amp; config_setting_lookup_int(book, "qty", amp;qty)))
            continue;
    
          printf("%-30d  %-30s  $%6.2f  =n", max_len, author, price, qty);
        }
        putchar('n');
      }
 

Комментарии:

1. Использовать config_setting_lookup_int64 ? Если libconfig поддерживает целочисленные суффиксы, то есть. Если это не так, то вам нужно прочитать его как строку и преобразовать самостоятельно (например strtoul , с помощью ).

2. Вы правы. Я добавил начальную часть кода

3. Я пытаюсь использовать config_setting_lookup_int64. как я могу объявить max_len? Я пытаюсь написать длинную без знака max_len; в файле.cfg могу ли я записать max_len: 1024UL? ?

Ответ №1:

  • UL суффикс означает, что постоянное целое число имеет тип unsigned long
  • ULL — «без подписи, долго, долго»
  • U unsigned int
  • L - длинный инт`
  • LL — лонг лонг инт`

Лучше иметь слишком длинную, которая нужна, чем слишком короткую. В большинстве случаев компилятор преобразует его в правильный тип.