0

だから私はここでこのチャートプロットプログラムを作成しました。ただし、いくつかの不具合があります。最初に、このプログラムがどのように機能するかを説明する必要があります。基本的に 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);
}
4

1 に答える 1