Решено: передача параметров функции

Модератор: Модераторы разделов

Аватара пользователя
TechnoMag
Сообщения: 298
ОС: Debian 8.0 Jessie

Решено: передача параметров функции

Сообщение TechnoMag »

Такой вот код. Не срабатывают функции в myDrawButton. Писал все по примеру. Я так подозреваю что неправильно передается аргумент wnd. Пробовал варианты - не получается.
Компилировал так:
gcc url.c -o url -lpanel -lncurses

Код: Выделить всё

WINDOW *wadd;

void myDrawButton(WINDOW **wnd, int x, int y, char *caption, int color)
{
    wattron(wnd, COLOR_PAIR(color));
    mvwprintw(wnd, y, x, caption);
}

void wndAdd()
{
       .......
    myDrawButton(wadd, 3, 50, caption, 1);
       .........
    update_panels();
    doupdate();
    getch();
    del_panel(padd);
    delwin(wadd);
}
- Домашний Linux -
Памятки для пользователя
Спасибо сказали:
Sleeping Daemon
Сообщения: 1450

Re: Решено: передача параметров функции

Сообщение Sleeping Daemon »

TechnoMag писал(а):
10.08.2008 23:55
Такой вот код. Не срабатывают функции в myDrawButton. Писал все по примеру. Я так подозреваю что неправильно передается аргумент wnd. Пробовал варианты - не получается.
Компилировал так:
gcc url.c -o url -lpanel -lncurses

Код: Выделить всё

WINDOW *wadd;

void myDrawButton(WINDOW **wnd, int x, int y, char *caption, int color)
{
    wattron(wnd, COLOR_PAIR(color));
    mvwprintw(wnd, y, x, caption);
}

void wndAdd()
{
       .......
    myDrawButton(wadd, 3, 50, caption, 1);
       .........
    update_panels();
    doupdate();
    getch();
    del_panel(padd);
    delwin(wadd);
}

WINDOW *wadd
wadd объявлена как указатель на WINDOW.
myDrawButton(WINDOW **wnd
А функция ожидает указатель на указатель.
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4471
Статус: GNU generation
ОС: Debian GNU/Linux

Re: Решено: передача параметров функции

Сообщение Rootlexx »

TechnoMag
В функцию wattron() в качестве первого параметра передаётся указатель на структуру WINDOW, а у вас — указатель на указатель на такую структуру. Уберите одну звёздочку из заголовка функции myDrawButton(). Указатель на WINDOW модифицироваться же не будет, только содержимое структуры.
Спасибо сказали:
Аватара пользователя
TechnoMag
Сообщения: 298
ОС: Debian 8.0 Jessie

Re: Решено: передача параметров функции

Сообщение TechnoMag »

Rootlexx писал(а):
11.08.2008 00:33
TechnoMag
В функцию wattron() в качестве первого параметра передаётся указатель на структуру WINDOW, а у вас — указатель на указатель на такую структуру. Уберите одну звёздочку из заголовка функции myDrawButton(). Указатель на WINDOW модифицироваться же не будет, только содержимое структуры.


Убрал - не получилось.
- Домашний Linux -
Памятки для пользователя
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4471
Статус: GNU generation
ОС: Debian GNU/Linux

Re: Решено: передача параметров функции

Сообщение Rootlexx »

TechnoMag писал(а):
11.08.2008 00:56
Убрал - не получилось.

Что конкретно у вас не получилось? «Не срабатывают функции» — это можно по-разному интерпретировать. Приведите весь код, пожалуйста, иначе ничего конкретного сказать будет невозможно.
Спасибо сказали:
Аватара пользователя
Hater
Сообщения: 165
ОС: Archlinux

Re: Решено: передача параметров функции

Сообщение Hater »

TechnoMag писал(а):
10.08.2008 23:55
myDrawButton(wadd, 3, 50, caption, 1);

Должно быть myDrawButton(&wadd, 3, 50, caption, 1);
Неплохо было бы ещё увидеть объявления тех 2-х функций.
last.fm user Hater-X
Спасибо сказали:
Аватара пользователя
TechnoMag
Сообщения: 298
ОС: Debian 8.0 Jessie

Re: Решено: передача параметров функции

Сообщение TechnoMag »

Проблема в том, что функция myDrawButton не рисует кнопочку.

Код: Выделить всё

#include <panel.h>
#include <signal.h>
#include <termios.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>

/*
    URL-Collector for Linux. Based on ncurses.
    Created by TechnoMag
*/

WINDOW *wmain, *wadd, *wview, *whelp;
PANEL *pmain, *pview, *phelp, *padd;
FILE *resources;
const char* main_menu="[F1-Help] [F2-Сохр] [F3-Доб] [R-Откр] [F8-Удал] [F9-Настройки] [F10-Выход]          ";
const char* help_strings[]=
        {"Программа для хранения адресов сайтов.",
         "Функциональные клавиши:",
         "F1 - Помощь",
         "F2 - Сохранить список сайтов",
         "F3 - Добавить адрес",
         "R  - Открыть ссылку",
         "F8 - Удалить адрес",
         "F9 - Настройки",
         "F10 - Выход",
         "Клавиши управления:",
         "Tab - переключение между элементами управления",
         "Enter - выполнение действия",
         "Esc - отмена, выход из окна",
         "TechnoMag (C) 2008"};

WINDOW* init_wins(int x, int y, int height, int width, int bgcolor, bool dialog);

void update_main()
{
    wattron(wmain, COLOR_PAIR(1));
    mvwprintw(wmain,0, 5,"Список ресурсов");
    wattron(wmain, COLOR_PAIR(4));
}

void update_view()
{
    wattron(wview, COLOR_PAIR(2));
    mvwprintw(wview,0, 5,"Подробности о ссылке");
    wattron(wmain, COLOR_PAIR(3));
}

void wndHelp()
{
    int i;
    wattron(whelp, COLOR_PAIR(7));
    mvwprintw(whelp,0, 5, "Помощь по URL-Collector v0.1 от TechnoMag");
    wattron(whelp, COLOR_PAIR(6));
    for (i=0; i<=13; i++){
    mvwprintw(whelp, i+2 , 2, help_strings[i]);
    }
    update_panels();
    doupdate();
    getch();
    del_panel(phelp);
    delwin(whelp);

}

void myDrawButton(WINDOW *wnd, int x, int y, char *caption, int color)
{

    wattron(wnd, COLOR_PAIR(color));
    mvwprintw(wnd, y, x, caption);
    wattron(wnd, COLOR_PAIR(4));
    //mvwprintw(wadd, y+1, x+1,
    mvwinsnstr(wnd, y+1, x+1, " ", strlen(caption));
}

void wndAdd()
{
    wattron(wadd, COLOR_PAIR(8));
    mvwprintw(wadd,0, 5, "Добавить ссылку");

    mvwprintw(wadd,2, 3, "URL:");
    wattron(wadd, COLOR_PAIR(7));
    mvwprintw(wadd,3, 3, "                                    ");
    myDrawButton(wadd, 3, 50, " < Ok > ", 1);
    //mvwprintw(wadd, 3, 50, "ok");
    wattron(wadd, COLOR_PAIR(8));
    mvwprintw(wadd,5, 3, "Комментарий:");
    wattron(wadd, COLOR_PAIR(7));
    mvwprintw(wadd,6, 3, "                                    ");

    update_panels();
    doupdate();
    getch();
    del_panel(padd);
    delwin(wadd);

}

void sig_winch(int signo)
{
    struct winsize size;
    ioctl(fileno(stdout), TIOCGWINSZ, (char *) &size);
    resizeterm(size.ws_row, size.ws_col);
    wattron(wmain, COLOR_PAIR(4));
    wresize(wmain, 15, size.ws_col);
    wclear(wmain);
    box(wmain, '|', '-');
    update_main();
    wrefresh(wmain);


    wattron(wview, COLOR_PAIR(3));
    wresize(wview, size.ws_row, size.ws_col);
    wclear(wview);
    box(wview, '|', '-');
    update_view();
    wrefresh(wview);

    //update_panels();
    //doupdate();
}



int main(int argc, char *argv[])
{
    int key;
    initscr();
    resources=fopen("url.list", "a");

    signal(SIGWINCH, sig_winch);
    start_color();
    cbreak();
    noecho(); // отключаем отображение нажатых клавиш
    keypad(stdscr, TRUE); // включаем обработку командных клавиш

    init_pair(1, COLOR_BLACK, COLOR_GREEN);
    init_pair(2, COLOR_BLACK, COLOR_YELLOW);
    init_pair(3, COLOR_YELLOW, COLOR_BLACK);
    init_pair(4, COLOR_GREEN, COLOR_BLACK);
    init_pair(5, COLOR_RED, COLOR_WHITE);
    init_pair(6, COLOR_BLUE, COLOR_WHITE);
    init_pair(7, COLOR_WHITE, COLOR_BLUE);
    init_pair(8, COLOR_BLACK, COLOR_CYAN);
    attron(COLOR_PAIR(5));
    printw(main_menu);
    wmain=init_wins(0, 1, 15, 5, 4, FALSE);
    wview=init_wins(0, 16, 8, 5, 3, FALSE);
    pmain=new_panel(wmain);
    pview=new_panel(wview);

    update_main();
    update_view();
    update_panels();
    doupdate();

    while ((key=getch())!=KEY_F(10))
    {
        if (key==KEY_F(1))
        {
            whelp=init_wins(3,3, 20, 70, 6, TRUE);
            phelp=new_panel(whelp);
            wndHelp();

            update_panels();
            doupdate();
         }
         if (key==KEY_F(3))
         {
             wadd=init_wins(5,5, 9, 70, 8, TRUE);
            padd=new_panel(wadd);
            wndAdd();
            update_panels();
            doupdate();
         }
    }
    del_panel(pmain);
    delwin(wmain);

    refresh();
    endwin();
    fclose(resources);
    return 0;
}

WINDOW* init_wins(int x, int y, int height, int width, int bgcolor, bool dialog)
{
    WINDOW *wnd;
    struct winsize size;
    if (dialog==TRUE)
    {
        wnd=newwin(height, width, y, x);
    }
    else
    {
        ioctl(fileno(stdout), TIOCGWINSZ, (char *) &size);
        wnd=newwin(height, size.ws_col, y, x);
    }
    wattron(wnd, COLOR_PAIR(bgcolor));
    wbkgdset(wnd, COLOR_PAIR(bgcolor));
    wclear(wnd);
    box(wnd, '|', '-');
    wrefresh(wnd);
    return wnd;
}
- Домашний Linux -
Памятки для пользователя
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: Решено: передача параметров функции

Сообщение Crazy »

Код: Выделить всё

void myDrawButton(WINDOW *wnd, int x, int y, char *caption, int color)
{

    wattron(wnd, COLOR_PAIR(color));
    mvwprintw(wnd, y, x, caption);
    wattron(wnd, COLOR_PAIR(3));
       mvwprintw(wnd, y+3, x+10, caption);
       mvwinsnstr(wnd, y+3, x+3, caption, strlen(caption));
}

void wndAdd()
{
    wattron(wadd, COLOR_PAIR(8));
    mvwprintw(wadd,0, 5, "Добавить ссылку");

    mvwprintw(wadd,2, 3, "URL:");
    wattron(wadd, COLOR_PAIR(7));
    mvwprintw(wadd,3, 3, "                                    ");
    myDrawButton(wadd, 3, 5, "123456789ABCDEFGH", 1);
    //mvwprintw(wadd, 3, 50, "ok");
    wattron(wadd, COLOR_PAIR(8));
    mvwprintw(wadd,5, 3, "Комментарий:");
    wattron(wadd, COLOR_PAIR(7));
    mvwprintw(wadd,6, 3, "                                    ");

    update_panels();
    doupdate();
    getch();
    del_panel(padd);
    delwin(wadd);

}

Похоже, что промахнулся с координатами.

Desipere in loco
Спасибо сказали:
Аватара пользователя
TechnoMag
Сообщения: 298
ОС: Debian 8.0 Jessie

Re: Решено: передача параметров функции

Сообщение TechnoMag »

Решено: Угу, точно, помахнулся. :crazy:
- Домашний Linux -
Памятки для пользователя
Спасибо сказали: