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

#361
Lo que tú estás haciendo ahora mismo podría equipararse a 5 personas intentando hablar todas a la vez a través de la misma línea.

Para resolver el problema yo te propongo 2 opciones:

* Usar 5 instancias diferentes de TCPSocket. Cada una creará un socket diferente y no se interferirán entre sí.

* Usar solo un TCPSocket, en este caso la clase debería impedir nuevas conexiones hasta no haber cerrado la conexión actual.

#362
Programación C/C++ / Re: Ayuda!
24 Junio 2014, 14:31 PM
Cita de: Bob1098 en 24 Junio 2014, 14:06 PM
Short es una palabra reservada que se adjunta a una variable, y que por lo general lo que básicamente hace es reducir el tamaño en bytes de la variable.

Por ejemplo, si tiene un int, este ocupa 4 bytes, pero si tienes un short int, este ocupará 2 bytes. Existe también otra palabra (long) que es para lo contrario, aumentar el tamaño en bytes. SIn embargo, el aumentar o reducir el tamaño de la variable, se pierden o se ganan valores posibles. Con un short int el número entero que puedes almacenar en la variable va a ser menor que el que pueda almacenar un int. Con un long int, el tamaño será mayor (8 bytes).

Espero que te haya servido.

No generalices los tamaños porque lo que dices no se va a cumplir siempre.

Un ejemplo: En arquitecturas de 16 bits, int ocupa 2 bytes, en arquitecturas de 32 bits ocupa 4.
#363
Imagino que estás empezando a meterte en temas de programación. Te comento algunas guías que deberías usar:

* Divide el código en funciones sencillas. Un while con un switch dentro, que contiene ifs no es algo sencillo de manejar.

* Si usas C++ y estás aprendiendo, usa elmentos propios de C++, en caso contrario, programa en C. Es más fácil cogerle el punto a las capacidades de cada lenguaje y te evitará quebraderos de cabeza. En este caso, deberías usar 'cin' en vez de 'scanf' y 'cout' en vez de 'printf':

Código (cpp) [Seleccionar]

#include <iostream>

int main( )
{
  int numero;
  cout << "Introduce un número: ";
  cin >> numero;
  cout << "El número introducido es: " << numero << endl;
}


* Para las variables, elige nombres con significado... opcion, opcion1, opcion2, var1, var2 no parecen nombres muy significativos, intenta evitarlos.

* Las variables inicialízalas siempre. Si no inicializas un puntero puede que al depurar no seas capaz de ver si el puntero accede a posiciones de memoria válidas.

Código (cpp) [Seleccionar]

int opcion = 0;
int opcion1 = 0;
int opcion2 = 0;
// ...


* Intenta declarar las variables cuando vayas a usarlas. Esto te evitará problemas al codificar los programas. Reutilizar variables a veces es una fuente muy tonta de errores difíciles de encontrar.

* Evita el uso de getch y de system. Puedes ver algunos motivos en este otro hilo

* En tu caso, estás intentando leer un carácter, lo normal es que utilizases %c para leerlo en vez de %d (%d es para enteros, %c para caracteres)
#364
Para crear ventanas y entornos gráficos tienes muchísimas opciones. Te enumero algunas:

* API de Windows / Linux (depende del sistema operativo que uses). Trabajar directamente con la API te proporciona muchísima flexibilidad pero suele ser la opción más complicada de usar.

* MFC. Librería de Microsoft para entornos gráficos en C / C++. Es bastante más sencillo de usar que la API de Windows pero también menos flexible. Esta opción solo es válida en entornos Windows.

* Qt. Framework multiplataforma. Qt es un conjunto de librerías con multitud de funciones ( entorno gráfico, acceso a bases de datos, sockets, ficheros, gráficos, ... ). Es una opción bastante recomendable aunque al principio cuesta cogerle el punto (básicamente por la cantidad de opciones que tiene).

* WxWidgets. Entorno gráfico multiplataforma. No puedo darte más información sobre el porque no lo he usado nunca.

* GTK y GTK+. Otro entorno gráfico multiplataforma. Este entorno nació en entornos Linux.

Y seguro que me dejo alguna opción importante por el camino, pero ahora mismo solo recuerdo estas.

Un saludo.
#365
Cita de: psycho248 en 23 Junio 2014, 17:40 PM
HOLA!!! Sus ejemplos me han dado buenas ideas. Gracias.

Pero en caso de que mi codigo se encuentre en una función es necesaria usar el "free(cad2)"??
y en que momento usarlo??  :-[

Por otro lado traté de reescribir el código de esta manera:

#include <stdio.h>

int main()
{
const char *cad[5]={"uno","dos","tres","cuatro","cinco"};
char cadena[3];
char *ptrcad;
int i;

for(i=0; i<3; i++)
{
 *ptrcad = *cad[i];
 cadena[i] = *ptrcad;
 printf("%s--\n",ptrcad);
 printf("%s\n",cadena[i]);
}

return 0;
}


Pero al imprimir ptrcad solo me imprime "basura" Y cadena  lo convierte a int.
Es el mismo caso de memoria dispersa?????????'

 *ptrcad = *cad[i];
 cadena[i] = *ptrcad;


ptrcad es un puntero de tipo char* y cad también... no hace falta usar ese asterisco... y en la asignación siguiente tampoco.

los usos de los punteros son los siguientes:


char* ptr1;
char* ptr2[2] = { "Hola", "Adios" };
char c;
int m;

// inicializacion
// ...

ptr1 = ptr2[ 0 ]; // ptr1 apunta a "Hola"
c = *ptr2[ 1 ]; // c almacenará 'A'

memoria = &ptr1; // m almacena la posición de memoria donde se encuentra ptr1
memoria = (int)ptr1; // m almacena la posición de memoria apuntada por ptr1
#366
La solución pasaría, desde mi punto de vista, por una de estas dos posibilidades:

* Automático: creas un fichero de configuración que será leído por el programa durante su arranque. En dicho fichero le indicas la interfaz a la que debe conectarse (recuerda que un equipo puede tener varias IPs... independientemente de que tenga una o varias tarjetas ). Entonces localizas la ip asignada a la interfaz que te hayan dicho y usas esa ip para configurar tu conexión... una vez hecho esto puedes programarte una función que haga las veces de centinela y chequee cada cierto tiempo la ip de la interfaz por si acaso ésta ha cambiado. En tal caso cierras la conexión actual y creas una nueva usando los valores actuales de IP.

* Manual: al iniciar el programa pides una dirección ip para intentar la conexión.
#367
Imprimir en orden descendente:

Código (cpp) [Seleccionar]

std::set< int > numeros;
numeros.insert( 3 );
numeros.insert( 1 );
numeros.insert( 2 );

for ( auto it = numeros.rbegin( ); it != numeros.rend( ); ++it )
  std::cout << *it << " ";


Salida:
Código (cpp) [Seleccionar]
3 2 1
#368
char *cad[3];

Con esa declaración estás declarando un vector con 3 punteros de tipo char... pero claro, cada uno de esos punteros está apuntando a cualquier sitio menos a zonas de memoria seguras.

Tienes dos opciones... o inicializas esos punteros con malloc para hacer la reserva de memoria dinámica o creas un array bidimiensional y te olvidas de reservas dinámicas:

* Con malloc

char *cad2[ 3 ];
cad2[ 0 ] = malloc( 10, sizeof( char ) );
cad2[ 1 ] = malloc( );
cad2[ 2 ] = malloc( );


*Sin malloc
char *cad2[ 3][10];
#369
A[p]*3;

¿Y dónde dices que tienes que almacenar el resultado de la operación? Para almacenar un valor hay que usar en alguna parte el operador de asignación '=' y en esa línea no está... es decir, estás multiplicando el valor del vector por 3 pero tiras el resultado a la basura.

Además:

Código (cpp) [Seleccionar]

for (p=0;p<9;p++)
{

}
       
for (i=0;i<9;i++)
{

}
       
C[p]= A[p] + B[i]; // ????


La última línea está fuera de los bucles es decir, únicamente vas a calcular el siguiente resultado:

Código (cpp) [Seleccionar]
C[9] = A[9] + B[9];

Y ¿adivinas qué? A, B y C únicamente tienen 9 posiciones, luego A[9], B[9] y C[9] no existen.

Estás en C++... no hace falta que declares todas las variables al inicio del código. Puedes hacer cosas tal que:

Código (cpp) [Seleccionar]

for( int i=0; i<9; i++)
{
  cout<<"Ingrese un numero par"<<endl;
  cin>>A[i];
  sum1=sum1+A[i];
}

for( int i=0; i<9; i++ )
{
  cout<<"Ingrese un numero impar"<<endl;
  cin>>B[i];
  sum2=sum2+B[i];
}

for( int i=0; i<9; i++ )
  C[i] = A[i] + B[i];


Este código compila y funciona porque la variable "i" que hemos declarado en cada bucle pertenece al bucle... una vez el programa sale del bucle la variable, simplemente, deja de existir (se sale del ámbito). Esta forma de programar tiene sus ventajas, por ejemplo tu código no habría compilado. Esto te habría dado alguna pista acerca del error que tienes en tu código:

Código (cpp) [Seleccionar]

// int p;
// int i;

for ( int p=0;p<9;p++)
{

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

}
       
C[p]= A[p] + B[i]; // ERROR: no existe ni 'p' ni 'i'
#370
Cita de: LauraD en 19 Junio 2014, 00:09 AM
for (i=0;i<4;i++)
{
cout<<"Digite un numero para la matriz A"<<endl;
cin>>a[i];
a[0]+7;
}


Ahí, básicamente, estás repitiendo el siguiente proceso 4 veces:


  • Pides un número que almacenas en el vector
  • Coges el valor de la posición 0, le sumas 7 y.... tiras el resultado a la basura porque no lo almacenas.

Tendrías que hacer más bien lo siguiente:

1. Pedir los datos:
for (i=0;i<4;i++)
{
  cout<<"Digite un numero para la matriz A"<<endl;
  cin>>a[i];
}


2. Calcular las cosas que te piden... pero eso ya después, cuando tengas que presentar dicho resultado, no dentro del bucle:
a[ 0 ] += 7; // ALMACENAMOS el valor en a[0]
b[ 0 ] += 7;
if ( a[ 0 ] > b[ 0 ] )
{
  // ...