2017-04-20 10 views
1

これは宿題のように聞こえる場合は、これは中期のレビュー質問であるため、四半期に備えて準備を進めています。最大のペアを見つけたときのポインタを使用

練習として、配列内の要素の最大合計を見つけてその結果を返すことをおすすめします。より良いこれを行う方法を見つけ出すために、私はそれが機能するためにこのように書きむしろC.よりもC++であるウェブ上のコード例を見つけました:

int findLargestSumPair(int arr[], int n) 
{ 
    int first, second; 
    if (arr[0] > arr[1]) 
    { 
     first = arr[0]; 
     second = arr[1]; 
    } 

    else 
    { 
     first = arr[1]; 
     second = arr[0]; 
    } 

    //traverse remaining array and find first and second largest elements 

    for (int i = 2; i<n; i++) 
    { 
     if (arr[i] > first) 
     { 
      second = first; 
      first = arr[i]; 
     } 
     else if (arr[i] > second && arr[i] != first) 
      second = arr[i]; 
    } 
    return (first + second); 
} 

だから、あなたのようなもので関数を呼び出した場合、

int largestSum = findLargestSumPair(numberarray, numberarraylength); 

...次に値はlargestSumに格納されます。

しかし、彼らは一緒に合算される前に、あなたは第一および第二位の数字を変数でを保存したい場合は、あなたがそのようなfirstとしての機能に変更される2つの以上のパラメータ、この関数をロードする必要があると思いますsecondfindLargestSumPair(int arr[], int n, int *first, int *second)に渡され、ポインタを使用することによって関数自体によって変更されるため、何も返されない最後に表示されます。

正しいトラックにはint *firstint *secondが正しい構文であることは、関数の定義の中のポインタである必要がありますか?私はその変更を行うことを試みたと私は、次のようなエラーを取得するので:

largestsum.c:3:6:note: expected 'int *' but argument is of type 'int' 
void findLargestSumPair(int arr[], int n, int *first, int *second) 

warning: passing argument 4 of findLargestSumPair makes pointer from integer without a cast: findLargestSumPair(numbers, 9, largest, next_largest); 

どのように機能を使用してではなく、結果を返すの値を変更するには、この場合には、誤ってポインタを使用していますか?

+0

* 3番目の引数を正しく使用しているようですが、呼び出しの3番目と4番目の引数の違いは何ですか?また、関数をどのように呼び出すか、どのような値/引数を含んでいるかなど、[最小限で完全で検証可能な例](http://stackoverflow.com/help/mcve)を表示してください。最後に、あなたは*実際に*エラーメッセージを*読みましたか?理解できないのはどうでしょうか? –

+0

申し訳ありませんが、私は学習障害がありますので、時々私のために行き、プログラミングを学ぶのが難しいです。リンクありがとう – cakebug

答えて

0

あなたがしようとしているのは、参照渡しです。詳細な説明と例についてはリンクを参照してください。 Passing-arguments-by-reference

0

このコードはあなたを助けることができることがあります。 `

void setValue(int num, int *var) 
{ 
    *var = num; 
} 
int main(int argc, char *argv[]) { 
    int a = 0; 
    setValue(2,&a); 
    printf("%d",a); 
    return 0; 
} 

` をそれは私のコンピュータ上で正常に動作し、

1

を期待通りの結果には、私はあなたの質問から理解どのような2でした、最大合計以外にも、配列内で最大と2番目に大きな数値を取得する必要があります。

次の変更を行う必要があります。以下の関数は最大の和を返し、最大値と2番目に大きな値を返します。

void findLargestSumPair(int arr[], int n, int *largest, int *second_largest) 
{ 
    ... 
    ... // The same code what you have used above with below modication 

    *largest = first; 
    *second_largest = second; 
    return (first + second); 
} 

は、以下のように関数を呼び出します。上記の呼び出し後

int first, second; 
lagest_sum = findLargestSumPair(arr, arr_len, &first, &second); 

を、あなたは変数second内の変数firstと第二位の内の最大値でしょう。

関連する問題