Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di Pacio88
    Registrato dal
    Sep 2007
    Messaggi
    447

    [C++] Problema indice matrice dinamica

    Ho un problema nell'indicizzazione di una matrice.
    codice:
    #include <iostream>
    using namespace std;
    
    enum colore{bianco=0, grigio, nero};
    
    class Canvas{
    	int m, n;
    	colore** col;
    
    	friend ostream& operator<<(ostream&, const Canvas&);
    public:
    	Canvas(int, int);
    	~Canvas();
    	Canvas& operator=(const Canvas&);
    	bool clear(int, int);
    	void darken(int, int);
    };
    
    ostream& operator<<(ostream& os, const Canvas& ca){
    	for(int i=0; i<ca.n; i++)
    	{
    		for(int j=0; j<ca.m; j++)
    		{
    			if(ca.col[i][j]==0)
    				os << ". ";
    			if(ca.col[i][j]==1)
    				os << "G ";
    			if(ca.col[i][j]==2)
    				os << "N ";
    		}
    		os << endl;
    	}
    	return os;
    }				
    
    Canvas::Canvas(int i, int j){
    	m=i;
    	n=j;
    	col=new colore*[m];
    	for(int i=0; i<m; i++)
    		col[i]=new colore[n];
    	for(int i=0; i<m; i++)
    	{
    		for(int j=0; j<m; j++)
    			col[i][j]=bianco;
    	}
    }			
    
    Canvas::~Canvas(){
    	for(int i=0; i<m; i++)
    		delete[] col[i];
    	delete[] col;
    }	
    
    Canvas& Canvas::operator=(const Canvas& ca){
    	if(this==&ca)
    		return *this;
    	for(int i=0; i<m; i++)
    		delete[] col[i];
    	delete[] col;
    	m=ca.m;
    	n=ca.n;
    	col = new colore*[m];
    	for(int i=0; i<m; i++)
    		col[i]=new colore[n];
    	for(int i=0; i<n; i++)
    	{
    		for(int j=0; j<m; j++)
    			col[i][j]=ca.col[i][j];
    	}
    	return *this;
    }		
    
    bool Canvas::clear(int i, int j){
    	if(i>m || j>n)
    		return false;
    	if(col[i][j]==bianco)
    		return false;
    	else
    		col[i][j]=bianco;
    	return true;	
    }		
    
    void Canvas::darken(int i, int j){col[i][j]=nero;}
    
    int main(){
    	Canvas c(9,4);
    	cout << c << endl;
    	c.darken(1,1);
    	cout << c << endl;
    	return 0;
    }
    La classe Canvas gestisce una matrice dinamica. La funzione darken dovrebbe cambiare lo stato delle "caselle" della matrice da bianco a nero. Ma con mia sorpresa l'output è il seguente:

    codice:
    [Session started at 2008-12-23 15:42:45 +0100.]
    . . . . . . . . . 
    . . . . . . . . . 
    . . . . . . . . . 
    . . . . . . . . . 
    
    . . . . . N . . . 
    . N . . . . . . . 
    . . . . . . . . . 
    . . . . . . . . . 
    
    The Debugger has exited with status 0.
    Mi sarei aspettato che l'unica modifica fosse quella della casella indicizzata con (1,1) invece come potete osservare non è così.
    Ringrazio chi mi aiuterà.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480

    Re: [C++] Problema indice matrice dinamica

    Attenzione alle disattenzioni ...

    codice:
    Canvas::Canvas(int i, int j){
    	m=i;
    	n=j;
    	col=new colore*[m];
    	for(int i=0; i<m; i++)
    		col[i]=new colore[n];
    	for(int i=0; i<m; i++)
    	{
    		for(int j=0; j<n; j++)
    			col[i][j]=bianco;
    	}
    }
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di Pacio88
    Registrato dal
    Sep 2007
    Messaggi
    447
    Oggi non è proprio giornata

    Però, sapresti spiegarmi nello specifico perchè accade tutto questo per quello sciocco errore?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    In caso di errori di allocazione di memoria il comportamento è indefinito. Dipende dalla situazione in "quel momento" della memoria allocata.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it L'avatar di Pacio88
    Registrato dal
    Sep 2007
    Messaggi
    447
    Non so per quale mistero non funziona nemmeno adesso, nonostante la modifica l'output resta il medesimo.

  6. #6
    Cambia gli identificatori dei membri "m" ed "n" della classe "colore" in qualcosa di più significativo:
    ad esempio "fNumeroRighe" e "fNumeroColonne" ed il tuo errore dovrebbe esserti immediatamente evidente.

  7. #7
    Utente di HTML.it L'avatar di Pacio88
    Registrato dal
    Sep 2007
    Messaggi
    447
    Riprendo questa discussione perchè ho l'identico problema che avevo postato tempo fa.. come sempre ho una matrice dinamica e quando cerco di cambiare un suo elemento o non ne cambia nessuno o ne cambia due(dei quali nesssuno dei due è quello aspettato).
    codice:
    #include <iostream>
    using namespace std;
    
    class Immagine{
    	int** foglio;
    	int altezza, larghezza; 
    public:
    	Immagine(int,int);
    	~Immagine();
    	bool set(int,int);
    	
    	friend ostream& operator<<(ostream&, const Immagine&);
    };	
    
    Immagine::Immagine(int la, int al)
    {	
    	altezza = al;
    	larghezza = la;
    	foglio = new int*[larghezza];
    	for(int i=0; i<larghezza; i++)
    	{	
    		foglio[i] = new int[altezza];
    		for(int j=0; j<altezza; j++)
    			foglio[i][j] = 0;
    	}
    	cout << "Costruttore\n";
    }			
    
    Immagine::~Immagine()
    {
    	for(int i=0; i<larghezza; i++)
    		delete[] foglio[i];
    	delete[] foglio;
    	cout << "Distruttore\n";
    }		
    
    bool Immagine::set(int la, int al)
    {
    	if(la>larghezza || la<0)
    		return false;
    	if(al>altezza || la<0)
    		return false;
    	foglio[la][al] = 1;
    	return true;
    }		
    	
    ostream& operator<<(ostream& os, const Immagine& im)
    {
    	for(int i=0; i<im.altezza; i++)
    	{
    		for(int j=0; j<im.larghezza; j++)
    		{
    			if(im.foglio[i][j] == 0)
    				os << im.foglio[i][j];
    			else
    				os << im.foglio[i][j];
    		}
    		os << endl;		
    	}
    	return os;
    }	
    
    int main(){
    	Immagine i(15,8);
    	i.set(2,2);
    	cout << i;
    	return 0;
    }
    Ecco l'output:
    codice:
    The Debugger has exited with status 0.
    [Session started at 2009-01-30 12:16:54 +0100.]
    Costruttore
    000000000000000
    000000000010000
    001000000000000
    000000000000000
    000000000000000
    000000000000000
    000000000000000
    000000000000000
    Distruttore
    
    The Debugger has exited with status 0.

  8. #8
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    Testato su visualstudio 2005 funziona perfettamente.. cambia la posizione riga 3 colonna 3 in 1

  9. #9
    Utente di HTML.it L'avatar di Pacio88
    Registrato dal
    Sep 2007
    Messaggi
    447
    Allora forse è un bug di Xcode.. adesso provo anchio su visual C++, grazie comunque dell'aiuto.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.