Olá pessoal,
Estou começando no C++ e no Netbeans e estou com um problema.
Tenho um sensor numa porta USB, e meu programa liga esse sensor, fica lendo os dados dentro de um laço, e depois fecha o sensor.
Preciso mudar esse laço, pois atualmente ele limita o número de leituras do sensor (for i<100…, sendo que 100 é o número de vezes que o sensor é lido).
Tentei colocar assim:
…
#include <curses.h> //estou usando ubuntu
…
main…
do {
leSensor();
mostraDados();
} while (getch()!=27)
…
Mas apesar de ter colocado o caminho da curses.h no include do NetBeans, dá erro falando que falta o linker de duas funções que fazer parte da curses.
Tentei com getchar(), mas só lê uma vez e fica esperando a tecla Enter. Acho que se o caso acima funcionasse também iria ler uma vez só e ficar esperando uma tecla.
Alguma sugestão de como fazer para ficar lendo o sensor indefinidamente até uma determinada tecla ou comando ser digitado?
Se essa dúvida estiver no lugar errado do fórum, por favor indiquem qual o local apropriado.
Obrigada!
olha se a biblioteca da curses não esta faltando. A biblioteca não é somente um cabeçalho, mas tambem a implementação compilada. Um arquivo libqualquer.a
juliocbq,
Achei a libncurses.a numa outra pasta. Adicionei essa pasta na “inclusão de diretórios” do netbeans (essa pasta aprece com uma chave na frente, não sei o que significa), mas mesmo assim deu erro “referência indefinida” para duas funções da curses.h.
Reparei que em cada lugar é um nome dierente: curses ou ncurses. Existe um atalho com o nome ncurses.h que aponta para o curses.h, e um atalho libcurses.a para o libncurses.a. É assim mesmo?
Obrigada pela ajuda!
[quote=Isabeleaa]juliocbq,
Achei a libncurses.a numa outra pasta. Adicionei essa pasta na “inclusão de diretórios” do netbeans (essa pasta aprece com uma chave na frente, não sei o que significa), mas mesmo assim deu erro “referência indefinida” para duas funções da curses.h.
Reparei que em cada lugar é um nome dierente: curses ou ncurses. Existe um atalho com o nome ncurses.h que aponta para o curses.h, e um atalho libcurses.a para o libncurses.a. É assim mesmo?
Obrigada pela ajuda!
[/quote]
você precisa dizer pro compilador linkar com a biblioteca:
no caso do gcc ficaria assim:
gcc arquivo.c -lncurses (desse jeito se libncurses.a já está no path padrão do seu compilador que é a pasta lib)
se estiver em outra pasta você precisa passar pro linker o caminho da biblioteca:
gcc -arquivo.c -L/home/julio/minha_pasta_de_libs -lncurses
- Note que -lncurses se refere ao arquivo “libncurses.a” (então o arquivo *.a precisa ter o prefixo “lib”)
Fazendo um pequenjo edit aqui, eu te aconselho a usar uma ide para c++ robusta como qt creator:
Ela já possui ferramentas para você montar os makefiles(que é onde você configura as dependências do seu programa sem ter muita dor de cabeça)

Estou usando o NetBeans pois meu sistema vai ser uma miscelânea de java com C++ (via jni). Tem como linkar pelo netbeans?
Tem tambem. Só precisa passar os parametros pro seu compilador pelo netbeans.
Não achei onde passa parâmetros para o compilador no netbeans. Estou compilando via terminal e assim não dá erro.
Coloquei um if(gecth()==13) no meio do laço para interromper, mas não funciona. Coloquei um printf(“TECLOU ENTER”) no meio do if, mas não e mostrado. Quando digito enter, aparece uma linha em branco no meio do dos dados mostrados do sensor. Não sei se precisa iniciar algo para o getch funcionar, estou pesquisando no google mas está difícil de achar algo.
Alguma sugestão?
[quote=Isabeleaa]Não achei onde passa parâmetros para o compilador no netbeans. Estou compilando via terminal e assim não dá erro.
Coloquei um if(gecth()==13) no meio do laço para interromper, mas não funciona. Coloquei um printf(“TECLOU ENTER”) no meio do if, mas não e mostrado. Quando digito enter, aparece uma linha em branco no meio do dos dados mostrados do sensor. Não sei se precisa iniciar algo para o getch funcionar, estou pesquisando no google mas está difícil de achar algo.
Alguma sugestão?[/quote]
- Qual o sistema operacional?
- Qual é o terminal?
Você precisa entender que se está em plataforma win32 o padrão de terminal não é o ansi. Dá para configurar, mas aconselho usar funções do mingw(que é um port do gcc para win);
Porque não usa o getchar() da stdio.h?
****************************************************** edit aqui. Você está programando em c++ e querendo usar printf ou getch()??? ***********************************************************************
desculpe a minha falta de atenção.
use isso aqui:
int ch = std::cin.get();
é a mesma coisa usando a standard output e usando c++ ao invés de c.
Não esqueça de incluir a biblioteca padrão de io:
#include <iostream>
Estou no linux…
Vi que a ncurses preicsa ser iniciada (initscr()) e finalizada (endwin()). Adicionei esses comandos ao código e não mais passou reto pelo comando getch. O problema agora é que toda vez que o laço é executado ele fica esperando uma tecla ser digitada para executar novamente… :-/
Juliocbq, desculpe minha ignorância, mas estou começando no c++ agora. Não entendi o que sua sugestão faz ou onde deve ser colocada:
int ch = std::cin.get();
[quote=Isabeleaa]Estou no linux…
Vi que a ncurses preicsa ser iniciada (initscr()) e finalizada (endwin()). Adicionei esses comandos ao código e não mais passou reto pelo comando getch. O problema agora é que toda vez que o laço é executado ele fica esperando uma tecla ser digitada para executar novamente… :-/
Juliocbq, desculpe minha ignorância, mas estou começando no c++ agora. Não entendi o que sua sugestão faz ou onde deve ser colocada:
int ch = std::cin.get(); [/quote]
isso faz a mesma coisa que a função getch() da biblioteca conio faz. Imagino que a getch() não é buferizada(não precisa apertar enter posteriormente), mas essa alternativa deve servir para você;
editando aqui *************
Este código coloca o terminal em modo não canônico desabilitando o buffer de linha. Daí o getchar passa a não pedir enter e nem dar echo no caracter.
[code]#include
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
int getch_teste( ) {
struct termios oldt,
newt;
int ch;
tcgetattr( STDIN_FILENO, &oldt );
newt = oldt;
newt.c_lflag &= ~( ICANON | ECHO );
tcsetattr( STDIN_FILENO, TCSANOW, &newt );
ch = getchar();
tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
return ch;
}
int main(int argc, const char * argv[])
{
std::cout << "Aperte uma tecla" << std::endl;
int c = getch_teste();
std::cout << c << std::endl;
return 0;
}[/code]
Consegui resolver o problema do curses. Está rodando quase perfeito.
Tentei usar o cin para ler uma string no início do programa (para o usuário informar quais portas usb estão os sensores. Adicionei a iostream, mas deu um monte de erro (que é clarro que eu não entendi.
“/usr/include/c++/4.7/bits/cpp_type_traits.h:214:12: erro: redefinition of ?struct std::__is_integer?
/usr/include/c++/4.7/bits/cpp_type_traits.h:147:12: erro: definição anterior de ?struct std::__is_integer?
In file included from /usr/include/c++/4.7/iostream:40:0,”
printf(“Informe as portas onde os sensores estão conectados. \n”);
printf("Luva A: ");
Tentei usando
cin >> usbA;
std::cin >> usbA;
usbA = cin.getline();
cin.getline(usbA, 20)
…
Edit:
Tirei todos os comando e deixei só o include da iostream, e o erro permanece, então o problema está na lib mesmo. Vou dar uma fuçada nas pastas de include aqui pra ver se resolve, se não faço a çeitura das usb usando a curses também.
[quote=Isabeleaa]Consegui resolver o problema do curses. Está rodando quase perfeito.
Tentei usar o cin para ler uma string no início do programa (para o usuário informar quais portas usb estão os sensores. Adicionei a iostream, mas deu um monte de erro (que é clarro que eu não entendi.
“/usr/include/c++/4.7/bits/cpp_type_traits.h:214:12: erro: redefinition of ?struct std::__is_integer?
/usr/include/c++/4.7/bits/cpp_type_traits.h:147:12: erro: definição anterior de ?struct std::__is_integer?
In file included from /usr/include/c++/4.7/iostream:40:0,”
printf(“Informe as portas onde os sensores estão conectados. \n”);
printf("Luva A: ");
Tentei usando
cin >> usbA;
std::cin >> usbA;
usbA = cin.getline();
cin.getline(usbA, 20)
…
Edit:
Tirei todos os comando e deixei só o include da iostream, e o erro permanece, então o problema está na lib mesmo. Vou dar uma fuçada nas pastas de include aqui pra ver se resolve, se não faço a çeitura das usb usando a curses também.[/quote]
Olá, eu postei uma função que faz a mesma coisa que getch() da ncurses logo acima. Tira ancurses do projeto e usa aquela, que não possui dependências de outras libs.
Olá Juliocbq,
Tentei usar a função que você passou, mas como expliquei na mensagem acima, a inclusão da iostream está dando erro.
Como a opção com curses está funcionado certinho, vou deixar do jeito que está, mas vou copiar o código que me passou pois pode ser útil em outro projeto ou versão.
Obrigada pelas dicas!
Está acontecendo esse erro porque está usando o GCC (compilador de c ).
Para c++ use o g++.
Pelo terminal estou usando o g++ mesmo. Conferi a configuração do netbeans e também está com o g++. A pasta onde está o iostream.h está na configuração de include também.
não pode incluir iostream.h
o certo é:
#include
Estava dando erro com .h ou sem. Mas já resolvi o problema. Era o Netbeans que estava complicando demais, substituí pelo Sublime pra editar o código e estou compilando e executando pelo terminal. Com isso parou de dar erro.
Obrigada pelas dicas!
[quote=Isabeleaa]Estava dando erro com .h ou sem. Mas já resolvi o problema. Era o Netbeans que estava complicando demais, substituí pelo Sublime pra editar o código e estou compilando e executando pelo terminal. Com isso parou de dar erro.
Obrigada pelas dicas![/quote]
ok.
Misturar java e C pode não ser necessário (não diretamente rs), já pensou em acessar o USB direto pelo java mesmo?
http://www.steelbrothers.ch/jusb/
http://jusb.sourceforge.net/
[quote=dudaskank]Misturar java e C pode não ser necessário (não diretamente rs), já pensou em acessar o USB direto pelo java mesmo?
http://www.steelbrothers.ch/jusb/
http://jusb.sourceforge.net/
[/quote]
O usb vai usar c do mesmo jeito com jni. A diferença é que alguém já escreveu o código para você.