2016-03-18 21 views
2

フロートポインタで自分自身でスワップ関数を作成しようとしていて、うまくいきません。何らかの理由で私は正しい方法で関数へのfloatポインタを渡さないと思う。ポインタでスワップ関数を作成する際の問題

#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

このコードでは、 '&num1'と'&num2'をスワップに渡して、このコードで 'px'と' py'をすべて削除します。または、スワップコールで 'px'と' py'の前に '&'をなくしてください。この中で 'float **'が 'float *'と互換性がないという警告が表示されない場合、私はショックを受けます。 – WhozCraig

+0

コンパイル時には、常にすべての警告を有効にしてから、それらの警告を修正してください。 'gcc -c -Wall -Wextra -Wconversion -std = gnu99 file.c -o file.o'を使用してコンパイラの出力を行います:1)行:4:互換性のないポインタ型からの 'swap'の引数1を渡します2)行25:引数2を互換性のないポインタ型から渡す3)line4 expected 'float *'しかし引数は 'float **'型です。他のものを試す前に、これらの問題の修正を提案してください。注:警告を無視しないでください。 – user3629249

答えて

2

あなたはfloat値のちょうどアドレスの代わりにfloatへのポインタのアドレスを渡します。コンパイラは、この型の不一致について警告を発しているはず

swap(&num1, &num2); 

pxpy変数を除去するために、あなたの呼び出しを簡素化します。これらの警告を無視しないでください。プログラミングエラーを示しています。より良い場合でも、より多くの警告を有効にする:gcc -Wall -Wextra -Werrorまたはclang -Weverythingは、潜在的なエラーについてより多くの警告を生成する。

0

プロトタイプswapvoid swap(float** a, float** b);に変更します。

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

より多くのインダイレクションが明らかに優れています。それを3つの星にしてください。 – EOF

+1

私はこれを誤ってCのパラメータとしてポインタを渡す問題と誤解していました。したがって、より複雑な例です。あなたの*非常に*素敵なコメントをありがとう。 – ram

関連する問題