Ver Mensaje Individual
  #2 (permalink)  
Antiguo 20/01/2013, 19:41
rucal
 
Fecha de Ingreso: enero-2013
Mensajes: 8
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: violacion de segmento complicado

procesamiento.tpp

Código:
#include "procesamiento.h"
#include <iostream>

template <class T>
void Umbralizar(const Imagen<T> &origen, Imagen<T> &destino, const T &t1, const T &t2/*, T* &v*/){
  Imagen<T> aux(origen.num_filas(),origen.num_columnas());
  typename Imagen<T>::const_iterator_fila it1_f;
  typename Imagen<T>::const_iterator_fila::const_iterator_columna it1_c;
  typename Imagen<T>::iterator_fila it2_f;
  typename Imagen<T>::iterator_fila::iterator_columna it2_c;
  for(it1_f=origen.begin(),it2_f=aux.begin();it1_f!=origen.end();++it1_f,++it2_f){
    for(it1_c=it1_f.begin(),it2_c=it2_f.begin();it1_c!=it1_f.end();++it1_c,++it2_c){
      if(*it1_c>t1 && *it1_c<t2){
	*it2_c=*it1_c;
      }
      else
	*it2_c=255;
    }
  }
  destino=aux;
    
}
main
Código:
#include <iostream>
#include <cstring>
#include <cstdlib>

#include <imagenES.h>
#include "imagen.h"
#include "procesamiento.h"

using namespace std;

int main (int argc, char *argv[]){
 
    char *origen, *destino; // nombres de los ficheros
 
 
 
    unsigned char *image;
    int nf, nc;//, npixeles; // Num. de filas y columnas de las imagenes
 
   // Comprobar validez de la llamada
    if (argc != 3){
      cerr << "Error: Numero incorrecto de parametros.\n";
      cerr << "Uso: negativo <FichImagenOriginal> <FichImagenDestino>\n";
      exit (1);
    }
 
    origen  = argv[1];
    destino = argv[2];

    
   cout << endl;
   cout << "Fichero origen: " << origen << endl;
   cout << "Fichero resultado: " << destino << endl;
 
   // Leer la imagen del fichero de entrada
   
    image = LeerImagenPGM (origen, nf, nc);
    if (!image){
      cerr << "Error: No pudo leerse la imagen." << endl;
      cerr << "Terminando la ejecucion del programa." << endl;
      exit (1);
    }

    Imagen<unsigned char> img(nf,nc,image);
    Imagen<unsigned char> dest(nf,nc,image);
    
   // Mostrar los parametros calculados por LeerImagenPGM()
   cout << endl;
   cout << "Dimensiones de " << origen << ":" << endl;
   cout << "   Imagen   = " << nf  << " filas x " << nc << " columnas " << endl;
   
   Umbralizar(img,dest,(unsigned char)100,(unsigned char)200);

   if (EscribirImagenPGM (destino, image, nf, nc))
     cout  << "La imagen se guardo en " << destino << endl;
   else{
     cerr << "Error: No pudo guardarse la imagen." << endl;
     cerr << "Terminando la ejecucion del programa." << endl;
     exit (2);
   }
 
//   // Liberar la imagen
   delete [] image;
    
    return (0);
}
el compilador no da ningun error. el problema es una violacion de segmento en la funcion umbralizar. cuando entra en el operator= al intentar copiar aux en destino. probando mucho he averiguado que el problema esta al intentar borrar pixeles[0] en la funcion Borrar que esta usando el operator=.

tambien he comprobado que el error no esta en borrar pixeles[0]. tambien me da problemas al intentar acceder a pixeles[0] en el operator= justo antes de intentar utilizar la funcion borrar. tambien he comprobado que cuando se accede a la funcion borrar desde el destructor no hay problemas. asi que el problema esta en el operator=.

yo el codigo lo veo bien, pero esta claro que hay algo que se me escapa. no he tenido mas remedio que pedir ayuda aqui porque llevo dias haciendo pruebas y no veo donde esta el error.

espero que me podais ayudar, gracias!!