PROBLEMA IMMAGINI .pgm E OPERATORI SOVRACARICATI IN C++

di il
5 risposte

PROBLEMA IMMAGINI .pgm E OPERATORI SOVRACARICATI IN C++

Salve ragazzi! avrei una domanda riguardante un codice c++ che utilizza operatori sovracaricati.
Praticamente il programma fa varie operazioni su un file immagine .pgm . Tra le varie operazioni quali apertura da file, copia su file, scrittura su schermo ecc, non funzionano gli operatori - + * .
l'operatore meno dovrebbe restituire un'immagine che è la differenza di due immagini. Quelli + e * devono sommare o moltiplicare uno numero ad ogni cella del vettore data dell'immagine.
Analizzandolo mi è sembrato di capire che il problema sia nel return dell'immagine.
Vi allego il codice :

.h
#ifndef MYIMAGE_H
#define MYIMAGE_H
#include <string>
#include <iostream>
using namespace std;

class myimage 
{
string type;
int	row, col, maxval;
int * data;

public:
	myimage();
	myimage(int r, int c);
	myimage(string nomefile);
	~myimage();
	bool open(string nomefile);
	bool save(string nomefile);
friend std::ostream& operator<<(std::ostream& os, const myimage &o);
const myimage operator-(const myimage &o)const;
const myimage operator+(const int x)const;
const myimage operator*(const int x)const;
int& operator() (int i, int j);
myimage& operator=(const myimage &o);
};
#endif
.cpp
#include"MYIMAGE.h"
#include <string>
#include <iostream>
#include <fstream>
using namespace std;

myimage::myimage() {data=0;}

myimage::myimage(int r, int c) {
    row=r;
    col=c;
	data=new int [row*col];
}

myimage::myimage(string nomefile=" ") {
    open(nomefile);
}

myimage::~myimage() {
    delete [] data;
}

bool myimage::open(string nomefile) {
	ifstream fin(nomefile);
	int i=0;
	if (!fin)
	{ 
		cout<<"errore apertura file di input"<<endl;
		return false;
	}
	else 
	{
     
	 fin>>type>>row>>col>>maxval;
	 data=new int [row*col];
	 while (fin>>data[i] && i<(row*col)) {i++;}
     
	 return true;
	}
fin.close();
}

bool myimage::save(string nomefile) {
	ofstream fout(nomefile);
	if (!fout)
	{ 
		cout<<"errore apertura file di output"<<endl;
		return false;
	}
	else 
	{
	 int count=0;
	 fout<<type<<endl<<row<<" "<<col<<endl<<maxval<<endl;
	 for(int i=0;i<row;i++)
	 {
	  for(int j=0;j<col;j++)
	  {
	  	 fout<<data[count]<<" ";
		 count++;
	  }
	  fout<<endl;
	 }
	
	 return true;
	}
 fout.close();
}


ostream& operator<<(ostream& os, const myimage &o)
{

	int count=0;
	for(int i=0;i<o.row;i++)
	 {
	  for(int j=0;j<o.col;j++)
	  {
		  os<<o.data[count]<<" ";
	  count++;
	  }
	  os<<endl;
	}
return os;
}


const myimage myimage::operator-(const myimage &o) const
{
	
	myimage tmp(row,col);
    
	for(int i=0; i<row*col;i++)
	{
		tmp.data[i]=data[i]-o.data[i];
	
	}
	
	return tmp;

}



const myimage myimage::operator+(const int x) const
{

	myimage tmp(row,col);
    
	for(int i=0; i<row*col;i++)
	{
		tmp.data[i]=this->data[i]+x;
	}
return tmp;
}


const myimage myimage::operator*(const int x) const
{

	myimage tmp(row,col);
    for(int i=0; i<row*col;i++)
	{
		tmp.data[i]=data[i]*x;
	}
	cout<<"oooo";
	return tmp;

}


int& myimage::operator()(int i, int j)
{
	return data[i*col+j];
}

myimage& myimage::operator=(const myimage &o)
{
	type=o.type;
	
	row=o.row;
	col=o.col;
	
	maxval=o.maxval;
	delete [] data;
	data= new int[o.row*o.col];
		
	for(int i=0; i<row*col;i++)
	{
		data[i]=o.data[i];
	}
return *this;
}
.cpp //(test)
#include <iostream>
#include <fstream>
#include "MYIMAGE.h"
#include <string>
void test3();
void test5();
int main()
{
test3();
test5();
}

void test3() 
{ 
 cout<<"Test overloading operator -"<<endl; 
 myimage a("im1.pgm"); 
 myimage b("im2.pgm"); 
 myimage res= a-b; 
 res.save("diff.pgm"); 
} 

void test5() 
{ 
 cout<<"Test overloading operator * e operator +"<<endl; 
 myimage a("im1.pgm"); 
 int minout=200; 
 int maxout=250; 
 myimage res=a*((maxout-minout)/255.0)+minout; 
 res.save("stretch.pgm"); 
} 

5 Risposte

  • Re: PROBLEMA IMMAGINI .pgm E OPERATORI SOVRACARICATI IN C++

    Perche ritorni una copia nel overload? Dovresti far tornare un riferimento
    myimage & operator-(const myimage &o)const;
  • Re: PROBLEMA IMMAGINI .pgm E OPERATORI SOVRACARICATI IN C++

    Ho tornato un reference a myimage, ma una volta che faccio partire il debug mi da un errore:
    -R6010 abort() has been called.
    Cosa vuol dire?
  • Re: PROBLEMA IMMAGINI .pgm E OPERATORI SOVRACARICATI IN C++

    http://stackoverflow.com/questions/19401167/error-r6010-why-is-it-called
  • Re: PROBLEMA IMMAGINI .pgm E OPERATORI SOVRACARICATI IN C++

    Ho copiato i file .pgm chiamati dalla funzione di test (im1.pgm e im2.pgm) nella cartella debug dove è presente l'eseguibile, nonostante ciò il problema si ripresenta ugualmente. Dove sto sbagliando?
  • Re: PROBLEMA IMMAGINI .pgm E OPERATORI SOVRACARICATI IN C++

    Proseguendo con l'analisi del problema ho notato una cosa.
    Nella funzione dell'overloading dell'operator - ho invocato il costruttore per copia.
    Il codice è diventato così:
    myimage::myimage(const myimage &o) {
    	type=o.type;
    	row=o.row;
    	col=o.col;
    	maxval=o.maxval;
    	data=new int[row*col];
    	for(int i=0;i<row*col;i++)
    	{
    		data[i]=o.data[i];
    	}
    }
    
    const myimage myimage::operator-(const myimage &o) const {	
    	myimage tmp(o);
    	
    	for(int i=0;i<row*col;i++)
    	{
    		tmp.data[i]=data[i]-o.data[i];
    	    cout<<"sf"<<endl;
    	}
    	cout<<"sf"<<endl;
    	return tmp;
        
    }
    
    void test3() 
    { 
     cout<<"Test overloading operator -"<<endl; 
     myimage a("im1.pgm"); 
     myimage b("im2.pgm"); 
     myimage res= a-b; 
     res.save("diff.pgm"); 
    }
    Perchè cosi facendo funziona? Mi crea correttamente il file diff.pgm senza che l'eseguibile si blocchi.
    Perchè utilizzando il costruttore per copia funziona mentre usando il costruttore di row e col(con inizializzazione di data) non funziona?
Devi accedere o registrarti per scrivere nel forum
5 risposte