1

所以这是我到目前为止的程序:

#include <iostream>
#include <windows.h>
using namespace std;
int colonne;
int ligne;

void initDamier (int damier[ligne][colonne])
{
    for (int i = 0; i < ligne; ++i)
        for (int j = 0; i < colonne; ++j)
            damier[i][j]=0; //0=case vide
}

void afficheDamier (int damier[ligne][colonne])
{
    for (int i = 0; i < ligne; ++i)
    {
        cout<<endl;
        for (int j = 0; j < colonne; ++j)
        {
            cout<<damier[i][j]<<"|";
        }
    }
}

int main()
{
    int a,b;
    cout<<"Entrez le nombre de ligne du damier:"<<endl;
    cin>>a;
    ligne=a;
    cout<<"Entrez le nombre de colonne du damier:"<<endl;
    cin>>b;
    colonne=b;
    int damier[ligne][colonne];
    initDamier(damier);
    afficheDamier(damier);
    return 0;
}

我明白为什么它不起作用。在中damier[*][*]*必须是 aconst或固定数字。有人可以告诉我如何解决这个问题吗?

4

4 回答 4

3

你说的是动态内存分配。正如tobi303 所说,在 C++ 中,您可能希望使用 avector来处理它。

因此,您的代码的整个第一部分可以替换为:

size_t a, b;
cout << "Entrez le nombre de ligne du damier:" << endl;
cin >> a;
cout << "Entrez le nombre de colonne du damier:" << endl;
cin >> b;
vector<vector<int>> damier(a, vector<int>(b, 0));
afficheDamier(damier);

为了使用 avector您还需要修改afficheDamier

void afficheDamier(vector<vector<int>> damier) {
    for(auto& i : damier){
        cout << endl;
        for(auto& j : i) {
            cout << j << '|';
        }
    }
} 

Live Example

请注意:我在vector<vector<int>>这里提出了一个建议,这可能是让玩具示例正常工作的最简单方法,但在生产代码中,最好避免使用 a vectorof vectors:vector-of-vectors 的问题是什么?

于 2016-04-19T13:19:10.780 回答
1

听听tobi303的建议:使用std::vector

#include <vector>
#include <iostream>

void afficheDamier (std::vector<std::vector<int> > const & damier) 
 {
   std::vector<std::vector<int> >::const_iterator  cil;
   std::vector<int>::const_iterator               cic;

   for ( cil = damier.begin() ; cil != damier.end() ; ++cil )
    {
      std::cout << std::endl;

      for ( cic = cil->begin() ; cic != cil->end() ; ++cic )
         std::cout << (*cic) << '|';
    }

   std::cout << std::endl;
 }

int main()
 {
   int ligne, colonne;

   std::cout << "Entrez le nombre de ligne du damier:" << std::endl;
   std::cin >> ligne;
   std::cout << "Entrez le nombre de colonne du damier:" << std::endl;
   std::cin >> colonne;

   std::vector<std::vector<int> > damier(ligne, std::vector<int>(colonne, 0));

   afficheDamier(damier);

   return 0; 
 }

如果您使用的是 C++11 编译器,afficheDamier()可以简化如下(由 Jonathan Mee 建议)

void afficheDamier (std::vector<std::vector<int>> const & damier)
 {
   for ( auto const & l : damier )
    {
      std::cout << std::endl;

      for ( auto const & c : l )
         std::cout << c << '|';
    }

   std::cout << std::endl; 
 }
于 2016-04-19T13:18:12.170 回答
0

如果要使用数组而不是std::vector,可以使用通过引用获取数组的函数模板:

template<size_t ligne, size_t colonne>
void initDamier (int (&damier)[ligne][colonne])
{
    for (int i = 0; i < ligne; ++i)
        for (int j = 0; j < colonne; ++j) // Note that you had a nasty typo in this line
            damier[i][j]=0;
}

甚至

template<size_t ligne, size_t colonne>
void initDamier (int (&damier)[ligne][colonne])
{
    for (auto& x: damier)
        for (auto& y: x)
            y = 0;
}
于 2016-04-19T13:39:42.997 回答
-1

也许另一种解决方案是:

#include <iostream>
using namespace std;

int colonne;

int ligne;

void initDamier (int **damier, int ligne, int colonne)
{
    for (int i = 0; i < ligne; ++i){
        for (int j = 0; j < colonne; ++j){
            damier[i][j]=0; //0=case vide
        }
    }
}

-

void afficheDamier (int **damier, int ligne, int colonne)
{
    for (int i = 0; i < ligne; ++i)
       {
        cout<<endl;
        for (int j = 0; j < colonne; ++j)
        {
            cout<<damier[i][j]<<"|";
        }
    }
    cout<<endl;
}

-

int main()
{
    int a,b;

    cout<<"Entrez le nombre de ligne du damier:"<<endl;
    cin>>a;
    ligne=a;
    cout<<"Entrez le nombre de colonne du damier:"<<endl;
    cin>>b;
    colonne=b;
    int** damier = new int*[colonne];

    for(int i=0;i<colonne;i++)
        damier[i] = new int[ligne];

    initDamier(damier,ligne, colonne);
    afficheDamier(damier, ligne, colonne);

    for(int i=0;i<colonne;i++)
        delete damier[i];

    delete[] damier;

    return 0;
}
于 2016-04-19T13:54:21.820 回答