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ú

Temas - xoker

#1
Programación C/C++ / Double en C
19 Julio 2014, 11:16 AM
Buenas a todos, vereis despues de muchisimo tiempo me he encontrado con un problema con los double en C, es con el siguiente codigo:

#include <stdio.h>

int main(){

double a;

printf("Introduce un valor: ");
scanf("%f",&a);

printf("%f",a);

system("pause");
return 0;
}


Como podeis ver, no puede ser un codigo mas tonto, leo un double por teclado y lo imprimo por pantalla. Pues bien, introduzca el numero que introduzca, siempre me sale 0 por pantalla, tras pasarle el depurador, sucede que en el momento de hacer el scanf lo que lee no es el numero que yo meto, sino que introduce en la variable un numero en notacion cientifica bajisimo, muy proximo a cero, por eso por pantalla aparece el cero. Tambien he probado a quitar el scanf y darle yo un valor a mano a la variable y se imprime correctamente, por lo que confirmo que la culpa es del scanf.

Para solucionar este error, lo que he hecho a la hora de leer por teclado es sustituir scanf("%f", &a); por scanf("%lf",&a); es decir, en vez de usar %f uso %lf y ya funciona correctamente.

¿Es todo esto normal? Yo juraria que en mis mas de dos años usando C, nunca he tenido este problema. Realmente no me ha ocurrido a mi originalmente, le ocurrio a un amigo y cuando fui a probar en mi PC tambien ocurria lo mismo, ambos tenemos el compilador MingGW GCC 4.8.1.

Por ultimo, he mirado en internet y libros y todos lo hacen como yo  :o, con un scanf("%f",...).

Un saludo.
#2
Buenas a todos estoy aprendiendo C++ y tengo un problema con el operador de conversion en un programa que estoy haciendo para ver como se usa, pongo aqui el codigo de una clase llamada Cadena, el objetivo del codigo es hacer una burda implementacion de la clase string de C++, para ello uso algunas funciones de la biblioteca cstring de C:



//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;
}



Lo que yo trado de hacer es lo siguiente:

-Como no puedo acceder a los atributos privados desde un metodo externo a la clase, en strcpy (auxiliar. op1) lo que hago con auxiliar es pasarle el objeto y como deberia de recibir un char*, va al operador de conversion de tipo char* y me transforma el objeto en un char* listo para strcpy... O eso es la teoria porque me da el siguiente error (entre un monton mas de otros temas...)

El error que que da es este:

[Error] invalid user-defined conversion from 'Cadena' to 'char*' [-fpermissive]
[Note] candidate is: Cadena::operator const char*() const <near match>
[Note] no known conversion for implicit 'this' parameter from 'const char*' to 'char*'

A ver si teneis idea de cual es el problema!!

Muchas gracias y un saludo!!
#3
Buenas, a ver si me podeis explicar que ocurre con este codigo:

Resulta que deberia de darme un resultado final de cero, pero en vez de eso me da un resultado indeterminado, os pongo aqui el codigo:

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()
    {
     
      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;
      }
    }

  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);
  }

}


El codigo no esta mal, ya que si cambio el cerrojo de synchronized por otro que no sea de tipo Integer, funciona perfectamente, lo que deja entrever que no se puede usar un cerrojo que se vaya a modificar posteriormente (hago un n++ con la n declarada como integer).

Algun tipo de explicacion de por que no puedo usar este cerrojo? Me he llevado una inmensa sorpresa y dolores de cabeza por culpa de este error!!

Un saludo y gracias!
#4
Java / Duda con pool de threads en java
11 Enero 2014, 20:50 PM
Buenas, tengo una duda con los pool de threads, tengo la siguiente imagen:



Es de un examen que me estoy preparando y resulta, que no tengo ni idea de a que pool de threads puede pertenecer.

Puede ser a un newCachedThreadPool o un ThreadPoolExecutor, creo que tiene mas opciones de ser la segunda, ya que cuando se van creando mas hilos no se resiente el tiempo, cosa que puede corregir el ThreadPoolExecutor...

Que pensais vosotros??
#5
Buenas a todos, resulta que como se podran pensar soy muy novato con esto de ensamblador x86 y aqui viene mi duda:

Estoy tratando de imprimir los valores que contiene un vector, les pongo aqui el codigo que tengo por el momento:

.Const

.Data

Vec1 DW 8, 9, 2, 4, 5, 6, 1, 2, 3, 4, 7, 8, 9, 5, 6, 2, 3, 1, 4, 7 ;Aqui esta el vector

.Code

start:

Mov Ecx, Addr Vec1 ;Se le pasa la direccion base para movernos por todo el vector
Mov Eax, 0 ;Contador del vector, se pone el contador a 0

Invoke printf, "El valor de la posicion %d es: %d", Eax,[Ecx] ;[b]Aqui es donde viene la gracia, quiero ver el valor de la posicion 0 del vector y me sale un numero diferente!![/b]
Invoke puts, "", "\N"                                           ;Salto de Linea
Exit:
Invoke system, "pause"
Xor Eax, Eax
Invoke ExitProcess, Eax
;Fin del programa principal


Bueno pues como pongo en el codigo, lo que me ocurre es que en vez de aparecerme la primera posicion del vector lo que me aparece es un numero que no tiene nada que ver y que tampoco es la direccion de memoria del vector.

Creo que la teoria me la conozco y es lo que trato de aplicar, le paso a un registro la direccion donde se encuentra la direccion base del vector, y a partir de ahi voy recorriendo este aumentando la direccion en funcion de lo que ocupen los enteros, en este caso son dw por lo que se incrementara de 2 en 2 bytes, pero en la primera posicion el incremento es cero por lo que con mi codigo tendria que verse... He probado sumandole 2 o mas... quitandole los corchetes a Ecx y mil perradas, pero no lo cosigo  :rolleyes:.

Se que con este codigo no se puede recorrer todo el vector, he puesto aqui solo parte para que se vea la primea posicion para simplificarlo, mi problema solo es ese, con el bucle no tengo problemas (aun... xD)

A ver si me pueden decir donde esta mal el codigo!!

Un saludo!!
#6
Buenas, pues simplemente esa es mi pregunta, siempre pense que lo tenia claro, que era indistinto usar una u otra opcion, pero para memorias dinamicas era forzoso usar aritmetica de punteros (eso me contaron en la universidad...  :huh:), pero tras acceder a un vector dinamico con corchetes sin ningun problema pues de repente me he dado cuenta de que no es necesario usar aritmetica de punteros forzosamente en ningun caso... es esto asi?

Para que no quede duda, con aritmetica de punteros me refiero a acceder a una posicion de un vector tal que asi: *(vector + i), y por la forma de los corchetes (no recuerdo su nombre  :silbar:) me refiero a: vector.

Un saludo y a ver si podeis sacarme del lio!