我正在尝试实现一个控制信号,该信号为矩阵的每个元素添加一个值,并随着变化打印整个矩阵。
基本上,我通过在矩阵的第一个元素(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矩阵的控制信号。
答案 0 :(得分: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 */
/* ... */
}