Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - eferion

#391
Los templates no pueden tener código en el cpp. Tiene que estar todo en la cabecera.

La razón es sencilla. El compilador, al encontrarse con un template no lo compila, lo guarda y cada vez que encuentra un uso diferente del template crea y compila una clase específica para ese uso.
#392
Cita de: MessageBoxA en  9 Junio 2014, 23:40 PM
yo le doy a utilizar el depurador de Orwell devcpp pero ni no me dice nada de errores :$, hare la sugerencia que me diste y luego si tengo otro problema lo dire.

El depurador no te va a decir "aquí hay un error". El depurador te permite seguir la traza de la ejecución del programa mientras te permite evaluar las variables de la aplicación. Con esta información eres tú el que debería saber qué valores espera en las variables y si coinciden con lo que hay realmente... si no coincide hay algo raro y toca comprobar el código de ese punto para atrás para dar con el fallo.
#393

int m=0,k=0,z=1,y=0,x=0;

//...

datos datos_estruct[y]


si te das cuenta, "y" tiene valor 0, todo lo que suceda después está mal.

Si utilizas nombres que aporten información acerca de su uso habrías visto este error sin problemas.

Además, la forma correcta de almacenar los datos en el array es:


printf("Ingrese el Primer nombre de la persona:\n");
scanf("%s",&datos_estruct[y].primer_nombre);
printf("\nIngrese el segundo nombre de la persona:\n");
scanf("%s",&datos_estruct[y].segundo_nombre);
printf("\nIngrese el apellido de la persona:\n");
scanf("%s",&datos_estruct[y].apellido_persona);


PD.: aprender a usar el depurador no está de más, es un gran aliado y merece la pena perder algo de tiempo en comprender su funcionamiento.
#394
Programación C/C++ / Re: bug en mi codigo
9 Junio 2014, 23:11 PM
* registroS1 no es necesario que lo crees con memoria dinámica... o al menos, si lo usas con reserva de memoria, que sea para reservar un buffer lo más pequeño posible:

registroS1 = malloc( strlen(Longitud) + strlen(direccion) + strlen(codigo_datos) + 1 );

* digito es un char... no necesitas crear un buffer para ello:

char digito;

// ...

digito = registroS1[ k ];

byte[ j - 1 ] = digito;


* Dado que byte siempre tiene longitud 3 no tiene tampoco mucho sentido que uses memoria dinámica. Si quieres resetear la memoria basta con que uses, por ejemplo, memset:

char byte[ 3 ];
memset( byte, 0, 3 );


* Dado el bucle "for"... j, perfectamente podría ir de 0 a 2, así lo puedes usar de índice para escribir en "byte"

* Estás seguro que la suma de complemento siempre es inferior a 0xFF??? si no es así tienes un desbordamiento de buffer al almacenar el valor en "checksum".
#395
Código (cpp) [Seleccionar]

c.suma(rr1,rr2);
c.mostrar();


Código (cpp) [Seleccionar]

CRacional CRacional::suma(CRacional rr1,CRacional rr2){
          CRacional c;
          mismodenominador(rr1,rr2);
          c.a=rr1.a+rr2.a;
          c.b=rr1.b;
          c.simplificar();
          cout<<"muesta desde suma: "<<c.a<<"/"<<c.b<<endl; //sale bn
          return c;
      }


en la operación de suma creas una nueva instancia de CRacional y la devuelves... pero no modificas la instancia actual, por lo que en el código de arriba, "c", no cambia el valor de sus variables.

Una forma de solucionar esto sería retocar la operación tal que:

Código (cpp) [Seleccionar]

CRacional CRacional::suma(CRacional rr1,CRacional rr2){
          mismodenominador(rr1,rr2);
          a=rr1.a+rr2.a;
          b=rr1.b;
          simplificar();
          cout<<"muesta desde suma: "<<a<<"/"<<b<<endl; //sale bn
          return *this;
      }

#396
No se de dónde has sacado ese código pero ya te digo que no va ni a compilar.

fopen=("/home/carpeta/x.txt",r);

* fopen es una función, no una variable.
* r debería ser una cadena de caracteres para indicar la forma de abrir el fichero.

Por otro lado, para saber si el fichero está vacío puedes mover el cursor al final y consultar su posición en ese punto... si la posición final es 0, el fichero está vacío:


FILE *rv;
rv = fopen( "/home/carpeta/x.txt", "r" );
fseek( rv, 0, SEEK_END );
if (ftell( rv ) == 0 )
{
  // fichero vacio
}
#397
así a bote pronto... ninguno... qué te sucede exactamente??

espero que no pretendas que nos copiemos tu código, lo depuremos, corrijamos los errores y te demos un informe sobre los fallos que tienes y cómo corregirlos???
#398
Código (cpp) [Seleccionar]

if(primero5!=NULL)
{
  while(nodo!=NULL)
  {
    if(nodo->valor.edad_disenho==edad && nodo->valor.tipo_protesis==tipo)
    {
      if(nodo==primero5)
        primero5=primero5->siguiente;
      else
        anterior->siguiente=nodo->siguiente;
      delete(nodo);
    }
   
    anterior=nodo;
    nodo=nodo->siguiente;
  }
}


Después de "delete(nodo)" el código continúa su ejecución y se encuentra con:

* "anterior=nodo" ya vamos mal asignando direcciones que están borradas
* "nodo=nodo->siguiente" Esto es aún peor...

Te falta un break después de "delete nodo" para salir del algoritmo de búsqueda y evitar que el código haga "cosas raras"

#399
Es mejor si cada archivo de código lo colocas en una etiqueta code diferente... si además a cada etiqueta de code le añades el lenguaje correspondiente, p.ej: code=cpp para C++, quedará todo mucho más legible.

No entiendo por qué usas tantas clases para las imágenes. A ver, tu partes de dos imagenes que tienes que fusionar ( imagen1 e imagen2 )... al fusionarlas vas a crear una tercera imagen ( imagenFusionada ) y esta ha de admitir zoom ... imagenFinal.

Tu estás usando 7 imágenes diferentes... te sobran 3.

Los pasos recomendados son los que te he comentado:

* Almacenas las dos imágenes originales en imagen1 e imagen2. (los nombres son orientativos).

* Fusionas las imagenes: imagenFusionada.

* Aplicas el zoom a la imagen fusionada: imagenFinal.

De esta forma:

* Si solo cambia el zoom, únicamente tienes que recalcular imagenFinal.

* Si cambias una de las dos imágenes originales tienes que calcular la fusionada y la imagen final.

La gracia de aplicar el zoom a la imagen fusionada y no al revés ( a diferencia de como tú lo haces ) es que cuando se amplía o se reduce el zoom, hay pixeles que se recalculan y pueden acabar teniendo un color que no se parezca en nada al de croma, por lo que la fusión posterior no va a funcionar.

Además al fusionar primero y hacer zoom después evitas tener que redimensionar dos imágenes... solo tienes que redimensionar una.

Por lo demás, saber si el pixel actual tiene color croma ( si no has redimensionado ) es tan sencillo como comparar colores:

Código (cpp) [Seleccionar]

QColor croma( 30, 30, 255 );

// ...

for(int i=0; i<imagen1.width(); i++)
{
  for(int j=0; j<imagen1.height(); j++)
  {
    color = imagen1.pixel( i ,j );
    if ( color == croma )
    {
    }
    else
    {
    }
  }
}
#400
Código (cpp) [Seleccionar]

typedef struct habitacion{
      string nombre;
};


La palabra reservada "typedef" sobra porque en esa línea, sencillamente no hace nada.

"typedef" sirve para definir alias dentro del código con el fin de conseguir un código más legible. En tu caso no estás definiendo ningún alias, por lo que te puedes ahorrar esa palabra reservada.

Código (cpp) [Seleccionar]

vector<  vector<habitacion>  > planta;
unsigned MAXPLANTA,MAXHABITACIONES;


la clase "vector" dispone de un método llamado "size()" que devuelve el número de elementos que contiene dicho vector. Si en el constructor de la clase "Hotel" creas tantos elementos en "planta" como plantas tenga el hotel y tantas habitaciones en cada planta como corresponda, te puedes ahorrar el uso de las variables "MAXPLANTA" y "MAXHABITACIONES":

Código (cpp) [Seleccionar]

Hotel::Hotel(unsigned n_plantas, unsigned n_habs)
{
  for ( int i = 0; i < n_plantas; i++ )
  {
    // "Creamos" una planta con "n_habs" habitaciones
    planta.push_back( std::vector< habitacion >( n_habs ) );
  }
}


Entre otras cosas, la siguiente línea que tienes en el constructor simplemente no va a funcionar porque no estás definiendo un array en memoria, sino que estás creando y configurando una clase de tipo "vector":

Código (cpp) [Seleccionar]

Hotel::Hotel(unsigned n_plantas, unsigned n_habs){
  // ...
  planta[MAXHABITACIONES][MAXPLANTA];
}


Con esto, el código del método "Alojar" se puede simplificar un poco... eso sin contar que el código que tienes actualmente tiene algún error:

Código (cpp) [Seleccionar]

void Hotel::Alojar(const std::string& nombre, unsigned& plant, unsigned& n_hab, bool& ok)
{
  ok=false;

  for ( plant = 0; plant < planta.size( ) && !ok; plant++ )
  {
    for ( n_hab = 0; n_hab < planta[ plant ].size( ) && !ok; n_hab++ )
    {
      if ( planta[ plant ][ n_hab ].nombre.empty( ) )
      {
        planta[ plant][ n_hab ].nombre = nombre;
        ok = true;
      }
    }
  }

  // Si no hay habitaciones libres, indicamos la posicion de una habitacion no valida (por si acaso)
  if ( !ok )
  {
    plant = -1;
    n_hab = -1;
  }
}


La función "Desalojar" tiene los mismos errores que "Alojar", si aplicas lo aprendido en "Alojar" verás que no es demasiado difícil corregir ese código.