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

#1081
... No se trata de comparar cadenas... sino de localizar un caracter en un vector
#1082
Cita de: SARGE553413 en 24 Julio 2013, 14:25 PM
Eso mismo me planteba yo ( la vision de la clase en memoria) por eso preguntaba si si habia alguna manera de llamar al constructor de la clase B durante el casteo para construirla bien pero veo que no,ok.

Efectivamente no se puede. Los constructores son llamados únicamente al crear la clase... una vez que ya está creada los constructores no son invocados de nuevo. Además, tu piensa que las subclases, como norma general, necesitan más memoria que las superclases... y la memoria ha de ser secuencial. Una vez ya has hecho una reserva de memoria no puedes garantizar que una nueva reserva se realice inmediatamente después... luego no podrías crear correctamente la nueva clase.

Cita de: SARGE553413 en 24 Julio 2013, 14:25 PM
Sin embargo ahora mi pregunta es que pasa si la superclase es abstracta. Supongamos que tengo una superclase A y dos que heredan  C y D. Si defino un metodo que devuelve un puntero a A, si que puedo castear una superclase a una de sus clases derivadas sin problema. Esto es porq dentro del metodo he construido el objeto como una de laa clases derivadas ( necesariamente porque  esabstracta) ¿correcto?

A ver, voy a intentar explicarlo con algo físico... para que sea más gráfico.

Tu imagínate que tienes la superclase Animal... y de ella heredan las clases Gato y Perro.

Si tu ( imagínate que eres una especie de dios ), creas un Gato... a ese gato lo puedes identificar como gato o como animal... pero nunca llegará a ser un perro ( tus poderes no dan para tanto ).

Si en vez de un gato creas un perro pasará exactamente lo mismo, el perro podrá ser tratado como un perro o como un animal, pero nunca como un gato.

El polimorfismo lo que te permite es tener punteros genéricos ( de tipo superclase ), que en realidad representen a entidades heredadas... pero este mecanismo no permite experimentos de mutación genética que permitan convertir un perro en un gato.

Si tu intentas llevar a cabo esta aberración de la naturaleza te pasará lo siguiente:

Código (cpp) [Seleccionar]

class Animal
{
};

class Perro: public Animal
{
};

class Gato : public Animal
{
};

void main( )
{
  Animal* gato = new Gato( );
  Animal* perro = new Perro( );

  Gato* gato1 = dynamic_cast< Gato* >( gato ); // ok
  Gato* gato2 = static_cast< Gato* >( gato ); // ok pero menos seguro

  Perro* perro1 = dynamic_cast< Perro* >( perro ); // ok
  Perro* perro2 = static_cast< Perro* >( perro ); // ok pero menos seguro

  Gato* aberracion1 = dynamic_cast< Gato* >( perro ); // devuelve 0.
  Gato* aberracion2 = static_cast< Gato* >( perro ); // funciona pero la aplicación va a dar resultados incorrectos o casques.

  Perro* aberracion3 = dynamic_cast< Perro* >( gato); // devuelve 0.
  Perro* aberracion4 = static_cast< Perro* >( gato); // te funciona pero la aplicación va a dar resultados incorrectos o casques.
}
#1083
Los iteradores los podrías entender como unos punteros que recorren la lista, arbol, matriz, etc.

Si la lista fuese de elementos estáticos, podrías acceder a sus miembros de la siguiente forma:

Código (cpp) [Seleccionar]

class Clase2{
    list<Clase1> Lista;
public:
    Clase2();

    void funcion2();
};

void Clase2::funcion2(){
    list<Clase1>::iterator it = Lista.begin();
    for (; it != Lista.end(); it++)
    {
        it->funcion1();   // metodo uno
        (*it).funcion1( ); // metodo dos
    }
}


Como tú estás manejando una lista de punteros, tienes que añadir un nivel más de indirección para poder acceder a los miembros del elemento apuntado... que es la solución que te ha dado Eternal Idol.

También en este caso puedes hacer:

Código (cpp) [Seleccionar]

Clase* clase = *it;
clase->funcion1( );
#1084
strcmp lo que hace es comparar dos cadenas de caracteres y devolver un resultado que te indica si son iguales o no.

Tu, obviamente, no quieres eso.

Tu estás comparando char contra char... este chequeo es tan sencillo como:


for(p=0 ; p<61 ; p++)
{
comodin=tiempoCaracteres[p];
if( comodin == recvBuff[ 0 ] )
{
numero = p;
printf("el numero del caracter es: %d", numero);
}
}


Obviamente esto es asumiendo que el caracter a localizar sea el primero de los recibidos por el servidor.
#1085
Perdona, no me dí cuenta de que eras tu... es lo que tiene estar a mil cosas a la vez :)
#1086
Te refieres a ...

Código (cpp) [Seleccionar]
void something( const std::string& text){
    cout << text;
}


Si es el caso... te va a mostrar la cadena de texto, como es de esperar.
#1087
ASM / Re: Comandos puertos I/O
24 Julio 2013, 09:14 AM
Lo que estás mirando es el datasheet del chip... no el de la tarjeta.

En la tarjeta que tienes el chip al que se refiere el datasheet estará rodeado por otros componentes electrónicos que se encargan de configurar y dar vida al dispositivo.

El datasheet de un chip no entiende de interrupciones y puertos por la sencilla razón de que un chip, por si solo, nunca hace nada util... necesita una configuración externa de hardware para cumplir la tarea de una forma determinada... y es ese hardware externo el que determina si tu tarjeta responde a una interrupción determinada o si te va a devolver datos en el puerto X.

Los diagramas que ves se corresponden con la configuración eléctrica de las señales ( los tiempos y frecuencias ) que se dan ( o se han de dar ) para un correcto funcionamiento del chip.

Por lo que he visto ese chip es para una tarjeta ethernet... Quizás debieras mirar información sobre comunicación con sockets vía ensamblador... supongo que las tarjetas ethernet tendrán todas una interfaz común... si no la tienen entonces es bastante posible que sea el sistema operativo el que te proporcione esa interfaz común y se encargue él de comunicarse con la tarjeta.
#1088
Cita de: amchacon en 24 Julio 2013, 00:26 AM
Bueno a decir verdad, tampoco miraría SFML. Antes de nada aprendería a manejar el lenguaje, después ya aprenderás a manejar librerías ;)

Comparto este punto de vista
#1089
Cita de: zonahurbana en 24 Julio 2013, 06:46 AM
Cuando se invoca la función y se le pasa como argumento el nombre de un vector de caracteres, realmente se le está pasando la dirección de memoria del primer elemento y por ello sólo muestra el primero, ¿verdad?

Si, es cierto, pero la función que recibe un vector de caracteres no se limita a imprimir ese carácter ... la función que recibe un vector de caracteres va a procesar todos los caracteres del vector hasta que encuentre un carácter nulo.

Cita de: zonahurbana en 24 Julio 2013, 06:46 AM
Esto es un puntero a otro puntero a char.
Cuando se invoque la función y se le pase como argumento la dirección del primer elemento de un vector de caracteres, dicha dirección de memoria es almacenada en text (variable puntero a puntero). Si escribo *text es como mostrar el valor apuntado por text, que viene a ser un puntero a char. ¿Entonces no debería mostrar la dirección de memoria del vector?

A ver, cout es una clase de c++. Esta clase tiene varias sobrecargas del operador de inserción ( << ), una para cada tipo de dato soportado.

Cuando a cout se le pasa mediante el operador de inserción un array de caracteres hace exactamente lo que te he comentado, imprimir todos los caracteres que encuentre hasta llegar al primer nulo.

Tu no tienes que mirar las transformaciones que hagas de un dato a la hora de llamar a cout... limítate a ver qué tipo le estás pasando a la clase.

Es decir:

Código (cpp) [Seleccionar]
void something(char *text){
    cout << &(*(&(*(&(*text)))));
    cout << text;
}


En ambos casos te va a mostrar una cadena de texto. A la función que recibe el dato únicamente sabe qué tipo le estás pasando, no entiende de las transformaciones previas que le hayas hecho.

#1090
ponle una pausa antes de terminar el programa.

Ah si, procura no usar devcpp... es un IDE obsoleto... mejor pásate a code::blocks... es quizás un pelín más complejo de configurar pero es mucho más potente y tiene mantenimiento y corrección de errores.

De hecho creo recordar que code::blocks te añade una pausa automáticamente a las aplicaciones de consola cuando las ejecutas desde el IDE sin que tú tengas que hacer nada.