3

私は初心者プログラマーで、母国語である C を学んでいます。

私は主に Deitel と Deitel の C How to Program の本から学んでいますが、大学のサンプルタスクやものも使用していますが、1 つにこだわっています。

私はポインターの非常に基本的な理解を持っています-変数の前に & を追加するとアドレスが出力され、 * ポインターを使用してそのアドレスなどに格納されている値が使用されます。

私が書いたコードは、2 つの数値の最大 (最大?) 公分母を計算するためのものであり、実際にはポインターを必要とせず、まったく必要としません。2 つの関数を使用しており、メインに戻すのではなく、2 番目の関数から実行すると正しい答えが画面に出力されるため、ロジックはすべて正しいです。ここに問題があります。

2 番目の関数が応答値を返すとき、何らかの理由で、ポインターであるとしか想定できないものを返します。なぜこれを行うのかわかりません。これを操作して値を検索するように変換することはできますが、2 番目の関数のローカル ポインターのようであり、上書きされます。私が見つけることができるウェブ上や私の本の中には、問題を解決する方法を教えてくれるものは何もありませんでした.

ここまで読んでくれてありがとう。ぶらぶらしすぎました。

これが私のコードと出力です。ヘルプやポインタ(しゃれを許して)をいただければ幸いです。2番目の関数で出力するだけでよいことはわかっていますが、希望する値を返さない方法と理由を知りたいです。

コード

#include <stdio.h>
int greatestCD (int num1, int num2);

int main(void)
{
    int a=0, b=0;
    int result;
    printf("Please enter two numbers to calculate the greatest common denominator from\n");
    scanf("%d%d", &a, &b);
    result = greatestCD (a,b);
    printf("Using the correct in main way:\nThe greatest common denominator of %d and %d is %d\n",a,b, result);
}

int greatestCD (int num1 ,int num2)
{ 

    if (num2==0){
        printf("Using the cheaty in gcd function way:\nThe greatest common denominator is %d\n",num1);
        return num1;
    } else {
        greatestCD(num2,(num1%num2));
    }    
}

出力 (12 と 15 を使用 - 答えは 3 である必要があります)

C:\Users\Sam\Documents\C programs>gcd
Please enter two numbers to calculate the greatest common denominator from
12
15
Using the cheaty in gcd function way:
The greatest common denominator is 3
Using the correct in main way:
The greatest common denominator of 12 and 15 is 2293524

frankodwyer からのこのような単純なソリューション。それは私が見つけられない、または知らないような小さなものです。では、返されたのはポインターではなく、ただのジャンクだったのでしょうか?

どうもありがとう。

4

5 に答える 5

10

関数 maximumCD() の最後の行に「return」ステートメントがありません

greatestCD(num2,(num1%num2));

成功する

return greatestCD(num2,(num1%num2));

(さらにデバッグする必要があるかもしれませんが、これがジャンクを返す理由です...他に何を返すかを伝えていません)

編集: また、将来コンパイルするときに、すべてのコンパイラ警告をオンにすることをお勧めします... gcc を使用している場合は、フラグ-Wallをコンパイル コマンドに追加してみてください。これは、このようなバグにつながる可能性のあることを行っているときに警告する必要があります。(そのような警告がすべて必ずしもエラーであるとは限らないため、「警告」となりますが、通常は問題の可能性を示しています。)

于 2008-12-26T19:08:58.343 に答える
4

あなたは C を学んでいるので、行方不明のバグとは関係なく、いくつかの観察とアドバイスがあります。

  • ポインターは、言語で最も習得が難しい機能です。 がっかりしないでくださいmalloc()free()

  • Deitel と Deitel を捨てて、 Kernighan と Ritchieのコピーを手に入れましょう。これは、これまでに書かれた最高の言語書の 1 つです。

  • 常にすべての警告をオンにします。 MacOS や Linux が使えるならgcc -Wall -Werror -Oかなり良いと思います。

  • すべての C プログラムをvalgrindの下で実行します。Valgrind は、ポインターの使用方法でエラーを検出するように設計された素晴らしいツールです。それはあなたのベーコンを救うでしょう!

幸運を!

于 2008-12-26T20:55:50.280 に答える
2

質問「Herb Schildt Book を使用して学習しないでください」、特に http://www.cs.technion.ac.il/users/yechiel/CS/BadBooksC+C++.html で参照されているリストを参照してください。ここには Deitel と Deitel による C++ の本がリストされていますが、特定の 2 人の著者による本の間には強い家族的類似性がある傾向があります。私は C に関する良い本を自分で手に入れたいと思っています。私は Kernighan & Ritchie (初版、1 版しかなかったとき) から学んだので、簡潔で正確 (C 自体のように) であることをお勧めします。

于 2008-12-26T22:37:47.767 に答える
2

関数から何も返さないため、値 2293524 はランダムなジャンクです。コンパイラは、戻り値の欠落に関する警告を表示しませんか?

于 2008-12-26T19:07:32.123 に答える
0

さらに奇妙なことは、プログラムが私の Linux マシンで動作することです。gcc のバグまたは機能ですか?

/dev/shm $ gcc x.c
/dev/shm $ ./a.out
Please enter two numbers to calculate the greatest common denominator from
12
15
Using the cheaty in gcd function way:
The greatest common denominator is 3
Using the correct in main way:
The greatest common denominator of 12 and 15 is 3
/dev/shm $ gcc --version
gcc (Debian 4.3.2-1) 4.3.2
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
于 2008-12-26T19:30:03.183 に答える