Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
二维阵列C的快速输出_C_Arrays_Performance_Optimization - Fatal编程技术网

二维阵列C的快速输出

二维阵列C的快速输出,c,arrays,performance,optimization,C,Arrays,Performance,Optimization,我希望使用一种输出2D阵列的方法,这种方法对速度进行了优化。目前我正在使用: for (int row(0); row < 20; ++row) { for (int col(0); col < 30; ++col) { putchar(grid[row][col]); } putchar('\n'); } 我收到了一个巨大的速度提升,但是它的格式不正确,因为它只是为我的阵列输出

我希望使用一种输出2D阵列的方法,这种方法对速度进行了优化。目前我正在使用:

for (int row(0); row < 20; ++row)
    {
        for (int col(0); col < 30; ++col)
        {
            putchar(grid[row][col]);
        }
        putchar('\n');
    }
我收到了一个巨大的速度提升,但是它的格式不正确,因为它只是为我的阵列输出一长串字符,而不是我想要的30x20网格。我想知道是否有任何方法可以获得正确格式化网格的
printf
行所显示的速度


作为参考,当使用第一种方法时,我得到大约33毫秒,使用第二种方法时得到1.5毫秒。

如果您让每一行以“\0”字符结尾,您可以这样做:

for(int row=0; row<20; ++row)
{
    printf("%s\n", grid[row]);
}

for(int row=0;row如果使每一行以'\0'字符结尾,则可以执行以下操作:

for(int row=0; row<20; ++row)
{
    printf("%s\n", grid[row]);
}

for(int row=0;row您可以使用fwrite()一次写入每一行:

for(int行=0;行<20;++行){
fwrite(网格[行],网格[行]的大小,1,标准输出);
putchar('\n');
}
顺便说一句,您的代码使用
printf(“%s”,grid)编写整个
网格
最有可能导致未定义的行为。
%s
要求参数是指向以null结尾的字符串的指针,并且
网格
的结尾可能没有null。如果它似乎正常工作,那只是偶然的,因为
网格
后面的内存中碰巧有一个空字节


请注意,此解决方案仅适用于实际的二维数组
char
。如果它是指针数组,则可以用一个变量或宏替换
sizeof grid[row]
,该变量或宏指定
grid[row]
指向的每一行的大小(或如问题中所述的硬编码
30
).

您可以使用fwrite()一次写入每一行:

for(int行=0;行<20;++行){
fwrite(网格[行],网格[行]的大小,1,标准输出);
putchar('\n');
}
顺便说一句,您的代码使用
printf(“%s”,grid)编写整个
网格
最有可能导致未定义的行为。
%s
要求参数是指向以null结尾的字符串的指针,并且
网格
的结尾可能没有null。如果它似乎正常工作,那只是偶然的,因为
网格
后面的内存中碰巧有一个空字节



请注意,此解决方案仅适用于实际的二维数组
char
。如果它是指针数组,则可以用一个变量或宏替换
sizeof grid[row]
,该变量或宏指定
grid[row]
指向的每一行的大小(或如问题中所述的硬编码
30
).

如果你想加快打印速度,就不要打印。将其写入文件或其他东西……你是想使用
printf()吗
在第二段代码中?如果您要请求优化,请始终发布用于生成代码的编译器选项。如果未使用优化,则您发布的计时毫无价值。任何将任何内容放到屏幕上的函数都会很慢,因为它需要访问屏幕(以及其间的所有内容)。如果您确实需要加快速度,请在调用
printf
或类似命令之前将整个输出构造为字符串。但您的需要在我看来很可疑。不要尝试优化可能会变得无用的内容。@Nelxiost stdio使用缓冲,因此它不会为每个字符访问屏幕。如果您想要加快速度,请不要打印。将它写入文件或其他东西…您是想使用
printf()吗
在第二段代码中?如果您要请求优化,请始终发布用于生成代码的编译器选项。如果未使用优化,则您发布的计时毫无价值。任何将任何内容放到屏幕上的函数都会很慢,因为它需要访问屏幕(以及其间的所有内容)。如果您确实需要加快速度,请在调用
printf
或类似命令之前,将整个输出构造为字符串。但您的需要在我看来很可疑。不要尝试优化可能会变得无用的内容。@Nelxiost stdio使用缓冲,因此它不会为每个字符访问屏幕。他说,打印整个ReGRID似乎起作用了,除非它没有在行之间加上换行符。这意味着中间没有空缺。我说如果在每行末尾加上一个零,我建议的是,对不起,我读错了,我想你是说如果他已经这么做了。他说打印整个网格似乎起作用了,只是没有加新行。在中间行。这意味着中间没有空缺。我说如果在每行末尾加一个零,我建议的是,对不起,我读错了,我想你是说如果他已经这么做了。如果格子是动态分配的<代码> siZeof(格子[行])
将给出指针的大小。四到八个字节取决于系统。因此在这种情况下,正确的答案是:
fwrite(grid[row],sizeof grid[row][0],col,stdout)
@nikau6他将其描述为一个2D数组,而不是指针数组。
printf(“%s”,grid);
打印整个网格支持这一点(虽然我认为在动态分配行时,它们可能位于彼此相邻的位置)。2D数组可以是指针的2D数组。我并不是说他使用的是动态分配的数组,我只是告诉他,如果2D数组是动态分配的,它将不起作用。即使行彼此相邻,如果指针是动态分配的,它也会返回指针的大小。原因网格[n]包含地址而不是元素。网格[n]包含地址,网格[n][0]包含行的第一个元素。我在回答中添加了一个新的元素来解决此问题。如果网格是动态分配的
sizeof(网格[row])
将给出指针的大小。四到八个字节取决于系统。因此,在这种情况下,正确的答案是:
fwrite(grid[row],sizeof grid[row][0],col,stdout)
@nikau6他将其描述为2D
for (int row = 0; row < 20; ++row) {
    fwrite(grid[row], sizeof grid[row], 1, stdout);
    putchar('\n');
}