Elle prend en entrée le nombre de lignes puis le nombre de colonnes et mon programme devrait permettre de remplacer les 0 (ci-dessus) par les valeurs aux coordonnées de la matrice.
seulement quand je lance mon programme, il ne m'afficher que ça :
--- --- --- --- --- --- |
Et il s'arrête au moment d'afficher le premier élément de la matrice.
J'ai essayé plusieurs solutions pour l'afficher et celle-ci me parait la meilleure pour mon niveau mais mon programme s'arrête et aucun message d'erreur ne s'affiche.
#include <iostream>
#include <cassert>
using namespace std;
void initialiser(int **g, unsigned int lignes, unsigned int colonnes) {
//int** g;
g = new int*[colonnes];
for (int i = 0; i < colonnes; ++i) {
g[i] = new int[lignes];
}
}
void afficher_grille(int **g, unsigned int& lignes, unsigned int& colonnes)
{
for (unsigned int i = 1; i <= colonnes; ++i) {
cout << " ---";
}
cout << endl;
for (unsigned int l = 0; l < lignes; l++) {
for (unsigned int c = 0; c < colonnes; c++){
cout << "| " << g[l][c] << " "; // CETTE LIGNE POSE VISIBLEMENT PROBLÈME
}
for (unsigned int i = 1; i <= colonnes; ++i) {
}
cout <<"|" << endl;
for (unsigned int i = 1; i <= colonnes; ++i) {
cout << " ---";
}
cout << endl;
}
}
int main()
{
unsigned int lignes, colonnes;
int** grille;
cin >> lignes;
cin >> colonnes;
initialiser(grille, lignes, colonnes);
afficher_grille(grille, lignes, colonnes);
return 0;
}
Et l'indentation de ton code est complètement décalé, il faut corriger ca.
#include <iostream>
#include <cassert>
using namespace std;
void initialiser(int **g, unsigned int lignes, unsigned int colonnes) {
//int** g;
g = new int*[colonnes];
for (int i = 0; i < colonnes; ++i) {
g[i] = new int[lignes];
}
}
void afficher_grille(int **g, unsigned int& lignes, unsigned int& colonnes)
{
for (unsigned int i = 1; i <= colonnes; ++i) {
cout << " ---";
}
cout << endl;
for (unsigned int l = 0; l < lignes; l++) {
for (unsigned int c = 0; c < colonnes; c++){
cout << "| " << g[l][c] << " ";
}
cout <<"|" << endl;
for (unsigned int i = 1; i <= colonnes; ++i) {
cout << " ---";
}
cout << endl;
}
}
int main()
{
unsigned int lignes, colonnes;
int** grille;
cin >> lignes;
cin >> colonnes;
initialiser(grille, lignes, colonnes);
afficher_grille(grille, lignes, colonnes);
return 0;
}
J'ai réglé les problèmes d'identation, merci de me l'avoir fait remarqué, (et supprimé une boucle for inutile que j'avais oublié)
Et pour l'initialisation de la variable "grille" c'est la seule méthode utilisable que j'ai vu en cours pour pouvoir modifier la taille des lignes et des colonnes en entrée donc à part ça, pour pouvoir la créer dans la fonction initialiser, je ne sais pas trop comment faire
#include <iostream>
#include <cassert>
using namespace std;
void initialiser(int ***g, unsigned int lignes, unsigned int colonnes)
{
*g = new int*[colonnes];
for (unsigned int i = 0; i < colonnes; ++i)
{
(*g)[i] = new int[lignes];
}
for (unsigned int l = 0; l < lignes; l++)
{
for (unsigned int c = 0; c < colonnes; c++)
{
(*g)[l][c]=0;
}
}
}
void afficher_grille(int **g, unsigned int& lignes, unsigned int& colonnes)
{
for (unsigned int i = 1; i <= colonnes; ++i) {
cout << " ---";
}
cout << endl;
for (unsigned int l = 0; l < lignes; l++) {
for (unsigned int c = 0; c < colonnes; c++){
cout << "| " << g[l][c] << " ";
}
cout <<"|" << endl;
for (unsigned int i = 1; i <= colonnes; ++i) {
cout << " ---";
}
cout << endl;
}
}
int main()
{
unsigned int lignes, colonnes;
int** grille;
cin >> lignes;
cin >> colonnes;
initialiser(&grille, lignes, colonnes);
afficher_grille(grille, lignes, colonnes);
return 0;
}
Utiliser new ? On se sert encore de ça? Oui c'est bien de la torture ...
Effectivement il ne faut pas utiliser new, ni même malloc, qui sont des fonctions de trop haut niveau. new force l'initialisation de la mémoire et malloc ne fait pas la différence entre réserver et commit de la mémoire, ce qui le rend globalement inutilisable en pratique dans des projets sérieux
Quitte a ne pas utiliser les merveilles de la librairie standard (vive les cours du pré-jurassique), fais au moins une classe conforme RAII !!! Histoire d'automatiser la gestion de la mémoire un minimum.
class Grid
{
private:
unsigned mWidth;
unsigned mHeight;
public:
Grid(unsigned width, unsigned height):
mWidth{ width },
mHeight{ height }
{
new .... // blablabla, à toi de le mettre
}
~Grid()
{
delete .... // blablabla, à toi de le mettre
}
}
Alors, cet exercice remonte au Cambrien ? J'utilise malloc constamment en C, mais il ne me serait jamais passer par la tête de le faire en C++ Est-ce une bonne pratique d'enseignement que de forcer les gens à utiliser des outils archaïques ? Par exemple, en C, on demande aux gens de ne pas utiliser le for, seulement le while.
Je ne dis pas que while est archaïque, mais qu'il ne devrait pas simuler un for quand for est plus simple.
- Edité par PierrotLeFou 23 novembre 2021 à 2:10:48
Le Tout est souvent plus grand que la somme de ses parties.
Lecture de Matrice
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Discord NaN. Mon site.
Discord NaN. Mon site.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.