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

#481
-> nombre es un vector de cadenas de caracteres
-> nombre[ i ] permite acceder a cualquiera de esas cadenas de caracteres
-> nombre[ i ][ j ] permite acceder a los caracteres de una de esas cadenas.
#482
Teniendo en cuenta que, como norma general, un programa no es sino un conjunto de algoritmos... me parece de lo más acertada la propuesta.

Vale, admito que la inmensa mayoría de los algoritmos son tan simples que no merecen mención alguna... pero también hay algoritmos que se las traen.

El tema de las redes neuronales es francamente interesante... pero por el momento salvo que te vayas a foros de habla inglesa no es sencillo encontrar información interesante... la teoría es fácil de encontrar... ahora, ponte a buscar casos de uso con la correspondiente documentación.
#483
Y que tal con iteradores??

Código (cpp) [Seleccionar]

  std::vector< int > lista;

  lista.push_back( 1 );
  lista.push_back( 2 );
  lista.push_back( 3 );
  lista.push_back( 4 );
  lista.push_back( 5 );
  lista.push_back( 6 );

  auto it = lista.begin( ) + std::distance( lista.begin( ), lista.end( ) ) / 2;

  if ( lista.size( ) % 2 == 0 )
    std::cout << *(it - 1) << " ";
  std::cout << *it;


Presupongo el vector ya ordenado porque esa parte dices que ya la tienes... aunque con un set o un multiset ( dependiendo de si admites valores duplicados o no ) te ahorrarías el tener que ordenar la lista:

Código (cpp) [Seleccionar]

  std::set< int > lista;

  lista.push_back( 5 );
  lista.push_back( 1 );
  lista.push_back( 4 );
  lista.push_back( 3 );
  lista.push_back( 6 );
  lista.push_back( 2 );

  // Aqui se imprimen ya ordenados
  for ( auto it = lista.begin( ); it != lista.end( ); ++it )
    std::cout << *it << std::endl;

  // Y si el orden que quieres es de mayor a menor...
  for ( auto it = lista.rbegin( ); it != lista.rend( ); ++it )
    std::cout << *it << std::endl;
#484
y, por favor, no mezcles C++ y C en el mismo programa.

En tu caso, o usas cout, o usas printf... mezclar las dos no es para nada beneficioso... y lo mismo para cin y getch, scanf, ...
#485
La verdad es que hace como 6 años que no toco mucho el tema de sockets al nivel de conexiones concurrentes... pero creo recordar que el mecanismo era el mismo... voy a revisar un poco el tema por si estoy equivocado.

Cierto, estaba equivocado:


#include <winsock2.h>
#include <stdio.h>

#pragma comment(lib, "Ws2_32.lib")

void main()
{
//-------------------------
// Initialize Winsock
WSADATA wsaData;
int iResult;
u_long iMode = 0;

iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != NO_ERROR)
  printf("Error at WSAStartup()\n");

//-------------------------
// Create a SOCKET object.
SOCKET m_socket;
m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_socket == INVALID_SOCKET) {
  printf("Error at socket(): %ld\n", WSAGetLastError());
  WSACleanup();
  return;
}

//-------------------------
// Set the socket I/O mode: In this case FIONBIO
// enables or disables the blocking mode for the
// socket based on the numerical value of iMode.
// If iMode = 0, blocking is enabled;
// If iMode != 0, non-blocking mode is enabled.

iResult = ioctlsocket(m_socket, FIONBIO, &iMode);
if (iResult != NO_ERROR)
  printf("ioctlsocket failed with error: %ld\n", iResult);
 

}


Código sacado de http://msdn.microsoft.com/en-us/library/windows/desktop/ms738573(v=vs.85).aspx
#486
--
#487
Lo que sucede, creo yo, es que estás definiendo las conexiones como bloqueantes. Al ser una conexión bloqueante, si tu código llama a la función recv o recvfrom el hilo se quedará congelado dentro de la función hasta que recibas algo.

Para solucionar esto tienes dos opciones:

* Hacer la aplicación multihilo y crear un hilo nuevo para cada cliente.

* Hacer las conexiones no bloqueantes.

Yo te voy a comentar brevemente la segunda solución, para la primera el hecho de trabajar con sockets es casi irrelevante.

Para definir una conexión como no bloqueante tienes que hacer uso de la función fcntl, cuyo prototipo aparece a continuación:


#include <fcntl.h>

int fcntl(int fd, int cmd, int arg );


El primer parámetro es el descriptor ( un socket, un archivo... lo que corresponda. En tu caso el socket ).
El segundo parámetro permite indicar el sentido de la operación, lectura o escritura.
El tercer parámetro se usa en la escritura y permite modificar ciertos parámetros del desriptor.

En nuestro caso concreto, queremos hacer una operación de escritura ( vamos, modificar el comportamiento del descriptor ) y lo que queremos modificar es el comportamiento bloqueante.

Esto se consigue con la siguiente línea:


if ( fcntl( socket, F_SETFL, O_NONBLOCK ) < 0 )
{
  // error
}


Una vez configurado el socket, si intentas realizar una operación de lectura y no hay datos para leer, el hilo de ejecución no se quedará esperando datos, sino que saldrá de la función indicándote que no ha leído absolutamente nada.

Esta circunstancia la puedes controlar así:


int data_length = recv ( socket, buffer, LENGTH_BUFFER, 0 );

if ( data_length > 0 )
{
  // Se han recibido datos
}
else if ( data_length == 0 )
{
  // No hay datos pendientes
}
else if ( data_length == SOCKET_ERROR )
{
  // Error
}
#488
El tiempo de ejecución de un bucle anidado es algo más complicado porque tienes que tener en cuenta el número total de repeticiones del bucle... Ahí es donde entra en juego las ecuaciones de los sumatorios.

Por ejemplo. El tiempo de ejecución de una iteración del primer bucle será igual O(numero de veces que se ejecuta el código del tercer bucle * numero de instrucciones en el tercer bucle )
#489
Cita de: amchacon en  5 Mayo 2014, 11:16 AM
@Eferion: Yo no llamaria a la variable "lista", si veo eso en un código pensaré que es un list y no un vector ;D

Cierto... se nota que list lo uso poco jejejeje
#490
Si las palabras no van a aparecer duplicadas y van a venir todas en minúsculas o mayúsculas puedes usar el contenedor set.

Código (cpp) [Seleccionar]

std::set< std::string > lista;
lista.insert( "zzz" );
lista.insert( "bbb" );
lista.insert( "tttt" );
lista.insert( "hola" );
lista.insert( "adios" );

for ( auto it = lista.begin( ); it != lista.end( ); ++it )
  std::cout << *it << endl;


Salida del programa:

adios
bbb
hola
ttt
zzz


Si se admiten duplicados, puedes usar el contenedor multiset.

Si se han de ordenar independientemente de que empiecen por mayúsculas o minúsulas puedes usar la función sort:

Código (cpp) [Seleccionar]

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>

int ordenar( const std::string& cad1, const std::string& cad2 )
{
  int to_return = 0;

  // Codigo para comparar las cadenas

  return to_return;
}

int main( )
{
  std::vector< std::string > lista;

  lista.push_back( "abogado" );
  lista.push_back( "Ahorcado" );
  lista.push_back( "prueba" );
  lista.push_back( "Finalista" );
  lista.push_back( "ZaRPazo" );
  lista.push_back( "C++" );

  std::sort( lista.begin( ), lista.end( ), ordenar );

  for ( auto it = lista.begin( ); it != lista.end( ); ++it )
    std::cout << *it << std::endl;
}