C交换二维数组中的元素

时间:2016-01-30 11:03:53

标签: c function swap

我在C中编写了交换函数。

void swapping(int dim, int size, void *n1, void *n2) {
   int s = dim * size;
   char a[s];
   memcpy(a, n2, s);
   memcpy(n2, n1, s);
   memcpy(n1, a, s);
}

我让我们说:

double t[10][3];
// write some value to array

当我交换两个元素时:

swapping(3, sizeof(double), &t[1], &t[2]);

printf在控制台上。我没有在每个地方得到正确的价值。 例如:with

t[1][3] = { 123.0000, 324.1231, 923.9992};

我得到了:

123.0000120, 324.1231029, 923.999350

问题出在哪里?

P.S。我使用void *因为我想使用不同类型的函数。

4 个答案:

答案 0 :(得分:1)

一些预先想法

首先,您不能将这样的值分配给数组,只有在初始化它们时才有效。所以,

t[1][3] = { 123.0000, 324.1231, 923.9992};

编译错误。您必须逐个分配它们(例如在循环中)

t[1][0] = 123.0000;
t[1][1] = 324.1231;
t[1][2] = 923.9992;

您的问题

以下是link ideone 编译器,以便您可以观察到不同的最终结果。基本上,它打印:

t2: 123.000000
t2: 324.123100
t2: 923.999200

由于您的操作系统管理可用空间的方式,您得到的最后两个后逗号数字是废话。它实际上不会删除或真正免费它,它只是将其标记为free可写,因为这样它更有效(没有不必要的操作) ,易于实现(链表),最后,它可以在没有额外磁盘写入的情况下恢复文件。

这就是为什么你最有可能与00不同的原因。这也来自C中浮动/双打的默认表示。

  

对于a,A,e,E,f和F说明符:这是小数点后要打印的位数(默认情况下,这是6)。

解决方案

通过

将精度限制为前4个后逗号数字
printf("t2: %.4f\n", t[2][i]);

答案 1 :(得分:0)

尝试

printf("%.4f\n",d);

我的问题类似于this one

进行测试。 如果您只是编写程序来扫描数字并打印相同的数字。然后在扫描时输入333.33333。它会为您输出333.333344

答案 2 :(得分:0)

您可以尝试<input class="name" name="name" type="text" id="name" placeholder="Name" required> <input class="email" name="email" type="email" id="email" placeholder="Email" required> 代替swapping(3, sizeof(double), t[1], t[2]);吗?

实际上,swapping(3, sizeof(double), &t[1], &t[2]);t[1],它是指向第二行的指针。这正是函数double*所需要的。

示例代码,基于您的:

swap

使用#include <stdlib.h> #include <stdio.h> #include <string.h> void swapping(int dim, int size, void* n1, void *n2) { int s = dim * size; char a[s]; memcpy(a, n2, s); memcpy(n2, n1, s); memcpy(n1, a, s); } int main(void) { int i,j; double t[10][3]; for(j=0;j<10;j++){ for(i=0;i<3;i++){ t[j][i]=j+0.04665387*i; } } t[1][0]=123.0000; t[1][1]=324.1231; t[1][2]=923.9992; // write some value to array swapping(3, sizeof(double), t[1], t[2]); for(j=0;j<10;j++){ for(i=0;i<3;i++){ printf("%.10lg ",t[j][i]); } printf("\n"); } return 0; }

进行编译

答案 3 :(得分:0)

对于合理的数组大小,您的swapping函数似乎是正确的。

您没有发布用于打印数组内容的代码,发布一个完整的可编译示例会让我们看出出现了什么问题。如果您对第一次和第二次打印输出使用不同的格式,或使用中间float变量,则可以观察到此问题。