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 - rir3760

#481
Cita de: 47anonimo74 en  9 Febrero 2014, 11:46 AMel return 0 por lo general yo no o uso sera que siempre acabo poniendo un exit(0); antes de llegar.
En la función main no es necesario utilizar una llamada a la función exit para terminar el programa ya que una sentencia "return N;" tiene el mismo efecto.

Un saludo
#482
Programación C/C++ / Re: problemas con fseeks
8 Febrero 2014, 18:03 PM
Cita de: yoel_alejandro en  8 Febrero 2014, 14:59 PMsi por ejemplo el usuario que creó el txt dejó dos saltos de línea sucesivos (o sea, con una línea en blanco), entonces el programa lee '\n' y se detiene. La otra línea será sólo '\n' por lo que devolverá búfer vacío.

Si verificamos con CR-LF no pasa esto porque al encontrar la secuencia CR+LF+CR+LF él recorrerá hasta el último LF antes de salir.
Entonces entras en un problema de diseño: tienes una función que se llama "ReadLine" pero esta no lee una sino un numero variable dependiendo de las lineas en blanco.

Si tomamos la biblioteca estándar de C como ejemplo estas solo leen lo necesario, nada mas. De no hacerlo habría problemas para procesar un stream ya que, a criterio de las funciones, se descartarían caracteres.

Cita de: yoel_alejandro en  8 Febrero 2014, 14:59 PM¿Qué tal si alguien llenó el txt manualmente y puso una secuencia extraña tal como CR + LF + CR (o sea, una cantidad impar, ni dos ni cuatro)? ¿Qué me garantiza que fgetc() sabrá hacer "lo correcto" en este caso?
Nada pero en ese escenario tendrás problemas no solo con tu programa sino con cualquier aplicación que espere los avances de linea de una forma mientras que en el archivo se indican con otra (si tienes Linux debes conocer aplicaciones como unix2dos y dos2unix que se encargan de la conversión).

Un saludo
#483
Si hay un limite en el máximo de palabras del historial y este es relativamente pequeño basta con declarar un array de arrays de caracteres:
Código (cpp) [Seleccionar]
#include <iostream>
using std::cin;
using std::cout;
using std::endl;

#include <cstring>
using std::strcmp;
using std::strcpy;

const int max_palabras = 4;
const int chars_x_palabra = 32;

int main()
{
   char palabra[max_palabras][chars_x_palabra];
   char aux[chars_x_palabra];
   int num_palabras = 0;
   
   for (int i = 0; i != max_palabras; ++i){
      cout << "Introduce una palabra: ";
      cin >> aux;
     
      int j;
      for (j = 0; j != num_palabras && strcmp(aux, palabra[j]); ++j)
         ;
      if (j == num_palabras)
         strcpy(palabra[num_palabras++], aux);
      else
         cout << "Palabra repetida" << endl;
   }
   
   for (int i = 0; i != num_palabras; ++i)
      cout << "Palabra " << (i + 1) << ": " << palabra[i] << endl;
   
   return 0;
}


Pero si debes aceptar un numero arbitrario de palabras lo mejor es utilizar un puntero de tipo "char **" junto con las funciones malloc, calloc y realloc.

Un detalle que debe cambiarse si o si en el programa es el uso de cin por una forma segura de leer una palabra evitando el desbordamiento.

Ya por ultimo yo no lo haría de esa forma, si estas aprendiendo C++ lo políticamente correcto es utilizar vector + string + getline y así terminas con un programa mas corto y seguro.

Un saludo
#484
Cita de: s3tH en  7 Febrero 2014, 03:19 AMdesde hace algún tiempo me ha llamado la atención este tipo de gráficos (menús, botones, etc) que se muestran en algunas aplicaciones de consola, mi pregunta es, que metodología se emplea, bajo que lenguaje se puede hacer o si cuenta con algún tutorial que me pueda guiar
Me parece que la segunda imagen es de Turbo C o algún otro dinosaurio para MS-DOS.

Ese tipo de aplicaciones (consola) las puedes desarrollar en C/C++ utilizando una biblioteca de terceros (por ejemplo ncurses) o bien directamente el API del SO (por ejemplo Win 32).

Un tutorial sobre ncurses es NCURSES Programming HOWTO, en el caso de la Win 32 API la sección en cuestión inicia en la pagina Consoles.

Un saludo
#485
Programación C/C++ / Re: problemas con fseeks
7 Febrero 2014, 03:41 AM
Cita de: yoel_alejandro en  7 Febrero 2014, 03:04 AMTengo entendido además que por lo general los sistemas Windows codifican el fin de línea con dos caracteres (0x0D + 0x0A, o en decimal 13 + 10), mientras los UNIX usan simplemente el 0x0A.
Correcto, en MS-DOS (QEPD) y MS Windows el avance de linea se indica con '\r' + '\n', en Linux con '\n'.

Cita de: yoel_alejandro en  7 Febrero 2014, 03:04 AMMe tratas de decir que si por ejemplo fgetc() encuentra una sucesión CR + LF , entonces lee un sólo '\n' y avanza el indicador de posición de archivo en dos bytes, de modo que la próxima llamada a fgect() leerá el siguiente carácter después del LF. ¿¿Es eso así??
Exacto siempre y cuando el modo del stream sea texto, si el modo es binario (por ejemplo cuando se abre un archivo indicando el modo "rb") se presenta el problema que mencionas (cada carácter se retorna tal cual sin importar su valor).

Un saludo
#486
Cita de: Renzo21 en  6 Febrero 2014, 04:41 AMRealicé un programa, cuando voy a compilar me aparece que no tiene errores pero cuando lo voy a correr me aparece este error y no permite crear el .exe:
Linker Warning: No module definition file specified: using defaults.
Linker Error: Undefined symbol ModificarClientes() in module AEROLINE.CPP (este ultimo lo repite 15 veces, solo que con el resto de las 16 funciones que empiezan por Ingresar, Modificar, Consultar y Eliminar).
Sin animo de ofender pero deberías conseguir un buen libro sobre C++ y rescribir el programa desde cero ya que tiene bastantes problemas.

El primero lo indica el vinculador: la extensión "cpp" sugiere que el lenguaje es C++ pero de este tiene nada, es C.

Otro es el uso de extensiones como <dos.h> y <conio.h>, si apenas empiezas con C++ no deberías utilizarlas, las razones de ello se dan en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

Por ultimo el error que mencionas ya lo insinúa el mensaje generado: "Undefined symbol ModificarClientes()". Si revisamos tu programa por alguna razón duplicas los prototipos de las funciones:
Código (cpp) [Seleccionar]
// ...

void modificarClientes();

// ...

void menuClientes()
{
   char menuClientes2();
   void IngresarClientes();
   void ConsultarClientes();
   void ModificarClientes(); // modificarClientes != ModificarClientes


Un saludo
#487
Programación C/C++ / Re: problemas con fseeks
6 Febrero 2014, 03:13 AM
Cita de: yoel_alejandro en  5 Febrero 2014, 01:57 AMEl problema al parecer es que te mueves para adelante y para atrás en el archivo, abusando de fseek.
Eso es algo que ya se recomendó a m@o_614 en otros temas pero por alguna razón (valida o no, no lo se) simplemente no la sigue.

Cita de: yoel_alejandro en  5 Febrero 2014, 01:57 AMTe explico la última parte del código antes mostrado. En ficheros de texto el fin de línea se hace con una sucesión de dos caracteres, generalmente el <i>carriage return</i> CR seguido de <i>linefeed</i> LF. Entonces, si alcanzas digamos el CR, pues cierras el búfer. Pero al invocar el nuevo la función, leerá el LF y cerrará el búfer ... ¡vacío! O sea, que después de una llamada exitosa a readLinea la próxima llamada que ejecutes devolverá un búfer vacío. Para evitar eso, se bede avanzar el indicador de posición de archivo hasta no encontrar ni CR ni LF, luego de cerrar el búfer de línea.
No es necesario. Cuando se abre un archivo en modo texto (como es nuestro caso) las funciones de la biblioteca estándar convierten el carácter (o caracteres) que indican un avance de linea a '\n' de forma transparente. El proceso opuesto (convertir '\n' a lo que sea indique un avance de linea) también aplica.

Esa es una de las razones por las cuales no se recomienda el uso de fseek con streams en modo texto: no se puede garantizar que el numero de bytes coincida con el numero de caracteres.

Ya que la aproximación es leer la linea descartando el carácter '\n' la función se puede reducir a:
void readLine(FILE *in, char *line)
{
   int ch;

   while ((ch = fgetc(in)) != EOF && ch != '\n')
      *line++ = ch;
   *line = '\0';
}

Se puede mejorar bastante pasando como argumento la capacidad del array y retornando un valor útil (el numero de caracteres almacenados).

Un saludo
#488
Cita de: yoel_alejandro en  6 Febrero 2014, 00:14 AMel compilador arroja un error, en mi caso el compilador gcc de GNU que es acorde a la especificación oficial ISO/IEC 9899:1999, conocida como C99
Lo primero a considerar es el lenguaje de programación utilizado: este es C++ y por ende hay que compilar en modo C++98 o C++11.

Cita de: yoel_alejandro en  6 Febrero 2014, 00:14 AMInsisto, los enum son agrupaciones de constantes, lo cual significa que una vez declares su valor, NO lo puedes cambiar.
Me parece que aquí hay una confusión ya que eferion se refiere a modificar una variable de tipo "enum T" y, por supuesto, es correcto.

Por cierto una pagina donde se listan algunas diferencias entre las enumeraciones en C++98 y C++11 es Better types in C++11 - nullptr, enum classes (strongly typed enumerations) and cstdint.

Un saludo
#489
Cita de: SCUMM en  5 Febrero 2014, 19:47 PMresulta que he adquirido ciertos conocimientos sobre C++ y me gustaría encontrar una forma de seguir ampliando estos conocimientos, lo que domino es: Estructuras de control, Subprogramas y Datos Estructurados.
Falta la programación orientada a objetos, libros de calidad hay bastantes y si utilizas el motor de búsqueda de los foros seguro encuentras mas de una recomendación.

Un saludo
#490
No es posible utilizar la función system porque el valor de retorno de esta es de tipo int.

En MS Windows para obtener el nombre de usuario se pueden utilizar las funciones GetUserName y  GetUserNameEx.

Un saludo