11

使用getch()していますが、アプリがすぐにクラッシュします。行うときを含む:

int main()
{
    getch();
}

リンクが見つかりませんが、おそらく問題は、バッファリングまたはそれらの行に沿って何か奇妙なことをオフにする必要があることでありcout、クロスプラットフォームコードと連携したい.

を使用するように言われましstd::cin.get()たが、ユーザーが文字や数字を入力してからEnterキーを押して終了するのではなく、キーが押されたときにアプリを終了させたいと思います。

これには何か機能がありますか?コードは Mac (my os) および Windows で動作する必要があります。


リンク/コンパイルは問題ではありません。私はXCodeにインクルード<curses.h>してリンクしますが、Windowsは.-lcurses<conio.h>

4

4 に答える 4

13

関数が<curses.h>何をするかを調べましたか?getch()

ヒント: OSX と Linux は Windows と同じではありません。

具体的には、 のマクロとして<curses.h>、次のことがわかります。

#define getch() wgetch(stdscr)

現在、あなたのシステムでgetch()は、curses ライブラリに実際の関数があるように見えますが、それはstdscrセットアップされることを期待しており、それは curses 初期化関数 (initscr()および関連関数) によって行われ、コードによってシグナル的に行われていません。 . したがって、コードは、正しい初期化が行われる前に curses ルーチンを呼び出して未定義の動作を呼び出しており、クラッシュにつながっています。

(dmckee からの良いヒント - acidzombie24 からリンク行を取り出すのに役立ちました。これは重要でした。)

単一のキーストロークを読み取ってプログラムを正常に終了できるようにするには、Unix (OSX、Linux) でかなりの作業を行う必要があります。端末の初期状態をトラップし、atexit()関数 (または同様のメカニズム) を手配して端末の状態を復元し、端末をクック モードから raw モードに変更し、関数を呼び出して文字を読み取る必要があります (おそらくだけread(0, &c, 1))、終了します。他の方法もあるかもしれませんが、確かにいくつかのセットアップと分解操作が必要です。

Mark Rochkind によるAdvanced Unix Programming, 2nd Ednが参考になるかもしれません。必要なレベルでの端末処理をカバーしています。または、適切に使用することもできます<curses.h>。これは、独自のソリューションよりも簡単で、おそらくより信頼性が高くなります。

于 2008-11-06T01:13:17.547 に答える
2

あなたは出品していません

#include <stdio.h>

また

#include <curses.h>

または類似の行。を含む ライブラリに対してリンクしていますgetch()か?

于 2008-11-06T00:29:52.860 に答える