Знатокам си: красивый вывод на экран.

Тема в разделе "LANGS.C", создана пользователем NoName, 7 дек 2008.

  1. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Хочу сделать вывод в виде progress bar:
    [+++++++++ ] X/y

    Вопрос как сделать такую форму?
    Меня интересует самый оптимальный алгоритм реализумый средствами стандартного си без использования множества символов '\b' чтобы не перегружать видео и проц. Спасибо.
     
  2. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    Не понимаю, чем не устраивает вариант с '\r' ? Я когда-то так делал. С чего ты взял, что это загружает проц? (Возможно это из-за того, что ты слишком часто вызывать ф-цию рисования этого прогресса. Имхо, в большинстве случаев достаточно с точностью до процента, т.е. всего будет вызвано 100 раз, в этом случае можно даже ограничится целочисленной арифметикой).
     
  3. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Как тогда сдвинуть указатель на символ вправо без его перезаписи?
    Как в конец строки?
     
  4. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    NoName
    Код (Text):
    1. #include <stdio.h>
    2.  
    3. void progress(int x)
    4. {
    5.     int i, y = x/2;
    6.     printf("\r[");
    7.     for (i = 0; i < 50; ++i)
    8.         putc(i < y ? '+' : ' ', stdout);
    9.     printf("] %u%%",x);
    10. }
    11.  
    12. int main(void)
    13. {
    14.     int i;
    15.     for (i = 1; i <= 100; sleep(50), ++i) /* sleep() не в стандарте,
    16.                                              это просто для наглядности */
    17.         progress(i);
    18.     return 0;
    19. }
     
  5. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Спасибо, я сделал по своему, впринципе приемлемо :)
     
  6. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    мой вариант, на C99:
    Код (Text):
    1. #include <stdio.h>
    2.  
    3. int posX = 1;
    4. int posY = 1;
    5. int width = 10;
    6. char empty[] = "          ";
    7.  
    8. void drawBar(int value)
    9. {
    10.     int i;
    11.     _gotoxy(posX, posY);
    12.     putchar('[');
    13.     printf(empty);
    14.     putchar(']');
    15.     if(!value)return;
    16.     _gotoxy(posX+1, posY);
    17.     for (i = 0; i < value; i++)
    18.         putchar('+');
    19. }
    20.  
    21. int main(void)
    22. {
    23.     int i = 0;
    24.     do
    25.     {
    26.         _sleep(1);
    27.         drawBar(i);
    28.     }while (i++ < width);
    29.     getchar();
    30.     return 0;
    31. }
     
  7. inviZ

    inviZ Сергей

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    92
    Адрес:
    Хабаровск
    Arthur
    Нет никаких _gotoxy в C99.
     
  8. osrootd

    osrootd New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2008
    Сообщения:
    1.086
    inviZ

    +1. тож хотел сказать.

    NoName
    Мало кто этим страдает. Самое оно - ncurses. Просто и красиво.
     
  9. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    osrootd
    ncurses:
    Future Plans
    Extended-level XPG4 conformance, with internationalization support.
    Ports to more systems, including DOS and Windows.

    А NoName сейчас под DOS потребовалось :)))
     
  10. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    Arthur
    _sleep() тоже в С99 нет
     
  11. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    Ох интересно а почему у меня есть? :)
    Наверно потому что использую Pelles C. А ведь он именно C99.
     
  12. osrootd

    osrootd New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2008
    Сообщения:
    1.086
    Y_Mur
    Я кстати ncurses не сильно то и щупал. Так, баловался, но неплохая библиотечка.
     
  13. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    Arthur
    это расширение, в С99 нет такого. А вообще, стандарт - это ISO 9899:1999, а не хелп от PellesC (к тому же у всяких _sleep() там написано красным цветом: "[Not standard C]").

    osrootd
    библиотека полезная, но для простых целей типа прогрессбара лучше обойтись стандартными средствами. Не надо стрелять по мухе из базуки.