我在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 *
因为我想使用不同类型的函数。
答案 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
变量,则可以观察到此问题。