3
  • コンパイラ:gcc4.5.2
  • ターミナル:Xterm
  • OS:Linux(x86)
  • Ncurses 5.9

ncursesを使用して配列をグラフィカルに表現するテキストエディタをプログラミングしていますkey_strokes[]。これは1次元なので、マクロを使用して( )INDEX(y*maxx+x)の現在の位置を指します。およびは、関数によって返される端末の現在の座標であり、関数によって返される各行に含めることができる列の最大量です。プログラムは、バックスペースを押すまではうまく機能します。何らかの理由で、下のスイッチに到達した後、の値はゼロに設定されます。もちろん、これは配列の最初の「行」のみに制限することをやめます。key_strokeskey_strokes[INDEX]yxgetyx(stdscr, y, x)maxxgetmaxyx(stdscr, maxy, maxx)maxxINDEX

ユーザーのキーストロークはとしてキャプチャされint key_strokesます。スイッチケースを使用して、矢印キー、バックスペース、F12などINDEXでありmaxx、次のように定義されているかどうかを確認します。

#define INDEX (y*maxx+x)
unsigned int maxx = 0;

私も使用していることに注意してくださいcbreak(); noecho(); keypad(stdscr, TRUE);

case KEY_BACKSPACE:
if (INDEX >= 0)
{
   for(i = INDEX; key_strokes[i] != '\0'; i++) {
   key_strokes[i] = key_strokes[i+1];
   }

   if (total_count > 0) {
   total_count--;
   }

   delch();
   if (x == 0) {
   move(y-1, maxx-1);
   }
   else {
   move(y, x-1);
   } refresh();
}
break;
4

2 に答える 2

1

ヌル文字で終了しますか?key_strokes[]

そうでない場合、forループは0に達するまで、メモリ内のすべてを前のセルにコピーします。maxxまたはmaxyが0の値の直前にある場合、それらは0に設定されます。

次のレイアウトを想像してみてください。

| key_strokes[0] | key_strokes[...] |   key_strokes[n] | maxy | maxx | some_other_var |
|            'v' |              'i' | non-null garbage |   23 |   80 |           '\0' |

'i'の後にbacksapceを押すと、次のようになります。

| key_strokes[0] | key_strokes[...] |   key_strokes[n] | maxy | maxx | some_other_var |
|            'v' | non-null garbage |               23 |   80 | '\0' |           '\0' |

maxyこれは、constが宣言されたときに0に設定される理由も説明できます(GCCはメモリ内の同じ場所にsをmaxx格納しません)。const

これkey_strokes[]がnullで終了するようにするには、これをinitセクションに追加することをお勧めします。

memset(key_strokes, 0, sizeof(char) * size_of_key_strokes_array);
于 2012-12-07T23:26:52.097 に答える
0

xとyのタイプ(つまり、符号付きまたは符号なし)はわかりませんが、計算するのは興味深いようです(yに符号なし整数を掛けてxを加算します)。この表現のタイプは何でしょうか?おそらくそれはyのタイプに依存します。条件でゼロ以上かどうかを確認するのは合理的ですか?(符号なしの値は常にgteゼロです...)

于 2012-12-07T23:25:05.297 に答える