0

私のコンパイラは、「small」と「x」がこのスコープで宣言されていないと言い続けますが、正確に表示されるように配列を修正するにはどうすればよいですか?全体として、コードは配列に格納されている最小の正の非ゼロ値を見つけることになっています。

#include <iostream>
#include <string>
using namespace std;


int findthesmall( int small[x], int y) 
{
  for(int i=0; i< y; i++){
    for(int j=0; j< y; j++){
      int temp = small[i];
      if( small[i] > small[j] )
      small[i] = small[j];
      small[j] = temp;
    }
  }
  return small[0];

}

int main(){
  return 0;
}
4

4 に答える 4

3

私はあなたが必要だと思います:

int findthesmall( int* small, int y) {
于 2012-12-19T01:29:47.543 に答える
2

これを試して:

int findthesmall( int small[], int y) {
   for(int i=0; i< y; i++){
      for(int j=0; j< y; j++){
         int temp = small[i];

         if( small[i] > small[j] )
            small[i] = small[j];
         small[j] = temp;
      }
   }
   return small[0];

}

int main(){
   return 0;
}
于 2012-12-19T01:31:42.377 に答える
1
int small[x]

これは 2 つの理由で違法です。

  • あなたのコンパイラが言うように、Xは未定義です
  • 配列のサイズを非コンパイル時定数の値に設定することはできません。

これを修正するには、@ajon が提案したこと (配列をポインター + 長さとして渡す) を行うことができます。これは歴史的に配列を渡す方法です。

ただし、C++ には他にも優れた方法があります。

  • std::arrayまたはの使用を検討できますstd::vector。どちらも他の変数と同じように渡すことができ、独自のサイズを知っており、通常の配列のようにアクセスできます
  • または、templateコードを使用して配列のサイズを自動的にキャプチャすることもできます。

    template<int len>
    int findthesmall(int (&small)[len]){

2番目のオプションは、他のオプションよりも少し複雑で複雑かもしれません。特に、回答を得たので、完全を期すためにここに含めています。

于 2012-12-19T01:30:10.120 に答える
1

他の回答とは別に、ロジックにもバグがあります。関数名が示すように、関数が最小の要素を見つけるだけの場合は、1 つの for ループで十分です。以下に示すサンプルコード:

int findthesmall( int small[], int y) 
{
  int temp = small[0];
  for(int i=1; i< y; i++)
  {
  if( temp > small[i] )
      temp = small[i];
  }
  return temp; 
}

または、 std::min_element アルゴリズムも使用できます

std::cout << *std::min_element(small, small+y) << std::endl;
于 2012-12-19T01:35:52.710 に答える