2016-03-18 11 views
2

Ich versuche, eine Swap-Funktion selbst mit Float-Zeigern zu machen, und es funktioniert einfach nicht. Aus irgendeinem Grund denke ich, dass ich die float Zeiger auf die Funktion nicht in der richtigen Weise überlasse.Problem mit einer Swap-Funktion mit Zeigern

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

void swap(float *a, float *b); 

int main() { 
    float num1 = 0.0; 
    float num2 = 0.0; 

    float *px = NULL; 
    float *py = NULL; 

    printf("Please enter a decimal number: "); 
    scanf("%f", &num1); 
    getchar(); 

    printf("Please enter another decimal number: "); 
    scanf("%f", &num2); 

    px = &num1; 
    py = &num2; 

    printf("The numbers before swapping - \nNum1 = %f\nNum2 = %f\n", num1, num2); 

    swap(&px, &py); 

    printf("\nThe numbers after swapping - \nNum1 = %f\nNum2 = %f\n\n", num1, num2); 

    system("PAUSE"); 
    return 0; 
} 

void swap(float *a, float *b) { 
    float temp = *a; 
    *a = *b; 
    *b = temp; 
} 
+1

Löschen Sie alle Vorkommen von 'px' und' py' in diesem Code, indem Sie '& num1' und' & num2' an Ihren Swap übergeben. Oder verlieren Sie die '&' vor 'px' und' py' in Ihrem Swap-Aufruf. Wenn Sie nicht wenigstens eine Warnung über 'float ** bekommen, die nicht mit' float * 'kompatibel ist, bin ich schockiert. – WhozCraig

+0

Aktivieren Sie beim Kompilieren immer alle Warnungen und beheben Sie diese Warnungen. Mit 'gcc -c -Wall -Wextra -Wconversion -std = gnu99 file.c -o file.o' der Compiler-Ausgabe: 1) Zeile: 4: übergeben Argument 1 von 'swap' von inkompatiblen Zeigertyp 2) Zeile 25: Passing Argument 2 von 'swap' von inkompatiblen Zeigertyp 3) line4 erwartet 'float *' aber Argument ist vom Typ 'float **'. Schlage vor, diese Probleme zu beheben, bevor du etwas anderes versuchst. Hinweis: Warnungen nicht ignorieren. – user3629249

Antwort

2

Sie passieren Adressen von Zeigern auf float statt nur Adressen von float Werte. Entfernen Sie die px und py Variablen und vereinfachen Ihren Anruf:

swap(&num1, &num2); 

Der Compiler eine Warnung über diese Art Mismatch erteilt haben sollte. Ignorieren Sie diese Warnungen nicht, sie weisen auf Programmierfehler hin. Besser noch, aktivieren Sie weitere Warnungen: gcc -Wall -Wextra -Werror oder clang -Weverything werden mehr Warnungen über mögliche Fehler erzeugen.

0

Ändern Sie den Prototyp von swap zu void swap(float** a, float** b);. Dann modifiziere die Definition der Funktion zu:

+1

Mehr Umleitung ist offensichtlich besser. Mach bitte drei Sterne. – EOF

+1

Ich dachte irrtümlich darüber als das Problem der Weitergabe von Zeigern als Parameter in C, daher das mehr verworrene Beispiel. Danke für deinen * sehr * schönen Kommentar. – ram