-1

我正在尝试实现一个控制信号,它为矩阵的每个元素添加一个值,并随着变化打印整个矩阵。

基本上,我通过在矩阵的第一个元素 ( matrix[0][0]) 中添加 1 来模拟这一点,然后控制信号将在矩阵的每个元素中添加 1,然后打印它。

问题是,它应该每秒打印 32 个矩阵,并进行 32 次更改。如下所示:

1 0 0
0 0 0
0 0 0

1 1 0
0 0 0
0 0 0

1 1 1
0 0 0
0 0 0

... 等等。

首先,我尝试使用 3x3 矩阵,它每秒正确打印 9 个矩阵。但是当我尝试将其更改为 32x32 时,打印将近 10 个矩阵需要 3-4 秒,因此速度要慢得多。

这是我的代码:

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

int matrix[3][3] = {0};
int row=0;
int col=0;
int i, j, k, l;
int seccount = 0;


void value_changer();
static void catch_signal(int signal)
{
        for(i=0; i<3; i++)
        {
                for(j=0; j<3; j++)
                {
                       if(i==0 && j==0)
                       {
                              //continue;
                              for(k=0; k<3; k++)
                              {
                                      for(l=0; l<3; l++)
                                      {
                                              printf("%d ", matrix[k][l]);
                                      }
                                      printf("\n");
                               }
                             printf("\n");

                       }
                     else
                      {
                             matrix[i][j] += 1;
                             for(k=0; k<3; k++)
                             {
                                    for(l=0; l<3; l++)
                                    {
                                            printf("%d ", matrix[k][l]);
                                    }
                                    printf("\n");
                            }
                            printf("\n");
                    }
            }
    }
}

void value_changer()
{
       matrix[0][0] += 1;
       raise(SIGINT);
       printf("***************** Seconds: %d ********************\n",seccount++);
 }

int main()
{
     //value_changer();
    if (signal(SIGINT, catch_signal) == SIG_ERR)
    {
            fputs("An error occurred while setting a signal handler.\n", stderr);
            return EXIT_FAILURE;
    }

    puts("Raising the signal.");

    while(1)
    {
            //raise(SIGINT);
            value_changer();
            sleep(1);
    }


    return 0;
}

首先,我这样做是正确的还是遗漏了什么?第二,这个控制信号是否正确?第三,是否有任何其他(更好和更有效)的方式来执行上述操作?

注意:给定程序是每秒 3x3 矩阵和 9 个矩阵,带有控制信号。

4

1 回答 1

0

输出到终端很慢。我建议您在内存中创建数据并执行单个输出操作。我还建议您在信号处理程序之外构建数据,并且只在那里进行输出。


char buffer[4096];

static void catch_signal(int)
{
    printf(buffer);
}

void value_changer(void)
{
    char temp[32];

    /* "Reset" buffer */
    buffer[0] = '\0';

    /* Do whatever "output" operations needed */
    for (int i = 0; i < sizeof(matrix) / sizeof(matrix[0]); i++)
    {
        for (int j = 0; j < sizeof(matrix[i]) / sizeof(matrix[i][0]); j++)
        {
            snprintf(temp, sizeof(temp) - 1, "%d ", matrix[i][j]);
            strcat(buffer, temp);
        }
        strcat(buffer, "\n");
    }

    /* Do the other stuff */
    /* ... */
}
于 2013-04-16T05:42:57.107 回答