1

私のコードでは、両方の次元のサイズを入力してから、2次元配列を宣言します。私の質問は、その配列を関数パラメーターとしてどのように使用するかです。関数仕様に列数を書き込む必要があることはわかっていますが、列数を渡すにはどうすればよいですか?

 void gameDisplay(gameCell p[][int &col],int a,int b) {
         for(int i=0;i<a;i++) {
                for(int j=0;j<b;j++) {
                         if(p[i][j].getStat()==closed)cout<<"C ";
                         if(p[i][j].getStat()==secure)cout<<"S ";
                         if(p[i][j].getBomb()==true&&p[i][j].getStat()==open)cout<<"% ";
                         if(p[i][j].getBomb()==false&&p[i][j].getStat()==open) {
                                 if(p[i][j].getNum()==0)cout<<"0 ";
                                 else cout<<p[i][j].getNum()<<" ";
                         }
                 cout<<endl;
                 }
         }
 }

 int main() {
         int row,col,m;
         cout<<"Rows: ";cin>>row;cout<<"Columns: ";cin>>col;
         m=row*col;
         gameCell p[row][col];
         gameConstruct(p[][col],m);
         gameDisplay(p[][col],row,col);
 }

私はこの方法を試しましたが、うまくいきません。

ありがとうございました。

4

6 に答える 6

2

C ++では、可変長配列を持つことはできません。つまり、次のように、入力整数を取得して配列のサイズとして使用することはできません。

std::cin >> x;
int array[x];

(これはgccで機能しますが、移植性のない拡張機能です)

しかしもちろん、同様のことを行うことは可能です。動的なサイズの配列を使用できる言語機能は、を使用した動的割り当てnew[]です。あなたはこれを行うことができます:

std::cin >> x;
int* array = new int[x];

ただし、arrayここでは配列型ではないことに注意してください。ポインタ型です。2次元配列を動的に割り当てる場合は、次のようにする必要があります。

std::cin >> x >> y;
int** array = new int*[x]; // First allocate an array of pointers
for (int i = 0; i < x; i++) {
  array[i] = new int[y]; // Allocate each row of the 2D array
}

しかし、繰り返しになりますが、これはまだ配列型ではありません。これはint**、、または「intへのポインタへのポインタ」になりました。これを関数に渡したい場合は、関数の引数を。にする必要がありますint**。例えば:

void func(int**);
func(array);

それは大丈夫でしょう。ただし、ほとんどの場合、関数内の配列の次元を知る必要があります。どうやってそれができる?それらを追加の引数として渡すだけです!

void func(int**, int, int);
func(array, x, y);

これはもちろんそれを行う1つの方法ですが、それは確かに慣用的なC++の方法ではありません。すべてを忘れがちなので、安全性に問題がありdeleteます。メモリ割り当てを手動で管理する必要があります。メモリリークを回避するには、これを行う必要があります。

for (int i = 0; i < x; i++) {
  delete[] array[i];
}
delete[] array;

だから私があなたに言ったすべてを忘れてください。標準ライブラリコンテナを利用します。簡単に使用できstd::vector、寸法を渡す必要はありません。

void func(std::vector<std::vector<int>>);

std::cin >> x >> y;
std::vector<std::vector<int>> vec(x, std::vector<int>(y));
func(vec);

配列を動的に割り当てるのではなく、配列タイプを処理することになった場合は、配列への参照を取得するテンプレート関数を定義することで、配列の次元を取得できます。

template <int N, int M>
void func(int (&array)[N][M]);

関数は、渡されるすべての異なるサイズの配列に対してインスタンス化されます。テンプレートパラメータ(配列の次元)は、コンパイル時に認識されている必要があります。

于 2012-12-25T15:36:02.203 に答える
0

アクセスする代わりに、アクセスp[i][j]する必要があります-これは、メモリ内で次のサイズの配列にフラット化されるp[i*b + j]ため、実際にはコンパイラが行うことです。int[a][b]a*b

また、関数のプロトタイプを「void gameDisplay(gameCell p []、int a、intb)」に変更することもできます。

修正されたコード:

void gameDisplay(gameCell p[],int a, int b) {
         for(int i=0;i<a;i++) {
                for(int j=0;j<b;j++) {
                         if(p[i*a +j].getStat()==closed)cout<<"C ";
                         if(p[i*a +j].getStat()==secure)cout<<"S ";
                         if(p[i*a +j].getBomb()==true&&p[i][j].getStat()==open)cout<<"% ";
                         if(p[i*a +j].getBomb()==false&&p[i][j].getStat()==open) {
                                 if(p[i*a +j].getNum()==0)cout<<"0 ";
                                 else cout<<p[i*a +j].getNum()<<" ";
                         }
                 cout<<endl;
                 }
         }
 }

 int main() {
         int row,col,m;
         cout<<"Rows: ";cin>>row;cout<<"Columns: ";cin>>col;
         m=row*col;
         gameCell p[row][col];
         gameConstruct(p[][col],m);
         gameDisplay(p[],row,col);
 }
于 2012-12-25T15:58:42.347 に答える
0

私は小さなプログラムを作りました:

#include <iostream>
using namespace std;
void fun(int tab[][6], int first)
{}
int main(int argc, char *argv[])
{
    int tab[5][6];
    fun(tab, 5);
    return 0;
}

関数定義では、2番目のインデックスのサイズを指定する必要があります。列の数が引数として渡されます。

于 2012-12-25T15:24:52.403 に答える
0

これはあなたが探しているものですか?

int* generate2DArray(int rowSize, int colSize)
{
    int* array2D = new int[rowSize, colSize];
    return array2D;
}

例 。。。

#include <iostream>
#include <stdio.h>

int* generate2DArray(int rowSize, int colSize);
int random(int min, int max);

int main()
{
    using namespace std;

    int row, col;
    cout << "Enter row, then colums:";
    cin >> row >> col;

    //fill array and display
    int *ptr = generate2DArray(row, col);
    for(int i=0; i<row; ++i)
        for(int j=0; j<col; ++j)
        {
            ptr[i,j] = random(-50,50);
            printf("[%i][%i]: %i\n", i, j, ptr[i,j]);
        }

    return 0;
}


int* generate2DArray(int rowSize, int colSize)
{
    int* array2D = new int[rowSize, colSize];
    return array2D;
}

int random(int min, int max)
{
    return (rand() % (max+1)) + min;
}
于 2012-12-25T15:27:34.367 に答える
0

'int'の問題から、検証済みの質問のアドバイスに従い、std::vectorを使用していると推測しています。

これは、「配列」の列数(および問題がある場合は0)を返す関数です。

int num_column(const std::vector<std::vector<int> > & data){
    if(data.size() == 0){
        std::cout << "There is no row" << std::endl;
        return 0;
    }
    int first_col_size = data[0].size();
    for(auto row : data) {
        if(row.size() != first_col_size){
            std::cout << "All the columns don't have the same size" << std::endl;
            return 0;
        }
    }
    return first_col_size;   
}
于 2012-12-25T15:30:25.583 に答える
0

Cスタイルの配列を使用している場合は、パラメーターで参照を作成することをお勧めします。

int (&array)[2][2]; // reference to 2-dimensional array
于 2012-12-25T15:30:27.487 に答える