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

#411
Obviamente implementar un mecanismo de este tipo lleva algo más de trabajo y tiempo que enviar las cosas "a pelo". Lo que sucede es que si luego quieres comunicar, por ejemplo, una aplicación en C++ con otra en Java, lo mismo tienes que acabar haciendo chapucillas manuales para que la comunicación pueda realizarse satisfactoriamente... utilizando un protocolo a nivel de aplicación evitas este tipo de problemas.

La ventaja de hacer uso de un protocolo de este tipo ya existente es que, por un lado, ya están probados y, por otro, es más fácil encontrar librerías para los diferentes lenguajes y arquitecturas.

Piensa que a la hora de diseñar estos protocolos ya se tuvieron que pegar con el envío de objetos, punteros y referencias... todo eso lo tienes cubierto.
#412
La verdad es que viendo el diseño del código es de suponer que el problema lo tienes porque la arquitectura que has elegido no es la más adecuada.

Ahora, que darte más detalles es complicado sin conocer la finalidad de la aplicación y su funcionalidad.
#413
Si en una función un elemento es de solo lectura, etiquétalo con "const" para que te salte un error si alguien intenta modificarlo:

Código (cpp) [Seleccionar]

void func( const std::vector< int >& lista_elementos )
{
  lista_elementos.push_back( 1 ); // Error de compilacion
}

#414
C++ no dice en ningún momento que lo que envíes a cout tenga que salir inmediatamente por la pantalla.

cout escribe en el buffer de salida... luego ya es otro mecanismo el que se encarga de volcar esa información en la pantalla ( o eso o hasta que fuerces manualmente la salida ).

Normalmente este comportamiento pasa desapercibido porque en la estructura normal de los programas que tienes que hacer mientras aprendes, después de una salida pides datos al usuario, luego en ese momento sí que se fuerza el volcado a la pantalla... al ser un proceso tan rápido da la sensación de que el cout es automático.
#415
efectivamente, cuando tu llamas a cout, el mensaje no se envía directamente a la pantalla, sino que se almacena en el buffer de salida esperando a ser procesado.

Si quieres forzar el volcado del buffer en la pantalla puedes hacerlo con:

Código (cpp) [Seleccionar]

// opcion 1
cout << "." << flush;

// opcion2
cout << ".";
cout.flush( );

#416
Yo te dí una solución... aunque no le hayas prestado mucha atención:

XDR, Protocol buffers, Json...

Tutorial protocol buffers

Ejemplos con JSon

Estos protocolos que te comento son a nivel de aplicación, su utilidad es que te permiten enviar cualquier tipo de información sin importar el lenguaje o el sistema sobre el que esté corriendo el ejecutable. Te abstraes de punteros, referencias y particularidades del lenguaje.

Esto se consigue a costa de añadir una capa más a tu código. Puedes conseguir lo mismo escribiendo tú mismo los datos a enviar, pero ahí tendrás que lidiar con los datos tanto en el lado del cliente como en el del servidor.
#417
Es un simple código de ejemplo para que vieses cómo funciona el contenedor. No tienes que ponerlo en ninguna parte de tu código.
#418

int elementos;
scanf("%d",&elementos);

int v [(elementos-1)]; // <<--- MAL


Eso está mal. Los arrays de tamaño dinámico ( su tamaño se conoce en tiempo de ejecución, no antes ) tienes que crearlos con malloc y liberarlos con free.

Además, estaría bien que comprobases que no se introduce un valor igual o inferior a 0... un array con -1 elementos no parece una buena idea.
#419
Estás mezclando conceptos.

¿De quién es la responsabilidad de devolver el valor de la celda? De la clase "CeldaSumar" o de la matriz?

* Si es de la clase "CeldaSumar" (desde mi punto de vista lo más lógico) ésta clase debería tener un puntero o referencia a la matriz para poder pedir los valores que correspondan. De esta forma no sería necesario implementar nada en la clase "Matriz", ya que las operaciones necesarias para realizar los cálculos están implementadas en "CeldaSumar".

* Si es de la clase "Matriz", deberías comprobar si el elemento pedido es de tipo "CeldaSumar" y en este caso realizar la suma que éste elemento contenga... lo que sucede en este caso es que no aprovechas el polimorfismo y el diseño con dos clases para "Elemento" no tiene sentido.

Las clases deberían tener esta forma:

Código (cpp) [Seleccionar]

class Elemento
{
 public:
   virtual int Valor( ) const = 0;
};

class CeldaInteger
{
 public:

   void SetValor( int valor )
   { _valor = valor; }

   int Valor( ) const
   { return _valor; }

 private:

   int _valor;
};

class CeldaSumar( )
{
 public:

   CeldaSumar( Matriz* matriz )
     : _matriz( matriz )
   {
   }

   void SetSuma( const std::string& suma )
   { _suma = suma; }

   int Valor( ) const
   {
     int valor = 0;

     // Algoritmo para calcular la suma
     // valor += _matriz->Valor( fila, columna );

     return valor;
   }

 private:

   Matriz* _matriz;
   std::string _suma;
};
#420
La próxima vez, te lo pido por favor, usa las etiquetas GeSHi para que el código quede legible.

Más o menos así:

Código (cpp) [Seleccionar]

#include <iostream>
#include <cstring>

using namespace std;


struct Persona {

char Nombre[65];
char apellido[65];
char numcel[65];


}plantilla[100];


void ingresarRegistro();
void imprimirRegistro();
void modificarRegistro();
void eliminarRegistro();

int camb=0;
int copiar;


int main() {

    int opc;

   do{

                cout<<"MENU"<<endl;
      cout<<"1.Agregar Registro"<<endl;
                cout<<"2.Eliminar Registro"<<endl;
                cout<<"3.Modificar Registro"<<endl;
                cout<<"4.Imprimir Registro"<<endl;
                cout<<"5.Salir"<<endl;
     
                cin>>opc;
   
      switch(opc){
      case 1:
         ingresarRegistro();
         break;
      case 2:
         eliminarRegistro;
         
         break;
      case 3:
         modificarRegistro();
         
         break;
                           
                 case 4:
                        imprimirRegistro();
                       
                        break;
                     
      }
   }while(opc!=5);

   return 0;
}
   
int cont=0;

void ingresarRegistro(){

   
    int r,f;
   
    r=cont++;
   
   
    if (camb==1)
    {
                r--;
                f=r+1;
               
    cout<< "Agregue el nombre del nuevo contacto: ";
    cin>> plantilla[f].Nombre;
    cout<<endl;
   
    cout<< "Agregue el apellido del nuevo contacto: ";
    cin>> plantilla[f].apellido;
    cout<<endl;
     
    cout<< "Agregue el numero movil del nuevo contacto: ";
    cin>> plantilla[f].numcel;
    cout<<endl;
                                    strcpy(plantilla[r].Nombre,plantilla[f].Nombre);
                                    strcpy(plantilla[r].apellido,plantilla[f].apellido);
                                    strcpy(plantilla[r].numcel,plantilla[f].numcel);
                                    copiar++;
                                       
    }
   
    cout<< "Agregue el nombre del nuevo contacto: ";
    cin>> plantilla[r].Nombre;
    cout<<endl;
   
    cout<< "Agregue el apellido del nuevo contacto: ";
    cin>> plantilla[r].apellido;
    cout<<endl;
     
    cout<< "Agregue el numero movil del nuevo contacto: ";
    cin>> plantilla[r].numcel;
    cout<<endl;

}

// Imprime 20 valores inecesarios

void imprimirRegistro(){
   
   int tr, a, r;
   
      cout<< "Lista de Contactos: ";
      cout<< endl;
     
      if (cont==0)
      {
               cout<< "Lista de contactos vacia.";
               cout<<endl;
               
               } else {
     
     
      for(a=0;a<r+1;a++)
   {
      tr=a;
     
      cout<< tr+1<< ". ";
      cout<< plantilla[a].Nombre;
      cout<<endl;
     }
     
     }
   
}

void modificarRegistro(){
   
    int a, tr,val, mod,g,r,rep;
   
cout<< "Lista de Contactos: ";
      cout<< endl;
     
      if (cont==0)
      {
               cout<< "Lista de contactos vacia.";
               cout<<endl;
           
               } else {
     
     
      for(a=0;a<r+1;a++)
     
   {
      tr=a;
     
      cout<< tr+1<< ". ";
      cout<< plantilla[a].Nombre;
      cout<<endl;
     }
                     }
     
                     cout<<"Seleccione el numero del contacto que desea modificar: ";
                     cin>>val;
                     mod=val-1;
                     g=r+1;
                   
                     int op1;
                     
                    if (val<=g)
                     {
                             
                     do
                     {
                   
                     cout<<"Contacto:"<<endl;
                     cout<<"1. Nombre: "<<plantilla[mod].Nombre<<endl;
                     cout<<"2. Apellido: "<<plantilla[mod].apellido<<endl;
                     cout<<"3. Numero Movil: "<<plantilla[mod].numcel<<endl;
                     cout<<"4. Menu anterior."<<endl;
                     cout<<"Seleccione la opcion que desea modificar: ";
                     cin>>op1;
                     switch (op1)
                     {
                            case 1:
                                 cout<< "Modifique el nombre del contacto: ";
                                 cin>> plantilla[mod].Nombre;
                                 cout<<endl;
                                 break;
                            case 2:
                                 cout<< "Modifique el apellido del contacto: ";
                                 cin>> plantilla[mod].apellido;
                                 cout<<endl;
                                 break;
                            case 3:
                                 cout<< "Modifique el numero de movil del contacto: ";
                                 cin>> plantilla[mod].numcel;
                                 cout<<endl;
                                 break;
                            case 4:
                                 rep=1;
                                 break;
                            }
                     }while (rep==0);
                     }else {cout<<"El contacto no existe."<<endl;
                         
                     rep=0;

                     }
}

void eliminarRegistro(){
   
    int del;
   int delm;
   int h;
   int rsp2;
   int copiar;
   int a1;
   int r, tr, a;
   
   
         cout<< "Lista de Contactos: ";
      cout<< endl;
     
      if (cont==0)
      {
               cout<< "Lista de contactos vacia.";
               cout<<endl;
             
               } else {
     
     
      for(a=0;a<r+1;a++)
     
   {
      tr=a;
     
      cout<< tr+1<< ". ";
      cout<< plantilla[a].Nombre;
      cout<<endl;
     }
                     }
                     
                     cout<<"Seleccione el numero del contacto que desea eliminar: ";
                     cin>>del;
                     delm=del-1;
                     h=r+1;
                     
                     if (del<=h)
                     {
                             
                                cout<< "Estas seguro que deseas borar el contacto selecionado?"<<endl;
                                cout<< "Nombre: "<<plantilla[delm].Nombre<<endl;
                                cout<< "Apellido: "<<plantilla[delm].apellido<<endl;
                                cout<< "Numero Movil: "<<plantilla[delm].numcel<<endl;
                                 cout<< "1.Si                    2.No"<<endl;
                               
                                cin>>rsp2;
                                cout<<endl;
                               
                                if (rsp2==1)
                                {
                               
                                strcpy(plantilla[delm].Nombre,"\0");
                                strcpy(plantilla[delm].apellido,"\0");
                                strcpy(plantilla[delm].numcel,"\0");
                               
                                copiar=delm;
                                for (a1=delm;a1<r+1;a1++)
                                {
                                    strcpy(plantilla[copiar].Nombre,plantilla[copiar+1].Nombre);
                                    strcpy(plantilla[copiar].apellido,plantilla[copiar+1].apellido);
                                    strcpy(plantilla[copiar].numcel,plantilla[copiar+1].numcel);
                                    copiar++;
                                   
                                }
                                r=cont-2;
                                camb=1;
                               
                               
                                } else {
                                }
                               
                     }else {cout<<"El contacto no existe."<<endl;
                           
                            }
}


Ahora, con respecto a tus dudas:

* C++ dispone de una clase "string", esta clase es mucho más potente y segura que char*, te recomiendo sustituirlo:

Código (cpp) [Seleccionar]

struct Persona
{
  string nombre;
  string apellido;
  string numcel;
};


* No uses variables globales, intenta evitar su uso ya que dan más problemas que beneficios. Es preferible pasar los valores como argumentos de la función.

En tu caso, por ejemlo, puedes valerte del contenedor "vector" para controlar el tamaño de la plantilla:

Código (cpp) [Seleccionar]


int main( )
{
  std::vector< Persona > plantilla;

  // nuevo elemento
  Persona nuevo;
  nuevo.nombre = "Carlos";
  nuevo.apellido = "Sastre";
  plantilla.push_back( nuevo );

  // Numero de elementos
  int numElementos = plantilla.size( );
}


* No tiene ningún sentido que uses varias variables para lo mismo:

Código (cpp) [Seleccionar]

void imprimirRegistro()
{
  int tr, a, r;
   
  cout<< "Lista de Contactos: ";
  cout<< endl;
     
  if (cont==0)
  {
    cout<< "Lista de contactos vacia.";
    cout<<endl;
  }
  else
  {
    for(a=0;a<r+1;a++)
    {
      tr=a;
     
      cout<< tr+1<< ". ";
      cout<< plantilla[a].Nombre;
      cout<<endl;
    }
  }
}


tr = a?? para qué? eso sobra.

y si te das cuenta, r no se inicializa nunca... aunque claro, con ese nombre que no significa nada tampoco parece algo obvio.

Y no es la única vez en la que haces esto:

Código (cpp) [Seleccionar]

                     cout<<"Seleccione el numero del contacto que desea modificar: ";
                     cin>>val;
                     mod=val-1;
                     g=r+1; // Antes de este punto, r no esta inicializada


Además, qué siginifica mod??? y g??? y r??? usa nombres que tengan relación con el uso que vaya a recibir la variable, tu código será mucho más legible... eso y tabularlo con criterio.

* Reutiliza código. Tanto en modificarRegistro como en eliminarRegistro imprimes la plantilla... algo que ya está hecho en imprimirRegistro. Quita ese código duplicado y llama a ésta función:

Un ejemplo de cómo quedaría la función eliminarRegistro usando la clase vector y reutilizando código:

Código (cpp) [Seleccionar]

void eliminarRegistro( std::vector< Persona >& plantilla )
{
  imprimirRegistro( plantilla );

  if ( !plantilla.empty( ) )
  {
    int indice;
    cout<<"Seleccione el numero del contacto que desea eliminar: ";
    cin>> indice;

    if ( indice > 0 && indice <= plantilla.size( ) )
    {
      cout<< "Estas seguro que deseas borar el contacto selecionado?"<<endl;
      cout<< "Nombre: "<<plantilla[ indice - 1 ].Nombre<<endl;
      cout<< "Apellido: "<<plantilla[ indice - 1 ].Apellido<<endl;
      cout<< "Numero Movil: "<<plantilla[ indice - 1 ].Numcel<<endl;
      cout<< "1.Si                    2.No"<<endl;

      int respuesta;
      cin>>respuesta;

      if (respuesta == 1 )
      {
        auto it = plantilla.begin( ) + indice - 1;
        plantilla.erase( it );
      }
    }
    else
    {
      cout<<"El contacto no existe."<<endl;
    }
  }
}