Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: си и ncurses меню  (Прочитано 1945 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн hon

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1044
  • Ubuntu 12.04 LTS
    • Просмотр профиля
си и ncurses меню
« : 23 Июня 2014, 18:30:51 »
Хочу сделать меню из 5 элементов на си и ncurses. Делаю так:

Код: (C) [Выделить]
#include <curses.h>
#include <stdlib.h>
#include <string.h>
#include <menu.h>

int main() {
    ITEM **my_items;
    MENU *proctable;
    int i, c;
    char tempstr[100];
   
    initscr(); cbreak(); noecho(); keypad(stdscr, TRUE);
   
    my_items = malloc(100 * sizeof(ITEM *));
   
    sprintf(tempstr, "%d", 0);
    my_items[0] = new_item(tempstr, "...");
    sprintf(tempstr, "%d", 1);
    my_items[1] = new_item(tempstr, "...");
    sprintf(tempstr, "%d", 2);
    my_items[2] = new_item(tempstr, "...");
    sprintf(tempstr, "%d", 3);
    my_items[3] = new_item(tempstr, "...");
    sprintf(tempstr, "%d", 4);
    my_items[4] = new_item(tempstr, "...");
    my_items[5] = (ITEM *)NULL;
   
    proctable = new_menu((ITEM **)my_items);
    post_menu(proctable);
    refresh();
   
    while ((c = getch()) != KEY_F(1)) {
          switch (c) {
                 case KEY_DOWN: menu_driver(proctable, REQ_DOWN_ITEM); break;
                 case KEY_UP: menu_driver(proctable, REQ_UP_ITEM); break;
          } 
    }
   
    free_menu(proctable);
    endwin();
}

Но похоже, что из-за того, что tempstr передается по ссылке и перезаписывается каждые две строки меню содержит одинаковые элементы. Я хочу это исправить и засунуть в цикл. Как это сделать?
« Последнее редактирование: 24 Июня 2014, 10:30:27 от Чистый »

Оффлайн .ubuntufan

  • Активист
  • *
  • Сообщений: 638
    • Просмотр профиля
Re: си и ncurses меню
« Ответ #1 : 23 Июня 2014, 19:56:28 »
У вас там ходит один и тот же указатель, а по факту нужны новые строки.
Т.е. как то так: (возможно не лучшее решение)

Код: (C) [Выделить]
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char* makeString(int num) {

char* ret;
char* format = "Number: [%d]";
size_t size;

size = snprintf(NULL, 0, format, num);
ret = (char*) malloc(size);
snprintf(ret, size + 1, format, num);

return ret;
}


int main() {
int i;
for (i = 0; i < 5; ++i) {
printf("%s\n", makeString(i));
}

return 0;
}

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7203
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: си и ncurses меню
« Ответ #2 : 24 Июня 2014, 08:52:51 »
hon, зачем ncurses? Очень надо GUI в консоле или поддержка старого ПО? ЕМНИП его не рекомендуют использовать, а рекомендуют поглядеть на GTK/Qt или FLTK.

Оффлайн Чистый

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3473
  • nix - вот оно счастье...
    • Просмотр профиля
Re: си и ncurses меню
« Ответ #3 : 24 Июня 2014, 10:29:54 »
peregrine,
глупо, а если мне надо gui именно в консоли то что ?
Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

Оффлайн hon

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1044
  • Ubuntu 12.04 LTS
    • Просмотр профиля
Re: си и ncurses меню
« Ответ #4 : 24 Июня 2014, 12:38:32 »
.ubuntufan, будет ли в таком случае утечка памяти? Ведь строки не удаляются.
peregrine, Чистый, я хочу написать интерактивную консольную программу, которая могла бы работать без иксов.

Оффлайн .ubuntufan

  • Активист
  • *
  • Сообщений: 638
    • Просмотр профиля
Re: си и ncurses меню
« Ответ #5 : 24 Июня 2014, 13:04:58 »
.ubuntufan, будет ли в таком случае утечка памяти? Ведь строки не удаляются.

По приведенному тобой куску кода сказать сложно. В зависимости от того что дальше с ними происходит. У тебя там вызов  free_menu(proctable); вероятно освобождение памяти занимаемой меню, включая строки, хотя тут нужно смотреть реализацию. В любом случаем можно освободить выделенную память с помощью вызова free.

whatdoyouneed

  • Гость
Re: си и ncurses меню
« Ответ #6 : 24 Июня 2014, 13:18:22 »
Я как-то встретил такое суждение - если надо красивый интерактивный ввод в консоли, то и проще, и полезнее, и быстрее реализовать с помощью простейшего cgi сервера и консольного браузера. По-моему в этом что-то есть.

Оффлайн Чистый

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3473
  • nix - вот оно счастье...
    • Просмотр профиля
Re: си и ncurses меню
« Ответ #7 : 24 Июня 2014, 15:21:42 »
Я как-то встретил такое суждение - если надо красивый интерактивный ввод в консоли, то и проще, и полезнее, и быстрее реализовать с помощью простейшего cgi сервера и консольного браузера. По-моему в этом что-то есть.

внутри сети компании да, если надо это для чего-то другого и переносимо, это маразм.
Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

Онлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5552
  • Все по палатам!
    • Просмотр профиля
Re: си и ncurses меню
« Ответ #8 : 24 Июня 2014, 22:59:51 »
Вспомнил былое  :-\
(Нажмите, чтобы показать/скрыть)
« Последнее редактирование: 25 Июня 2014, 08:35:42 от Чистый »
Извините, я все еще учусь

 

Страница сгенерирована за 0.07 секунд. Запросов: 25.