【问题标题】:Strange printf equation奇怪的 printf 方程
【发布时间】:2012-03-31 18:04:20
【问题描述】:

我有 2 个指向某些 Point 结构的指针。我想计算两点之间的距离(我不需要计算它的根)所以我有这个:

    w[0]=X[l];
    w[1]=X[l+1];
    d=m(w[0]->x-w[1]->x)+m(w[0]->y-w[1]->y);
    printf("--TEST %d %d %d\n",w[0]->x,w[1]->x,w[0]->x-w[1]->x);

输入:X[l] = (0,1), X[l+1] = (2,0) 输出:--TEST 0 2 -1

这是为什么呢? 编辑:


这是 find 函数的一部分,它找到两个点之间距离最小的点。主要是我有这个:

X=(Punkt**)malloc(sizeof(Punkt*)*n);
Y=(Punkt*)malloc(sizeof(Punkt)*n);
int x,y;
for(int i=0;i<n;++i) {
    scanf("%d %d",&x,&y);
    Y[i].x=x;
    Y[i].y=y;
    X[i]=(Punkt*)malloc(sizeof(Punkt*));
    X[i]=&Y[i];
}
Quicksort(X,0,n-1);
Punkt **wynik=find(0,n-1);
printf("%d %d\n%d %d",wynik[0]->x,wynik[0]->y,wynik[1]->x,wynik[1]->y);

我检查了快速排序,它可以正常工作。函数 m: #define m(a) ((a)*(a)) 只有 find 函数在那部分有错误。这可行,但我不想为每个坐标创建变量。

int trash1=w[0]->x;
int trash2=w[1]->x;
printf("--TEST %d %d %d\n",w[0]->x,w[1]->x,w[0]->x-w[1]->x,trash1-trash2);

输入:2 个点 (0,1) (2,0) 输出:--TEST 0 2 -1 -2

【问题讨论】:

  • 你能提供更多的上下文吗? w 和 X 在哪里定义?你怎么知道数组中的值就是你认为的那样?
  • 我的猜测是:未定义的行为!如果您提供有问题的类型并在代码中使用更多空间,则可能更容易发现。
  • 请学习使用空格(以及更好的变量名)。
  • 您能否向我们展示m 函数并告诉我们您没有以任何方式更改传入的变量?
  • 你打错了:printf("--TEST %d %d %d\n",w[0]-&gt;x,w[1]-&gt;x,w[0]-&gt;x-w[1]-&gt;x,trash1-trash2); 你有 3 个格式说明符,你正在打印四个值

标签: c pointers printf


【解决方案1】:

我正在尝试重现您的体验。使用这个我得到0 - 2 = - 2 结果:
(也就是说,无法复制。)

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

#define m(a) ((a)*(a))

typedef struct pkt {
    int x;
    int y;
} Punkt;

int main(void)
{
    Punkt **X;
    Punkt  *Y;
    Punkt  *w[2];
    int x, y;
    int n = 2;
    int i;

    X = malloc(sizeof(Punkt*) * n);
    Y = malloc(sizeof(Punkt) * n);

    printf("Enter 2 integer point pairs: ");
    for(i = 0; i < n; ++i) {
        scanf("%d %d", &x, &y);
        Y[i].x = x;
        Y[i].y = y;
        X[i] = &Y[i];
    }

    i = 0;
    w[0] = X[i];
    w[1] = X[i + 1];
    i = m(w[0]->x - w[1]->x) + m(w[0]->y - w[1]->y);

    printf("D: m(%d - %d) + m(%d - %d) = "
           "%d + %d = "
           "%d\n",
             w[0]->x,  w[1]->x,    w[0]->y,  w[1]->y,
           m(w[0]->x - w[1]->x), m(w[0]->y - w[1]->y),
           i);

    printf("TEST: %d - %d = %d\n",
            w[0]->x,
            w[1]->x,
            w[0]->x - w[1]->x);

    free(X);
    free(Y);

    return 0;
}

示例:

$ ./pq
Enter 2 integer point pairs: 0 1 2 0
D: m(0 - 2) + m(1 - 0) = 4 + 1 = 5
TEST: 0 - 2 = -2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多