2017-01-14 2 views
-2

zugewiesen bekommen, schrieb ich eine Funktion in C, die angeblich für vier Werte scannen und diejenigen zu vier Variablen zuweisen:Werte nicht richtig über Scanf

double xmin,xmax,ymin,ymax; 

double set(double xmin, double xmax, double ymin, double ymax){ 

printf("\nxmin:\t"); 
scanf(" %lf",&xmin); 
printf("\nxmax:\t"); 
scanf(" %lf",&xmax); 
printf("\nymin:\t"); 
scanf(" %lf",&ymin); 
printf("\nymax:\t"); 
scanf(" %lf",&ymax); 
printf("\n"); 

return xmin,xmax,ymin,ymax;} 

Irgendwie sind die Werte verloren gehen, wenn ich die Funktion später verwenden in der Hauptfunktion. Ich habe mit dem Debugger überprüft und festgestellt, dass die Werte überhaupt nicht zugewiesen werden. Also muss das Problem in dieser Funktion sein.

+2

'return xmin, xmax, ymin, ymax;' Das bedeutet nicht, was Sie denken, es tut. Gehen Sie die ersten Kapitel Ihres bevorzugten Tutorials noch einmal durch. – DeiDei

+2

'return xmin, xmax, ymin, ymax;' liefert den letzten Wert in der Liste –

+0

1. Lesen Sie die Manpage und überprüfen Sie die Rückgabewerte von 'scanf'. 2. Lesen Sie den [comma operator] (https://www.google.co.uk/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwi6g7zui8LRAhUJIcAKHQ2pAzkQFggcMAA&url=https%3A%2F% 2Fen.wikipedia.org% 2Fwiki% 2FComma_Operator & usg = AFQjCNE7qisSUg7u5BXhku7QzDf05p_8CQ & sig2 = Mvuz2MycSJu0i4YNNWXuVg) –

Antwort

1

Die Funktion set initialisiert seine eigene Argumentvariablen und gibt die letzte. Die globalen Variablen des Namens bleiben unverändert. Das Entfernen der Argumentvariablen behebt das Problem:

double xmin, xmax, ymin, ymax; 

void set(void) { 
    printf("\nxmin:\t"); 
    scanf(" %lf", &xmin); 
    printf("\nxmax:\t"); 
    scanf(" %lf", &xmax); 
    printf("\nymin:\t"); 
    scanf(" %lf", &ymin); 
    printf("\nymax:\t"); 
    scanf(" %lf", &ymax); 
    printf("\n"); 
} 

Aber ein besserer Ansatz ist, um die Adressen der Variablen übergeben, die main lokalen gemacht werden können, und den Rückgabewert von scanf() für die ordnungsgemäße Umsetzung zu überprüfen:

int set(double *xmin, double *xmax, double *ymin, double *ymax) { 
    printf("\nxmin:\t"); 
    if (scanf("%lf", xmin) != 1) 
     return -1; 
    printf("\nxmax:\t"); 
    if (scanf("%lf", xmax) != 1) 
     return -1; 
    printf("\nymin:\t"); 
    if (scanf("%lf", ymin) != 1) 
     return -1; 
    printf("\nymax:\t"); 
    if (scanf("%lf", ymax) != 1) 
     return -1; 
    printf("\n"); 
    return 0; 
} 

Anruf von main() auf diese Weise:

int main(void) { 
    double xmin, xmax, ymin, ymax; 

    if (set(&xmin, &xmax, &ymin, &ymax)) { 
     /* initialization error */ 
     exit(1); 
    } 
    ... 
} 
+0

Könnte eine gute Idee sein, um den Rückgabewert von' scanf' zu überprüfen. Ist es auch eine gute Idee, die Verwendung globaler Variablen zu empfehlen? –

+0

@EdHeal: gute Punkte, Antwort aktualisiert. – chqrlie

+0

Sind Sie sicher, dass im Falle eines Fehlers die Rückgabe von "True" (1) am besten ist? –

0

Übergeben Sie Zeiger auf Ihre Werte und nicht auf die Werte. die return -Statement wird veraltet; Beachten Sie, dass in scanf das Zeichen & entfernt wird, da Sie bereits einen Zeiger auf den Wert haben.

void (double *xmin, double *xmax, double *ymin, double *ymax) { 
    printf("\nxmin:\t"); 
    scanf(" %lf",xmin); 
    printf("\nxmax:\t"); 
    scanf(" %lf",xmax); 
    printf("\nymin:\t"); 
    scanf(" %lf",ymin); 
    printf("\nymax:\t"); 
    scanf(" %lf",ymax); 
    printf("\n"); 
} 

In Funktion main, ziehen `t vergessen Referenzen weitergeben müssen:

int main { 
    double xmin=0.0,xmax=0.0,ymin=0.0,ymax=0.0; 
    set(&xmin, &xmax, &ymin, &ymax); 
    ... 
+0

Ich sehe kein 'C++' -Tag, also funktioniert das nicht. – EOF

+0

Ändern Sie den Prototyp in 'void (double * xmin, doppelt * xmax, double * ymin, double * ymax)' 'und entfernen Sie die Adresse des Operators' & 'von den' scanf() 'Argumenten. – chqrlie

+0

danke @chqrlie, ich habe die einzige 'c'-tag übersehen –