Ya la verdad que tengo curiosidad, os ha pasado a vosotros anteriormente? es esto algo nuevo de la ultima version del compilador?
La verdad que me he llevado una gran sorpresa!
La verdad que me he llevado una gran sorpresa!
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ú#include <stdio.h>
int main(){
double a;
printf("Introduce un valor: ");
scanf("%f",&a);
printf("%f",a);
system("pause");
return 0;
}
Cita de: ivancea96 en 17 Abril 2014, 14:05 PM
Tienes errores ortográficos (Ej. "deplaza" en vez de "desplaza").
Algunas funciones del .cpp no concuerdan con el .h en cosas como el const, por ejemplo.
¿Compilas en Windows o en Unix?
Luego, pones cosas como "stricmp(op1, op2)". ¿Comparas chars con stricmp?
No se qué decir. Deberías replantearte muchas cosas. Ve reparando errores de las funciones 1 a 1.
#include <iostream>
#include <cstring>
#include "cadena.h"
Cadena::Cadena(unsigned tam, char relleno): _tamano(tam){
_palabra = new char[_tamano + 1];
for(int i = 0 ; i < _tamano; i++){
_palabra[i] = relleno;
}
_palabra[_tamano] = '\0';
}
Cadena::Cadena(const Cadena& copia){
_tamano = copia._tamano;
strcpy(_palabra, copia._palabra);
}
Cadena::Cadena(char* palabra_aux){
_tamano = strlen(palabra_aux);
strcpy(_palabra, palabra_aux);
}
Cadena& Cadena::operator = (char* palabra_aux){
Cadena auxiliar(strlen(palabra_aux));
strcpy(auxiliar._palabra, palabra_aux);
return auxiliar;
}
Cadena& Cadena::operator = (const Cadena& copia){
Cadena auxiliar(copia);
return auxiliar;
}
Cadena::operator const char*() const{
return (const char*)_palabra;
}
Cadena& operator +(const Cadena& op1, const Cadena& op2){
Cadena auxiliar(op1.length() + op2.length() + 1);
strcpy(auxiliar, op1);
strcat(auxiliar, op2);
return auxiliar;
}
char Cadena::operator[] (int i) const{
return _palabra[i];
}
char Cadena::at(int i){
char caracter;
if(i < _tamano && i > 0){
caracter = _palabra[i];
}
else{
throw std::out_of_range("Fuera de Rango");
}
return caracter;
}
bool operator ==(const Cadena& op1, const Cadena& op2){
bool resultado = true;
resultado = !(stricmp(op1, op2));
return resultado;
}
bool operator !=(const Cadena& op1, const Cadena& op2) const{
return !(operator == (op1, op2));
}
bool operator > (const Cadena& op1, const Cadena& op2){
bool resultado;
int cantidad = 0;
for(int i = 0; cantidad == 0 && !(op1[i] == '\0' && op2[i] == '\0'); i++){
cantidad = stricmp(op1[i], op2[i]);
}
if(cantidad > 0){
resultado = true;
}
else{
resultado = false;
}
return resultado;
}
bool operator < (const Cadena& op1, const Cadena& op2){
bool resultado;
int cantidad = 0;
for(int i = 0; cantidad == 0 && !(op1[i] == '\0' && op2[i] == '\0'); i++){
cantidad = stricmp(op1[i], op2[i]);
}
if(cantidad < 0){
resultado = true;
}
else{
resultado = false;
}
return resultado;
}
bool operator <= (const Cadena& op1, const Cadena& op2){
bool resultado;
int cantidad = 0;
for(int i = 0; cantidad == 0 && !(op1[i] == '\0' && op2[i] == '\0'); i++){
cantidad = stricmp(op1[i], op2[i]);
}
if(cantidad <= 0){
resultado = true;
}
else{
resultado = false;
}
return resultado;
}
bool operator >= (const Cadena& op1, const Cadena& op2){
bool resultado;
int cantidad = 0;
for(int i = 0; cantidad == 0 && !(op1[i] == '\0' && op2[i] == '\0'); i++){
cantidad = stricmp(op1[i], op2[i]);
}
if(cantidad >= 0){
resultado = true;
}
else{
resultado = false;
}
return resultado;
}
int Cadena::length() const{
return _tamano;
}
Cadena Cadena::substr (unsigned inicio, unsigned desplaza){
int limite = inicio + desplaza;
char palabra_auxiliar[desplaza + 1];
Cadena auxiliar(deplaza+1);
if(inicio + desplaza > _tamano){
throw std::out_of_range("Fuera de Rango");
}
else{
for(int i = 0 ; i < desplaza ; i++){
palabra_auxiliar[i] = _palabra[inicio + i];
}
}
auxiliar = palabra_auxiliar;
return auxiliar;
}
Cadena::~Cadena(){
delete[] _palabra;
}
#ifndef CADENA_H_
#define CADENA_H_
class Cadena{
public:
Cadena(unsigned tam = 1, char relleno = ' ');
Cadena(const Cadena& copia);
Cadena(char* palabra_aux);
Cadena(const char*);
Cadena& operator = (char* palabra_aux);
Cadena& operator = (const Cadena& copia);
char operator[] (int i);
operator const char*() const;
int length() const;
char at(int i);
Cadena substr (unsigned inicio, unsigned desplaza);
~Cadena();
private:
int _tamano;
char* _palabra;
};
Cadena& operator +(const Cadena& op1, const Cadena& op2);
bool operator ==(const Cadena& op1, const Cadena& op2);
bool operator !=(const Cadena& op1, const Cadena& op2);
bool operator > (const Cadena& op1, const Cadena& op2);
bool operator >= (const Cadena& op1, const Cadena& op2);
bool operator < (const Cadena& op1, const Cadena& op2);
bool operator <= (const Cadena& op1, const Cadena& op2);
#endif
//El .h de la clase resumido:
class Cadena{
public:
//Constructores:
Cadena(unsigned tam = 1, char relleno = ' ');
Cadena(const Cadena& copia);
Cadena(char* palabra_aux);
Cadena(const char*);
//Aqui cabecera del metodo del operador de conversion
operator const char*() const;
~Cadena();
private:
int _tamano;
char* _palabra;
};
//Pongo fuera aposta este metodo para que realice la operacion de conversion.
Cadena& operator +(const Cadena& op1, const Cadena& op2);
//El .cpp de la parte que nos interesa:
Cadena& operator +(const Cadena& op1, const Cadena& op2){
Cadena auxiliar(op1.length() + op2.length() + 1); //Lo que hago es crear un //nuevo objeto y reservar espacio para el char* que voy a meterle.
strcpy(auxiliar, op1); // <-- Aqui es donde peta!
strcat(auxiliar, op2);
return auxiliar;
}
Cadena::operator const char*() const{
return _palabra;
}
Cita de: ~ Yoya ~ en 26 Enero 2014, 16:08 PM
Si dices eso, donde debo poner ese código?? según tu comentario antes del switch, porque no vas a declarar un atributo estático dentro de un método. Me dices que lo coloque antes del switch, posteo el codigo de como debe quedar segun usted y luego me dices que el codigo es mio y que es una bestia jejeje
Yo hasta ahora he tratado simular tu código porque nomas haz puesto código que no funcionan, malas indicaciones, o simplemente que funcionan pero estan mal hecho, y encima pones que mis codigo son bestiales y lo único que he hecho es seguir sus indicaciones para tratar de dar con el código que suyo que no funciona y que hasta ahora es que lo agrega al topic, para poder ver el problema y mirar que pasa... Pero el codigo malo que tienes me dices con son míos. Y en este punto es que haz puesto el código que deberías haber puesto al principio del hilo.
Men si eres tan buen programador, entonce hubieras arreglado y encontrado la razón porque pasa lo que pasa, ya que simplemente el error es básico.
Saludos y debuguea.
Cita de: ~ Yoya ~ en 25 Enero 2014, 00:04 AM
Me hubiera alegrado que en vez de decir que entiendes mi código, hubieras dicho que entiendes y comprendes la definiciones que deje...
Brother, tu código no funciona con "cerrojo" del tipo int o de cualquier tipo. Tu codigo debe imprimir 0, ya que primero se incrementa a 10,000 y luego descrementa a 0, en cambio retorna 10,000.
Otra cosa, las definiciones no es para que entiendas mi código, el código que puse es lo de menos pero te haz centrado hay. Las definiciones que deje es para que entiendas que si varios threads están modificando el mismo recurso a la vez, te causara conflictos.
Por la llave del case 1 después del for, hace que se ejecute el for 1 vez, ya que va a procesar el break porque este esta dentro de la llaves.
CitarAqui esta el famoso codigo con cerrojo del tipo objeto,mira que no funciona:package main;
public class Hilo extends Thread {
private int tipoHilo;
private static Integer n = new Integer(0);
private int nVueltas;
public Hilo(int nVueltas, int tipoHilo)
{this.nVueltas=nVueltas; this.tipoHilo=tipoHilo;}
public void run()
{
Object cerrojo = new Object();
switch(tipoHilo){
case 0:
for(int i=0; i<nVueltas; i++)
synchronized(cerrojo){ n=n+1;};
break;
case 1:
for(int i=0; i<nVueltas; i++)
synchronized(cerrojo){n=n-1;};
break;
}
}
public static void main(String[] args)
throws Exception
{
Hilo p = new Hilo(10000, 0);
Hilo q = new Hilo(10000, 1);
p.start();
q.start();
p.join();
q.join();
System.out.println(n);
}
}
import java.util.concurrent.*;
public class Hilo extends Thread {
private int tipoHilo;
private static Integer n = new Integer(0);
private int nVueltas;
private static Object cerrojo = new Object();
public Hilo(int nVueltas, int tipoHilo)
{
this.nVueltas=nVueltas;
this.tipoHilo=tipoHilo;
}
public void run()
{
switch(tipoHilo){
case 0:
for(int i=0; i<nVueltas; i++)
synchronized(cerrojo){ n=n+1;};
break;
case 1:
for(int i=0; i<nVueltas; i++)
synchronized(cerrojo){n=n-1;};
break;
}
}
public static void main(String[] args)throws Exception
{
Hilo p = new Hilo(10000, 0);
Hilo q = new Hilo(10000, 1);
p.start();
q.start();
p.join();
q.join();
System.out.println(n);
}
}
switch(tipoHilo){
case 0:
for(int i=0; i<nVueltas; i++)
synchronized(n){ n=n+1;};
break;
case 1:
for(int i=0; i<nVueltas; i++){
synchronized(n){n=n-1;};
break;
}
switch(tipoHilo){
case 0:
for(int i=0; i<nVueltas; i++)
synchronized(cerrojo){ n=n+1;}; // <--- Cambio de cerrojo
break;
case 1:
for(int i=0; i<nVueltas; i++){
synchronized(cerrojo){n=n-1;}; // <--- Cambio de cerrojo
break;
}