Я встречал странные проблемы между C и Go по поводу ncurses.
Проблемы ниже
- Тот же код, реализованный в C и Go, работает по-разному.Код Go не работает, как задумано.
- getmaxyx () (getmaxy и getmaxx) при Go всегда возвращает исходный размер, даже после изменения размера терминала.
- Функция getch () не возвращает код ключа при изменении размера терминала.
Мои коды C для ncurses приведены ниже.
#include <stdio.h>
#include <stdbool.h>
#include <locale.h>
#include <ncursesw/curses.h>
void draw(int count, int ch);
int main(void)
{
setlocale(LC_ALL, "");
initscr();
timeout(50);
noecho();
cbreak();
curs_set(0);
start_color();
keypad(stdscr, true);
int count = 0;
draw(count, 0);
for (;;) {
int ch = getch();
if (ch < 0) {
continue;
}
count++;
draw(count, ch);
}
}
void draw(int count, int ch)
{
int y, x;
getmaxyx(stdscr, y, x);
char s[64];
sprintf(s, "count=%5d y=%d x=%d ch=%d ", count, y, x, ch);
mvwaddstr(stdscr, 1, 1, s);
wrefresh(stdscr); // 안해도 갱신 되네?
}
Мои коды go для ncurses приведены ниже.
package main
// #include <stdlib.h>
// #include <locale.h>
// #include <ncursesw/curses.h>
// #cgo LDFLAGS: -lncursesw
import "C"
import "unsafe"
import "fmt"
func main() {
// C Code : setlocale(LC_ALL, "");
{
_s := C.CString("")
defer C.free(unsafe.Pointer(_s))
C.setlocale(C.LC_ALL, _s)
}
C.initscr()
C.timeout(50)
C.noecho()
C.cbreak()
C.curs_set(C.int(0))
C.start_color()
C.keypad(C.stdscr, C.bool(true))
var count int = 0
draw(count, 0)
for {
ch := int(C.getch())
if ch < 0 {
continue
}
count++
draw(count, ch)
}
}
func draw(count int, ch int) {
// C Code : getmaxyx(stdscr, y, x)
var y, x int
{
_y := C.getmaxy(C.stdscr)
_x := C.getmaxx(C.stdscr)
y = int(_y)
x = int(_x)
}
var s string
s = fmt.Sprintf("count=%5d y=%d x=%d ch=%d ", count, y, x, ch)
// C Code : mvwaddstr(stdscr, 1, 1, s);
{
_s := C.CString(s)
defer C.free(unsafe.Pointer(_s))
C.mvwaddstr(C.stdscr, C.int(1), C.int(1), _s)
}
C.wrefresh(C.stdscr)
}
Коды печатают некоторую информацию при запуске и перепечатывают после обработки ключа
И, как я уже говорил, только C печатает обновленный размер и печатает, когда размер терминалаизменено.