bugfix> c++ > 投稿

私のコードは、配列内にある負の要素の数をカウントすることになっています。しかし、私はこのエラーでヒットし続けます "変換できません 'double()[3] 'から' int'引数' 1 'から' double numberNegative(int *、int、int) '"

#include <iostream>
using namespace std;

int numberNegative(double arr[], int r, int c);
int counter = 0;
int main(){
    double data[2][3] = {{-3.0, 1, 4.5}, {-2.2, 7, 1.4}};
    cout<<numberNegative(data, 2, 3)<<endl;
    return 0;
}

int numberNegative(double arr[], int r, int c){
    for (int i = 0; i < r; i++){
        for (int j = 0; j <= c; j++){
            if (arr[i] < 0) counter++;
            if (arr[i][j] < 0) counter++;
        }
        return counter;
    }
}

回答 2 件
  • まあ-あなたはあなたのコンパイラに耳を傾けるべきです-それは正しいです。

    2D配列(実際には配列の配列)がある場合 double [3] )、アクセス時に、最初のレベルの間接参照(最初の [..] )は最初の要素へのポインタに変換されます。そう double arr[2][3]; に変換されます配列へのポインタ double[3] 。 (2の最初の配列へのポインタ double[3] 配列)。のタイプ配列へのポインタ double[3] です double (*)[3] -コンパイラが言っているように。

    物事を正しく機能させるには、プロトタイプは次のようにする必要があります。

    int numberNegative (double (*arr)[3], int r, int c);
    
    

    次に、関数内で、次のようにして負の値の数を数えることができます。

       for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++) {
                if (arr[i][j] < 0)
                    counter++;
            }
        }
        return counter;
    
    

    注意: j < c ない j <= c (配列の境界を1だけ超えています) if (arr[i] < 0) counter++; ポインタを比較しようとします double0

    さらに、あなたは持つことはできません return counter; あなたの中で for ループして、正しい値を返すことを期待しますすべて2D配列の負の値。あなたがする場所:

    for (int i = 0; i < r; i++){
        ...
        return counter;
    }
    
    

    あなたは移動する必要があります return counter; 関数の最後(最後のステートメント)までのループから。

    グローバルな必要はありません int counter; 「名前空間stdを使用している理由」を参照してください。悪い習慣だと思いますか?

    まとめると、次のようになります。

    #include <iostream>
    int numberNegative (double (*arr)[3], int r, int c);
    int main (void) {
        double data[2][3] = {{-3.0, 1, 4.5}, {-2.2, 7, 1.4}};
        std::cout << numberNegative (data, 2, 3) << '\n';
    }
    int numberNegative (double (*arr)[3], int r, int c)
    {
        int counter = 0;
        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++) {
                if (arr[i][j] < 0)
                    counter++;
            }
        }
        return counter;
    }
    
    

    参照:C ++:「std :: endl」と「\ n」

    使用例/出力

    $ ./bin/count_double_neg
    2
    
    

    これに対応します -3.0 そして -2.2 。物事を見て、質問があれば私に知らせてください。

  • 関数のプロトタイプは次のようになります int numberNegative(double **arr, int r, int c)

    関数のパラメータでは、 double arr[] に等しい double *arr 。きみの data タイプです double [][] 、これは double ** 、に変換できません double *

あなたの答え