1

Das ist also mein Programm so weit:Initialisierung einer Tabelle

#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; 
} 

Ich verstehe, warum es nicht funktioniert. In damier[*][*] hat * entweder eine const oder eine feste Zahl sein. Kann mir jemand sagen, wie ich das umgehen soll?

+2

Mögliche Duplikate: [So erstellen Sie ein dynamisches Array von ganzen Zahlen] (http://stackoverflow.com/questions/4029870/how-to-create-a-dynamic-array-of-integers) – NathanOliver

+3

verwenden Sie 'std: : VECTOR' oder etwas angemessenere statt nackter c-style-Arrays – user463035818

+1

@NathanOliver Ihren Link zu einem gewissen Vorlage Frage ... – user463035818

Antwort

2

Worüber Sie sprechen, ist die dynamische Speicherzuweisung. Als tobi303 says, in C++ werden Sie wahrscheinlich wollen eine vector verwenden, die zu handhaben.

So ist die gesamte erste Abschnitt des Codes könnte ersetzt werden durch:

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); 

Um mit einem vector arbeiten Sie auch afficheDamier zu ändern brauchen würde:

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

Live Example

1

der Vorschlag von tobi303 hören: 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; 
} 

verwenden Wenn Sie einen C++ 11-Compiler verwenden, afficheDamier() kann wie folgt sein semplified (wie von Jonathan Mee vorgeschlagen)

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; 
} 
0

Wenn Sie Arrays verwenden und nicht std::vector, können Sie eine Funktion Vorlage verwenden, die das Array mit Bezug nimmt:

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; 
} 

oder sogar

template<size_t ligne, size_t colonne> 
void initDamier (int (&damier)[ligne][colonne]) 
{ 
    for (auto& x: damier) 
     for (auto& y: x) 
      y = 0; 
} 
+1

Nun, ja, aber dann können Sie die Dimensionen zur Laufzeit nicht wie im OP wählen. (Plus, 'std :: array' ist wahrscheinlich einfacher zu benutzen.) –

-1

Vielleicht wäre eine andere Lösung sein:

#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; 
} 
+1

Warum manuell zuordnen - und Speicherlecks - wenn ein' vector' das schon alles für uns erledigt? –

+0

Yeah, du hast recht, du musst die Speicherbehandlung manuell durchführen, deshalb habe ich als "mögliche Lösung" – SantyVillagomez

+1

geschrieben Da du von 'main' * zurückkehrst, ohne * deinen Speicher zu löschen, verlierst du effektiv Speicherverlust. Dieser schädigende Nebeneffekt weit übertrifft jeden möglichen Wert, den Ihre Lösung darstellen könnte. Bitte schließen Sie das Löschen ein, löschen Sie Ihre Antwort oder verwenden Sie 'vector', wie @underscore_d vorschlägt. –