2012-03-31 14 views
0

Ich habe 2 Zeiger auf einige Punktstrukturen. Ich wollte Abstand zwischen 2 Punkten berechnen (i brauchen nicht Wurzel davon berechnen), so habe ich diese:Seltsame printf Gleichung

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); 

Input: X [l] = (0,1), X [l + 1] = (2,0) Ausgabe: --TEST 0 2 -1

Warum ist das? Edit:


Dies war Teil Funktion finden, die zwischen ihnen mit dem kleinsten Abstand 2 Punkte findet. Hauptsächlich habe ich das:

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); 

Ich habe Quicksort überprüft, es funktioniert wie es sollte. Funktion m: #define m (a) ((a) * (a)) Nur Funktion finden haben Fehler in diesem Teil. Das funktioniert, aber ich möchte keine Variablen für jede Koordinate machen.

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); 

Eingang: 2 Punkte (0,1) (2,0) Ausgang: --test 0 2 -1 -2

+1

Können Sie etwas mehr Kontext zu machen? Wo sind 'w' und' X' definiert? Woher weißt du, dass die Werte in dem Array sind, was du denkst, sie sind? – templatetypedef

+0

Meine Vermutung ist: ** Undefiniertes Verhalten **! Wenn Sie die fraglichen Typen bereitstellen und etwas mehr Platz in Ihrem Code verwenden, ist es möglicherweise einfacher, sie zu erkennen. – pmg

+0

Lernen Sie bitte, Leerzeichen (und bessere Variablennamen) zu verwenden. – jamesdlin

Antwort

2

ich versuche zu reproduzieren, was Sie erleben. Mit diesem erhalte ich 0 - 2 = - 2 als Ergebnis:
(Mit anderen Worten, zu reproduzieren, nicht in der Lage.)

#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; 
} 

Probe:

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