Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Didimitriy
0 / 0 / 0
Регистрация: 25.09.2011
Сообщений: 5
#1

как слинковать curses? - C++

21.11.2011, 00:03. Просмотров 1056. Ответов 7
Метки нет (Все метки)

Столкнулся с такой проблемой, надо было использовать _getch(), оказалось что под Linux не используется conio.h и надо подключать библиотеку curses (в которую вроде как conio.h входит полностью) но ни как не могу догнать как мне получить curses. Вычитал что ее надо слинковать. И ни как не могу. Прощу помощи. Если я правильно понял слинковать - это значит создать эту библиотеку и закинуть ее в папку /usr/include/c++/4.4 , откуда она будет подключаться в дальнейшем. Но все равно не получается. Может распишете по пунктам? ну или ссылку дадите умную?
п.с. ОС debian.
и еще читал пару самоучителей и захотелось мне вдруг попробовать слить два примера в один (здесь уже я под Virt Box пробую соорудить сие под XP) в первом примере после ввода двух чисел выдавалась их сумма, во втором производится сверка введеных символов с заданными (пароль) по отдельности они у меня (в винде) работают, а вот вместе что то ни как.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <conio.h>
#include <cstring>
using namespace std;
 
void password ();
 
int main ()
{int x, y;
void password ();
cout << "Please enter X and Y" << endl;
cin >> x;
cin >> y;
cout << "Summa X and Y = " << x + y << endl;
return 0;
}
 
void password (){
char passwd[17], ch;
bool flag = false;
int i = 0;
cout << "Please enter the password: ";
do {
ch = _getch();
if (i> 15 || ch == '\r' || ch == '\n') {
flag = true;
passwd[i] = '\0';
}
else if (   (ch > 47 && ch <58)
              || (ch > 64 && ch < 91)
    || (ch > 96 && ch < 123))
{
passwd[i] = ch;
cout << '*';
++i;
}
else {
cout << "Error" << endl;
}
} while (!flag);
if (strcmp(passwd, "test") == 0) {
cout << "OK" << endl;
}else {
    cout << "Error";}
}
в моей задумке программа должна предложить ввести пароль (ну дальше бы мне хотелось чтоб в случае если пароль вводится успешно, то программа предлагает ввести два числа, а если нет, то Error, но до этого я еще не добрался, пока не могу сообразить, как я буду это делать, но это дело будущего) а потом предложить ввести два числа и выдать их сумму. но функция void password () у меня не запускается и программа просто успешно реализует функцию int main() что конечно же печально.
П.с.с прошу строго не судить могу применять неверную терминалогию и вообще путаться в показаниях ))) я не то что начинающий, я , если верно сказать только начинаю начинать, пытаясь доказать что программированию все возрасты покорны.
Спс за доходчивые и развернутые ответы.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.11.2011, 00:03     как слинковать curses?
Посмотрите здесь:

C++ Как слинковать boost/multiprecision/cpp_int.hpp?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
LosAngeles
Заблокирован
21.11.2011, 07:08     как слинковать curses? #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C
1
#include <ncurses.h>
Bash
1
gcc ... -lncurses ...
Добавлено через 12 минут
C
1
2
3
4
5
6
7
#if defined (_WIN32 || _WIN64)
   #include <conio.h>
#elif defined (__linux__ || __FreeBSD__)
   #include <ncurses.h>
#elif
   #error "Unsupported platform"
#endif
Didimitriy
0 / 0 / 0
Регистрация: 25.09.2011
Сообщений: 5
21.11.2011, 22:34  [ТС]     как слинковать curses? #3
немного запутался почему мне предлагают слинковать ncurses вместо curses, да и чего уж там скрывать не совсем понятно и как это сделать (видимо надо указать параметры, вот пытаюсь понять какие параметры меня интересуют). но это видимо из за отсутствия понимания основ.
пытаюсь разобраться.
Спасибо, за то, что дали указание направления куда копать... надеюсь я верно понял это направление, а не рою землю в обратную строну )))

вопрос по опубликованному коду остается. исполняется только функция main вторая функция остается "за бортом".
grizlik78
Эксперт С++
1897 / 1429 / 106
Регистрация: 29.05.2011
Сообщений: 2,985
21.11.2011, 22:37     как слинковать curses? #4
Цитата Сообщение от Didimitriy Посмотреть сообщение
вопрос по опубликованному коду остается. исполняется только функция main вторая функция остается "за бортом".
Так ничего удивительного, ведь вызова функции password внутри main нет, там только объявление прототипа локальной функции. Надо там void убрать, чтобы превратить это в вызов.
Didimitriy
0 / 0 / 0
Регистрация: 25.09.2011
Сообщений: 5
21.11.2011, 23:02  [ТС]     как слинковать curses? #5
Цитата Сообщение от grizlik78 Посмотреть сообщение
Так ничего удивительного, ведь вызова функции password внутри main нет, там только объявление прототипа локальной функции. Надо там void убрать, чтобы превратить это в вызов.
иииииии Бинго! ))))
да да , вызова нет.
я правда пока не читал про прототип локальной функции, но это видимо функция исполняемая только в той функции, в которой она объявляется (на аналогии с глобальными и локальными переменными).
ы ) доволен как слон ) спс ))))
печаль что сам не додумался.
Didimitriy
0 / 0 / 0
Регистрация: 25.09.2011
Сообщений: 5
01.12.2011, 05:54  [ТС]     как слинковать curses? #6
ни как не получается. пытаюсь слинковать и видимо окончательно запутался.
вопрос.
gcc sample1.c -o sample1 -lncurses
1)откуда взялся sample1.c?
2) почему sample1? куда подевалось расширение? (у меня файл называется main.cpp)
знакома ли библиотека ncurses с функцией _getch() или же мне надо использовать иные функции?
спасибо за ответы.
да да, я уже прочитал буржуйские сайты и порылся на http://www.cplusplus.com/ ))) мне уже пора помочь, натолкните еще на какую нибудь мысль, ну или дайте ссылку где со мной это сделают (ссылки типа www.yandex.ru и www.google.com не предлагать )
нет, я не прошу написать это за меня. это наименее желаемое мной решение моей проблемы, просто подтолкните, а с учетом того, что я, чего уж там скрывать тормоз, то можно и напрямую дать пендаля.
еще раз спс.

Добавлено через 14 часов 59 минут
разобрался ) слинковал
но не тут то было.
undefined reference to `stdscr'
undefined reference to `wgetch'
парадокс, но эти функции у меня в коде отсутствуют. видимо, надо что то где то подкрутить.

Добавлено через 15 часов 33 минуты
нее )) окончательно запутался. need help.
я прописываю строчку в консоли : g++ -o main main.cpp lncurses (надеюсь все так?я верно понимаю что gcc это для С а g++ это на С++? просто где то высмотрел что g++ не умеет линковать. хм, хотя кто ж знает, может и правда не умеет)
в результате выдает мне:

main.cpp: In function ‘int main()’:
main.cpp:28: error: ‘_getch’ was not declared in this scope

но почему? ведь getch() это функция библиотеки conio которая полностью входит в curses. я расстроен и в печали.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <ncurses.h>
#include <cstring>
 
using namespace std;
 
int main ()
{
char passwd[17], ch;
bool flag = false;
int i = 0;
cout << "Please enter the password: ";
do {
ch = _getch();
if (i> 15 || ch == '\r' || ch == '\n') {
flag = true;
passwd[i] = '\0';
}
else if (   (ch > 47 && ch <58)
            || (ch > 64 && ch < 91)
        || (ch > 96 && ch < 123))
{
passwd[i] = ch;
cout << '*';
++i;
}
else {
cout << "Error" << endl;
}
} while (!flag);
if (strcmp(passwd, "test") == 0) {
cout << "OK" << endl;
}else {
cout << "Error";}
return 0;}
grizlik78
Эксперт С++
1897 / 1429 / 106
Регистрация: 29.05.2011
Сообщений: 2,985
01.12.2011, 22:15     как слинковать curses? #7
Цитата Сообщение от Didimitriy Посмотреть сообщение
я прописываю строчку в консоли : g++ -o main main.cpp lncurses
(надеюсь все так?я верно понимаю что gcc это для С а g++ это на С++? просто где то высмотрел что g++ не умеет линковать. хм, хотя кто ж знает, может и правда не умеет)
Умеет. Там правда ещё минус нужен перед lncurses, но это, видимо, опечатка просто.

Цитата Сообщение от Didimitriy Посмотреть сообщение
в результате выдает мне:

main.cpp: In function ‘int main()’:
main.cpp:28: error: ‘_getch’ was not declared in this scope
Компоновщик тут ни при чём. Просто такой функции нет.

Цитата Сообщение от Didimitriy Посмотреть сообщение
но почему? ведь getch() это функция библиотеки conio которая полностью входит в curses. я расстроен и в печали.
getch() там есть, без подчёркивания. Только вряд ли можно говорить, что conio входит в curses. Всё-таки в curses это работает несколько иначе.
Didimitriy
0 / 0 / 0
Регистрация: 25.09.2011
Сообщений: 5
06.12.2011, 05:50  [ТС]     как слинковать curses? #8
Цитата Сообщение от grizlik78 Посмотреть сообщение
Умеет. Там правда ещё минус нужен перед lncurses, но это, видимо, опечатка просто.
да да, так и есть.
Цитата Сообщение от grizlik78 Посмотреть сообщение
Компоновщик тут ни при чём. Просто такой функции нет.
да, но в примере используется именно _getch() (Прохоренок. Программирование в С++ в Visual studio 2010. стр.32)

Цитата Сообщение от grizlik78 Посмотреть сообщение
getch() там есть, без подчёркивания.
если попробовать использовуть getch() а не _getch() то результатом будет:
Error
Error
Error...
и так пока не остановишь выполнение.
Видимо настало время познакомиться с такой штукой как отладка...

Спасибо большое за подсказки.

п.с. В Visual studio все компилируется и вроде как фурычит.
Yandex
Объявления
06.12.2011, 05:50     как слинковать curses?
Ответ Создать тему
Опции темы

Текущее время: 14:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru