2016-11-24 3 views
0

行列を関数に渡すことはできません。問題は"列 "と関係があります。しかし私は確信していません。 ポインタやアドレスは使用しないでください。 私のコードの品質に関するコメントがありましたら、教えてください! https://s12.postimg.org/5iuoci4bx/Untitled.png行列を関数に渡します。 "int(*)[columns]"から "int" [-fpermissive]への無効な変換 "

[#include <stdio.h> 
#include <conio.h> 
#include <stdlib.h> 
#include <iostream> 
#include <time.h> 
#include <stack> 
void random_create(void); 
int random_eval(const int, int, int); 
using namespace std; 
int main() { 
    random_create(); 
    system("pause"); 
} 

void random_create (void) 
{ 
    const int Low = 0, High = 1000; unsigned int rows, columns; 
    cout<<"Number of rows = "; cin>>rows; 
    cout<<"Number of columns = "; cin>>columns; 
    int a[rows][columns]; 
    srand((unsigned)time(NULL)); 
    cout<<"Randomly generated matrix of size "<<rows<<":"<<columns; 
    for (int i = 0; i<rows; i++){ 
     cout<<endl; 
     for (int j = 0; j<columns; j++){ 
     a[i][j] = Low + rand() % (High - Low + 1); 
     cout<<a[i][j]<<" "; 
    } 
    cout<<endl; 
    } 
    random_eval (a, rows, columns); 
} 
int random_eval(const int array, int rows, int columns){ 
    std::stack<int> stackMin; 
    std::stack<int> stackMax; 
    stackMin.push(100000); 
    stackMax.push(0); 
for (int i=0; i<rows; i++){ 
    for (int j = 0; j<columns; j++){ 
    if (array[i][j]> stackMax.top()){ 
     stackMax.pop(); 
     stackMax.push(array[i][j]); 
    } 
    else if (array[i][j]<stackMin.top()){ 
     stackMin.pop(); 
     stackMin.push(array[i][j]); 
    } 
} 
} 
cout<<"The biggest element in this array is "<<stackMax.top()<<endl; 
cout<<"The smallest element in this array is "<<stackMin.top()<<endl; 
} 
+0

を使用すると、コードを見てみたいと考えてあなたは投稿しました。奇妙な、コンパイル不可能なものがたくさんあります。 – user4581301

+0

あなたは正しいです、teサイトと関係があります。修正する –

+0

まず、 'int [N]'も 'int [N1] [N2]'も 'int'でも' int'にも変換できません。 'template int func(int(&arr)[Rows] [Cols])'のようにテンプレートを渡すのが最も簡単です。第2に、C++プログラムでは、自動ストレージC配列のサイズをコンパイル時に指定する必要があります。ランタイム時にディメンションを指定する場合は、 'random_create()'は 'new'を使用して動的配列を作成する必要があります。おそらく 'std :: vector'を見たり、独自のクラスを作るのでしょうか? –

答えて

0

あなたのコードは、それが困難なコードを読み取るようになります異なる多くのものをミックス:ここ はすべてのエラーです。あなたがすべきことは、機能を1つのことだけにして、その名前が言うことをすることです。生の配列を使用する代わりに、代わりに標準のコンテナを使用します。そのコンテナの周りに何らかのロジックがある場合は、それをクラスにカプセル化します。提案が続いた場合のコードは次のようになります。

あなたはポインタまたはアドレスを使用することができないならば、あなたは、行列をカプセル化するクラスを定義する必要があります:

class Matrix { 
public: 
    using Row = vector<int>; // or typedef vector<int> Row; if not using c++11 
    Matrix(int width, int height) : matrix_(height, Row(width)) { } 

    Row& operator[](size_t i) { return matrix_[i]; } 

    using const_iterator = std::vector<Row>::const_iterator; 
    using iterator = std::vector<Row>::iterator; 

    const_iterator begin() const { return matrix_.begin(); } 
    const_iterator end() const { return matrix_.end(); } 
    iterator begin() { return matrix_.begin(); } 
    iterator end() { return matrix_.end(); } 

private: 
    vector<Row> matrix_; 
}; 

あなたが悪いである、行列の生成を混合し、それをプリントアウトしています。関数は複数のことを行うべきではありません。独自の機能に印刷行列を移動:3つのつではなくintのマトリックスを取るrandom_eval

ostream& operator<<(ostream& out, Matrix::Row const& r) 
{ 
    for (auto&& elem : r) 
     out << elem << " "; 

    return out; 
} 

ostream& operator<<(ostream& out, Matrix const& m) 
{ 
    for (auto&& row : m) 
     out << row << "\n"; 

    return out; 
} 

変更:

random_eval INT(マトリックスCONST & M){...}

変更random_createに配列の代わりにMatrixを生成し、読者には読めないようにしてください。関数がその名前の通りに動作するようにしてください。つまり、ランダムな行列を作成して返します。生成する行列の次元をパラメータとする。また、Cのランドとsrand関数を削除し、代わりにC++ 11乱数発生器を使用します。

Matrix random_create(uint32_t rows, uint32_t columns) 
{ 
    random_device g; 
    const int Low = 0, High = 1000; 
    uniform_int_distribution<int> rng(Low, High); 
    Matrix a(columns, rows); 

    for (auto&& row : a) 
    generate(row.begin(), row.end(), [&]() { return rng(g); }); 

    return a; 
} 

int main() { 
    int rows, columns; 
    cin >> rows >> columns; 
    auto m = random_create(rows, columns); 
    cout << "Randomly generated matrix of size "<<rows<<":"<<columns<<"\n"; 
    cout << m << "\n"; 
    random_eval(m); 
} 

あなたは、次の余分なヘッダをインクルードする必要があります。

#include <algorithm> // generate 
#include <random> // random_device, uniform_int_distribution 
#include <vector> // vector 
#include <cstdint> // uint32_t 
+1

その行列を返すことをお勧めします。その1つの機能では生きておらず死ぬほどのことではありません。 – user4581301

関連する問題