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

#431
Cita de: juanma31 en 21 Mayo 2014, 23:58 PM
tu eres la completita. Estoy aprendiendo a programar en c++ y pregunto si alguien me podria ayudar. si no quieres colaborar mantente al margen

Tu sigue contestando así en este foro que te vas a tener que responder tu solo a las dudas.

Ante todo educación, que somos ya mayorcitos.

¿Que estás aprendiendo? perfecto, bienvenido al mundo de la programación. Nadie dijo que fuese a ser fácil. Si te damos las cosas echas no vas a aprender absolutamente nada. Esta profesión, como cualquier otra, se aprende a base de meter la pata y de dedicarle tiempo. Además, ten en cuenta que el mundo de la programación suele ser de todo menos sencillo y fácil, vete acostumbrando a los retos porque te vas a hartar.

Así que, por favor, menos humos y más humildad. Ten en cuenta que aquí no te estamos cobrando por nuestro tiempo y nuestro conocimiento, cosa que deberías agradecer.
#432
Con estructuras, uniones y desplazamientos binarios se puede conseguir el mismo efecto y sin hacer apenas operaciones... aunque lo mismo se sale un poco de lo que pretendía tu profesor con la práctica :)


typedef union
{
  int entero;
  struct
  {
    unsigned short : 6;
    unsigned short valor : 3;
  } octal;

  struct
  {
    unsigned short : 4;
    unsigned short valor: 4;
  } hex;

  struct
  {
    unsigned short : 7;
    unsigned short valor: 1;
  } bin;
} conversor;

int main( )
{
  int numero;

  printf( "Introduce un numero: " );
  scanf( "%d", &numero );

  conversor conver;
  conver.entero = numero;

  printf( "octal: " );
  int i;
  for ( i = 0; i < 3; i++ ) // 128 requiere 3 digitos hexadecimales
  {
    printf( "%d", conver.octal.valor );
    conver.entero <<= 3;
  }
  printf ("\n" );

  conver.entero = numero;
  printf( "hexadecimal: " );
  for ( i = 0; i < 2; i++ ) // 128 requiere 2 digitos hexadecimales
  {
    printf( "%x", conver.hex.valor );
    conver.entero <<= 4;
  }
  printf( "\n" );

  conver.entero = numero;
  printf( "binario: " );
  for ( i = 0; i < 8; i++ ) // 128 requiere 8 digitos binarios
  {
    printf( "%d", conver.bin.valor );
    conver.entero <<= 1;
  }
  printf( "\n" );
}


Al fin y al cabo el ordenador hace muchas veces buena parte del trabajo por nosotros.
#433
Programación C/C++ / Re: Asociacion en c++
22 Mayo 2014, 08:16 AM
¿Punteros? ¿Herencia?
#434
Para enviar datos por red hay, básicamente, dos opciones: TCP y UDP

* TCP es un protocolo "seguro", garantiza una conexión persistente, no se pierden tramas y los datos llegan ordenados...

* UDP es inseguro: no garantiza el estado de la conexión, se pueden perder paquetes y los datos pueden llegar en orden aleatorio. La ventaja es que es bastante más rápido.

En tu caso, lo suyo sería crear una conexión UDP, ya que es más rápida, flexible y eficiente. Implementar un mecanismo simple que te permita descartar imágenes ( por llegar después de otra más actual, por ejemplo ) es bastante sencillo y no sacrificas velocidad.

Ten en cuenta que a la conexión le va a dar igual las prisas que tu tengas, va a su velocidad. Si intentas enviar datos a más velocidad lo único que conseguirás es que se apilen los mensajes en la cola de salida... con la posibilidad de que alguno se pierda.

Para que sistemas diferentes se puedan comunicar entre sí es necesario establecer un protocolo de comunicación que ambos entiendan. Puedes programarte uno o usar uno ya existente. Lo mejor, desde mi punto de vista, es usar uno ya existente. Puedes probar Json, XDR, protocol buffers (google) o ASN.1.


#435
"Incremental linking" crea una base de datos con los símbolos del código fuente "sobre la marcha"... esto permite reducir el tiempo necesario para compilar una aplicación ( esto es relativo, proyectos pequeños tardarán más en compilar por el trabajo extra de montar la base de datos, se nota en proyectos grandes ).

Lo que te ha pasado es que ha cambiado el entorno y la base de datos que te comento debería regenerarse, ya que contiene símbolos no válidos.

Normalmente, cuando cambies el entorno, asegúrate de hacer un clean completo del código para eliminar todos los códigos y demás archivos implicados en el proceso para evitar inconsistencias.
#436
Digamos que tú tienes una lista tal que:

A <--> C

y quieres añadir B, que va en medio.

Los pasos a seguir son:

B->ant = A
B->sig = C = A->sig
C->ant = B
A->sig = B

Son 4 pasos... y tu estás haciendo únicamente 3...

Código (cpp) [Seleccionar]

            temp->anterior=temp2;
            temp->siguiente=temp2->siguiente;
            // temp2->siguiente=temp->anterior;
            temp2->siguiente=temp;
#437
Tienes que ponerlo porque nodo es dependiente del template "Agen"

Un saludo.
#438
prueba con

Código (cpp) [Seleccionar]
template <typename T>
void imprimirDescendientes(Agen<T>&A, typename Agen<T>::nodo)


#439
y cómo es la declaración del template?
#440
Varias cosas:

* Tabula el código... es imposible leer un código que no está correctamente tabulado.

* Pon nombres con sentido a las variables. 'fil' y 'col' dan a entender que son índices para la fila y la columna... cuando realmente están indicando el total de filas y columnas... nuevamente lo que prima aquí es que el código sea lo más legible posible para evitar problemas.

* No uses variables globales, no sucede en este caso concreto, pero dan problemas. Es mejor pasar la matriz como parámetro.

* Cúrrate un poquito la interfaz de usuario. El sistema para rellenar la matriz es espantoso... si pones un carácter no válido no te avisa, no sabes qué está pasando... poner mensajes de error ante entradas incorrectas te ayuda a ver también que el programa hace lo que debe... si no pones mensajes no sabes si se está tragando información incorrecta.

Respecto a este punto... cómo sabes cuándo has dejado de rellenar la matriz y el programa te está pidiendo los movimientos?? sencillamente, con tu código, es imposible saberlo.

Queda más bonito algo del tipo:

Código (cpp) [Seleccionar]

const int FILAS = 20;
const int COLS = 20;

// ...

int main( )
{
  int num_filas, num_columnas;

  do
  {
    cout << "Numero de filas: ";
    cin >> num_filas;
    if ( num_filas < 1 || num_filas > FILAS )
      cout << "Valor incorrecto." << endl;
  } while ( num_filas < 1 || num_filas > FILAS );

  do
  {
    cout << "Numero de columnas: ";
    cin >> num_columnas;
    if ( num_columnas < 1 || num_columnas > COLS )
      cout << "Valor incorrecto." << endl;
  } while ( num_columnas < 1 || num_columnas > COLS );

  // ...
}


Es más código pero si algo funciona mal puedes ver qué es simplemente "jugando" con tu aplicación.

* Procura reducir el ámbito de las variables al mínimo posible:

Código (cpp) [Seleccionar]
int i,j,c,pasos,x,y,l,m,Ac;

Tienes esta línea al inicio de 'Mover_posicion'. No es necesario... si vas a usar un índice en un for puedes declarar la variable dentro del for:

Código (cpp) [Seleccionar]

for ( int i=0; i < 20; i++ )
{
}


Reutilizar variables dentro de una misma función es algo que hay que realizar con sumo cuidado para evitar meteduras de pata.

* Reutiliza código. Usas en varios puntos, por ejemplo, el código que imprime la matriz en pantalla. Saca ese código a una función y evita duplicarlo... por un lado, si ese código tiene errores, solo tendrás que corregirlos en un sitio, por otro, todas las invocaciones funcionarán igual.

Código (cpp) [Seleccionar]

void PintaMatriz( char matriz[][COLS], int filas, int columnas )
{
  for ( int i = 0; i < filas; i++)
  {
    for ( int j = 0; j < columnas ; j++)
      cout << matriz[i][j] << " ";
    cout << endl;
  }
}


* Cuidado con las asignaciones. La siguiente instrucción de tu programa no hace nada. ¿Metedura de pata o despiste?

Código (cpp) [Seleccionar]
matriz[x][y] = matriz[x][y];

* Controla el rango de valores de las variables:

Código (cpp) [Seleccionar]

  cout<<"Ingrese filas y columnas"<<endl;
  cin>>fil>>col;


¿Qué sucede si pongo 1000 y 244? Que el programa fallará al intentar escribir fuera de la matriz de 20x20 que has definido.

* Inicializa las variables:

Código (cpp) [Seleccionar]

  int c,pasos,x,y,l,m,Ac;

  // ...
  Ac=Ac + Puntaje(x,y); // Que valor tiene Ac aqui???


Código (cpp) [Seleccionar]

float Puntaje(int x, int y)
{
  float Pts;
  if (matriz[x][y]=='$')
    Pts=1.0;
  else if (matriz[x][y]=='%')
    Pts=1.5;
  else if (matriz[x][y]=='&')
    Pts=2.0;

  return Pts; // Cuantos puntos vale '|' ??
}


* No tienes ningún chequeo que impida introducir varios 'I' o 'F' así como tampoco compruebas que, obligatoriamente, se haya introducido una 'I' y una 'F' en la matriz.

* No compruebas que con 'pasos' te puedas salir de la matriz.

Tienes bastantes fallos en la aplicación. Te he indicado un poco lo que he ido viendo.

Dale un repaso al código, corrige las cosillas y seguimos revisando.