だから私はここでこのチャートプロットプログラムを作成しました。ただし、いくつかの不具合があります。最初に、このプログラムがどのように機能するかを説明する必要があります。基本的に stdscr を使用して新しい win を作成する 「関数ジェネレーター」プログラムを作成する必要があります。正弦波形と余弦波形をエミュレートする文字が画面に表示されます。キャラクターがウィンドウをロールダウンすると、ウィンドウがスクロールします。ウィンドウの 1 つにフレーム (ヘッダー、行、フッター) が含まれます。もう 1 つのウィンドウは、正弦波と余弦波をスクロールして印刷するウィンドウです。私は長い間自分のコードをチェックしてきましたが、何が原因であるかはわかりません。
それでもプログラムを想像するのに問題がある場合は、ピンポンを考えてみてください...上下に 2 本の垂直線と、中央を通る線です。そして、この「法廷」/スクリーンでは、正弦波と余弦波が出力されます。
私の間違いは、sin と cosine が思い通りに印刷されていないということです... Newwin ウィンドウの境界を超えているようです。また、1 0 -1 から指定するフッターは、フッター内の必要な位置に移動しません。
#include <curses.h>
#include <math.h>
#include "fmttime.h"
#include <sys/time.h>
#include <time.h>
#include <unistd.h>
enum colors
{
BLACK,
RED,
GREEN,
YELLOW,
BLUE,
MAGENTA,
CYAN,
WHITE,
};
void Sim_Advance(int degrees); // Function prototype declarations
double Sim_Cos();
double Sim_Sin();
void frame(const char* title, int gridcolor, int labelcolor);
void mark(WINDOW* window, char ch, int color, double value);
static const double PI = (3.1415927/180); // Degrees to radian factor
static double PA = 0; // Phase angle
static int x; // X dimension of screen
static int y; // Y dimension of screen
static int delay1 = 300000; // 300ms Delay
struct timeval tv; // Timeval object declaration
int main(void)
{
initscr(); // Curses.h initilizations
cbreak();
nodelay(stdscr, TRUE);
noecho();
int keyhit;
int ctr = 1; // Exit flag
int degrees = 10; // Interval to be added to phase
int tempcounter = 1;
char buf[32]; // Buffer being sent to formattime
size_t len = sizeof(buf); // Size of buffer being passed
gettimeofday(&tv, NULL); // calling function for epoch time
formatTime(&tv, buf, len); // Calling formaTime for timestamp
getmaxyx(stdscr,y,x);
WINDOW* Window = newwin(y-4, x-2, 2, 5);
scrollok(Window, TRUE);
char cTitle[] = {"Real time Sine/ Cosine Plot"}; // Title string for plot
while (ctr == 1) // This will run the program till
{ // exit is detected (CTRL-X)
usleep(delay1/6); // Delays program execution
keyhit = getch();
mark(Window,'C', WHITE, Sim_Cos());
mark(Window,'S', RED, Sim_Sin());
Sim_Advance(degrees); // Advances PA by "degrees" value (10)
if (tempcounter == 1)
{
frame(cTitle, WHITE, RED); // Prints out the frame once
--tempcounter;
}
if (keyhit == 24)
{
ctr = 0; // Exit flag set
}
}
endwin();
return 0;
}
// Function will advance the Phase angle by assigned value of degrees
// The value of degrees must be an int and must be in radians
void Sim_Advance(int degrees)
{
PA = PA + degrees;
if (PA >= 360)
{
PA = PA - 360;
}
}
// Calculates the Cos of the Phase angle and returns value to main
double Sim_Cos()
{
double PARad; // Need to convert degrees into Radian
PARad = (PA*PI);
return cos(PARad);
}
// Calculates the Sin of the Phase angle and returns value to main
double Sim_Sin()
{
double PARad2; // Variable to hold radian value
PARad2 = (PA*PI);
return sin(PARad2);
}
// Will print the grid and Axis of the display as well as a title for the display
// with variable background and/or foreground colors
void frame(const char* title, int gridcolor, int labelcolor)
{
int offset = 27/2; // Middle of string
int col = 0;
int row = 0;
int botline = 0;
start_color();
init_pair(0, labelcolor, BLACK);
init_pair(1, gridcolor, BLACK);
wmove(stdscr, 0, (x / 2)- offset);
wprintw(stdscr,"%s\n", title);
wrefresh(stdscr);
while (row != x) // This prints the top line
{
attrset(COLOR_PAIR(1));
wprintw(stdscr,"-");
wrefresh(stdscr);
++row;
}
while (col != y-4) // This prints the middle line
{
wmove(stdscr, col + 2, x/2);
wprintw(stdscr, "|\n");
wrefresh(stdscr);
++col;
}
while (botline != x) // Prints the bottom line
{
wprintw(stdscr, "-");
wrefresh(stdscr);
++botline;
}
attrset(COLOR_PAIR(0));
wmove(stdscr, y, 0); // These three things commands
wprintw(stdscr, "-1"); // Will print out the proper footer
wrefresh(stdscr);
wmove(stdscr, y, x/2);
wprintw(stdscr, "0");
wrefresh(stdscr);
wmove(stdscr, y, x);
wprintw(stdscr, "1");
wrefresh(stdscr);
}
// Will print out the characters passed to it in the designated
// window to which it points to.
void mark(WINDOW* window, char ch, int color, double value)
{
int cursep = (((x/2) * value) + (x/2)); // Prints character from middle
int currenty = getcury(window); // of screen
wmove(window, currenty+1, cursep-3); // Moves cursor to desired location
wrefresh(window);
usleep(delay1);
waddch(window, ch);
wrefresh(window);
}