функции ввода (встроенный ассемблер)

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

Аватара пользователя
COKPOWEHEU
Сообщения: 47
ОС: Debian (ядро 4.4.2) / Win7

Re: функции ввода

Сообщение COKPOWEHEU »

среди APIшных бала какая-то функция. Но я не помню какая. И по-моему она медленнее DInput
А вот на такое

Код:

#include <stdio.h> #include <X11/Xlib.h> char buf[32]; Display *dpy; int main(){ dpy=XOpenDisplay(NULL); XQueryKeymap(dpy,buf); }

он ругается

Код:

> gcc test.cpp -o test /tmp/cczEyhMj.o: In function `main': test.cpp:(.text+0x19): undefined reference to `XOpenDisplay' test.cpp:(.text+0x33): undefined reference to `XQueryKeymap' /tmp/cczEyhMj.o:(.eh_frame+0x11): undefined reference to `__gxx_personality_v0' collect2: ld returned 1 exit status

Кто виноват и что делать?
Спасибо сказали:
Аватара пользователя
COKPOWEHEU
Сообщения: 47
ОС: Debian (ядро 4.4.2) / Win7

Re: функции ввода

Сообщение COKPOWEHEU »

У меня такую же ошибку выдает и при printf(...) :( Что, никто не сталкивался?
Спасибо сказали:
Аватара пользователя
cy6erGn0m
Сообщения: 119
ОС: MandrivaLinux/Solaris 10

Re: функции ввода

Сообщение cy6erGn0m »

Библиотеку не подключили при линковке

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

[cy6ergn0m@cgmachine 3]$ vi test.c
[cy6ergn0m@cgmachine 3]$ gcc test.c
/home/cy6ergn0m/tmp/ccZkaH8t.o: In function `main':
test.c:(.text+0xe): undefined reference to `XOpenDisplay'
test.c:(.text+0x26): undefined reference to `XQueryKeymap'
collect2: выполнение ld завершилось с кодом возврата 1
[cy6ergn0m@cgmachine 3]$ gcc -lx11 test.c
/usr/bin/ld: cannot find -lx11
collect2: выполнение ld завершилось с кодом возврата 1


А так совсем другое дело

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

[cy6ergn0m@cgmachine 3]$ gcc -lX11 test.c
[cy6ergn0m@cgmachine 3]$
I want to Believe!

They must find it difficult...
Those who have taken authority as the truth,
Rather than trusth as the authority.
/G.Messey/
Спасибо сказали:
_edgbla_
Сообщения: 13
ОС: OpenSUSE

Re: функции ввода

Сообщение _edgbla_ »

Хыыыыыыыыы, за версту видно виндускодера :D
Ну перечислю ошибки:
- main должна иметь параметры int argc, char **argv.
- main обьявлена как int и нифига не возвращает.
- файлик называется test.cpp а компилишь ты его с gcc, а не как бы по логике с g++.
- не подключена либа x сервера.

Будет примерно так:

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

#include <stdio.h>
#include <X11/Xlib.h>

char buf[32];
Display *dpy;
int main( int argc, char **argv )
{
    dpy = XOpenDisplay( NULL );
    XQueryKeymap( dpy, buf );
    return 0;
}

Компилим так:

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

g++ -lX11 test.cpp -o test
Спасибо сказали:
Аватара пользователя
cy6erGn0m
Сообщения: 119
ОС: MandrivaLinux/Solaris 10

Re: функции ввода

Сообщение cy6erGn0m »

main должна иметь параметры int argc, char **argv.


А точно ли она обязана что-то принимать? Если параметры не нужны, думаю можно на них забить и написать просто

int main(void)


Но это детали. В целом, конечно, всё верно ;)
I want to Believe!

They must find it difficult...
Those who have taken authority as the truth,
Rather than trusth as the authority.
/G.Messey/
Спасибо сказали:
Аватара пользователя
COKPOWEHEU
Сообщения: 47
ОС: Debian (ядро 4.4.2) / Win7

Re: функции ввода

Сообщение COKPOWEHEU »

Да, признаю, раньше под Линукс почти ничего не писал, но буду исправлятся :).
-мне входные параметры не нужны, разве только в далеком будащем ">test --help" реализовывать :)
-а что ей возврвщать? Мне проще лишний printf поставить, где и описана суть проблемы типа "ПОШЕЛ ^$#$##%##@#$ не могу я соединится с Х-сервером, @#%&%#$^, ибо руки у тебя, програмер #%$%$#@#@ый, кривые".
-это и так прогресс раньше cpp пытался припахать. :)
-про либу честно не знал. А ее можно программой подключить (чтобы не приходилось в g++ писать -lx11)?
Спасибо, буду стараться чтобы видузкодерность хотя бы напоказ не торчала.

Добавил: Что самое удивительное, оно даже у меня заработало! Хотя и не сразу.
Снизойдите к тупому мне еще раз. не работает простейшая программа

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

#include <stdio.h>
int main(){
 printf("test123");
}

компилю g++ , выполняется но на экран не выводит, компилю gcc - не компилируется
>gcc test1.cpp -o test
/tmp/cc82pQGl.o:(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status
Опять что-то не подключил? Или просто как во втором "-" на тему printf и ответа программы мне?
Спасибо сказали:
Аватара пользователя
кодировщик
Сообщения: 974
Статус: зарёган в пятницу 13
ОС: Linux

Re: функции ввода

Сообщение кодировщик »

COKPOWEHEU писал(а):
14.05.2009 08:32
Снизойдите к тупому мне еще раз. не работает простейшая программа

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

#include <stdio.h>
int main(){
 printf("test123");
}

компилю g++ , выполняется но на экран не выводит, компилю gcc - не компилируется
>gcc test1.cpp -o test
/tmp/cc82pQGl.o:(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status
Опять что-то не подключил? Или просто как во втором "-" на тему printf и ответа программы мне?

переименуй test.cpp в *.c
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: функции ввода

Сообщение Portnov »

Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
COKPOWEHEU
Сообщения: 47
ОС: Debian (ядро 4.4.2) / Win7

Re: функции ввода

Сообщение COKPOWEHEU »

Нет, дело не в этом, а в том что запускаю как >test, а не как >./test. Вот, блин,шаманство!
>gcc -lstdc++ ... - запускается.
Спасибо сказали:
MiK13
Сообщения: 1281
ОС: Linux Debian

Re: функции ввода

Сообщение MiK13 »

COKPOWEHEU писал(а):
14.05.2009 08:32
Снизойдите к тупому мне еще раз. не работает простейшая программа

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

#include <stdio.h>
int main(){
 printf("test123");
}

компилю g++ , выполняется но на экран не выводит

Вы уверены, что ничего не выводит? На экран консоли внимательно смотрели?
Попробуйте заменить printf на puts.
Кстати, принято, чтобы программа возвращала какое-нибудь значение. Поэтому в конце обычно ставят
return 0;
Без этого компилятор будет ворчать. Если, конечно, в программе нет бесконечного цикла без выхода.

COKPOWEHEU писал(а):
12.05.2009 18:43
Я хочу распознавать нажата ли клавиша, момент нажатия не нужен.

А как делали это в DOSе?
Я что-то не могу представить, как этому может помочь чтение регистра 0x60.
В svgalib есть функция, которая возвращает указатель на специальный байтовый массив, каждая ячейка которого соответствует скан-коду и в ней назодится 1, если клавиша нажата и 0 -- если нет.
На счёт иксов не знаю, но реализация этого элементарная: получив событие нажатия клавиши нужно в элемент массива с индексом кода клавиши занести 1, а по событию отпускания -- 0.

RasenHerz писал(а):
13.05.2009 01:43
скажите, пожалуйста, где может понадобиться 4 одновременно нажатые клавиши?
В программе -- не знаю, но в качестве хоткеев предпочитаю использовать буквенные клавиши при нажатых при этом Ctrl, Alt, Shift. Как раз получается 4.
Спасибо сказали:
Аватара пользователя
COKPOWEHEU
Сообщения: 47
ОС: Debian (ядро 4.4.2) / Win7

Re: функции ввода

Сообщение COKPOWEHEU »

MiK13
Я же написал, что запустить программу удалось.
В ДОСе из 60h постоянно читаю код клавиши (допустим в х), если он меньше 128, в массив "нажата ли клавиша" (пусть char key[128]) заносится 1 (key[x]=1; ), А если больше 128 - 0 (key[x-128]=0). Потом просто считываю key[y].
А может кто-нибудь дать полный код для иксов?
Спасибо сказали:
MiK13
Сообщения: 1281
ОС: Linux Debian

Re: функции ввода

Сообщение MiK13 »

COKPOWEHEU писал(а):
18.05.2009 12:18
MiK13
Я же написал, что запустить программу удалось.

Было написано:
COKPOWEHEU писал(а):
14.05.2009 08:32
компилю g++ , выполняется но на экран не выводит

Из него я понял, что программа запускалась, что-то делала, но на экран ничего не выводила.
Или имелось ввиду:
COKPOWEHEU писал(а):
14.05.2009 12:53
Нет, дело не в этом, а в том что запускаю как >test, а не как >./test. Вот, блин,шаманство!
?
Как мне когда-то объяснял админ, это -- требование безопасности. Чтобы на случай, если како-ниуюдь злоумышленник создаст в каком-нибудь каталоге исполняемый файл с именем, например, ls, который содержит строку типа rm *, то чтобы юзер, просматривая каталог не запустил этот файл. Т.е. запускаются только те программы, которые находятся в каталогах, перечисленных в переменной $PATH. И для запуска длугих файлов надо явно указывать путь к ним.
COKPOWEHEU писал(а):
18.05.2009 12:18
В ДОСе из 60h постоянно читаю код клавиши (допустим в х), если он меньше 128, в массив "нажата ли клавиша" (пусть char key[128]) заносится 1 (key[x]=1; ), А если больше 128 - 0 (key[x-128]=0). Потом просто считываю key[y].
Этот способ не всегда подходит по нескольким причинам. Во-первых, он загружает процессор бесполезным делом. Во вторых не не гарантирует обнаружение нажатия клавиши, и в третих он не гарантирует однозначное определение нажатой клавиши, т.к. после нажатия разных клавиш в 0x60-м регистре может оказываться одинаковый код.
COKPOWEHEU писал(а):
18.05.2009 12:18
А может кто-нибудь дать полный код для иксов?
Я разбирался с программированием под иксами, читая статьи по программированию XLib, найденные в интернете. Заготовки есть, но пока дать готорвый вариант не могу.
Спасибо сказали:
edgbla
Сообщения: 5
ОС: Fedora

Re: функции ввода

Сообщение edgbla »

COKPOWEHEU: чего надо-то? я же дал весь код. %)
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: функции ввода

Сообщение drBatty »

MiK13 писал(а):
18.05.2009 15:40
Как мне когда-то объяснял админ, это -- требование безопасности. Чтобы на случай, если како-ниуюдь злоумышленник создаст в каком-нибудь каталоге исполняемый файл с именем, например, ls, который содержит строку типа rm *, то чтобы юзер, просматривая каталог не запустил этот файл. Т.е. запускаются только те программы, которые находятся в каталогах, перечисленных в переменной $PATH. И для запуска длугих файлов надо явно указывать путь к ним.

ага. здесь как раз такая атака - help test наберите...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
COKPOWEHEU
Сообщения: 47
ОС: Debian (ядро 4.4.2) / Win7

Re: функции ввода

Сообщение COKPOWEHEU »

Сори что поднимаю тему но 8 одновременно нажатых клавиш удалось получить и тут :-) причем тоже не любых :-)
Чтобы не быть совсем уж оффтопичным, нашел аналогичную функцию под win, как _edgbla_ просил. Правда под Делфю, но функции в принципе похожие.

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

procedure AnyProc;
var buttons : TKeyBoardState; //array[0..255]of byte
begin
 GetKeyBoardState(buttons);
 if buttons[VK_RETURN] and 128 <>0 then begin end; //старший бит - нажатие  клавиши
 if buttons[VK_CAPITAL] and 1 <>0 then begin end; //младший бит - нажата клавиша "с фиксацией" типа CapsLock
end;
Спасибо сказали: