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

#301
Otra opción es verificar la documentación del compilador para conocer que características del nuevo estándar C11 están implementadas (una de ellas son los hilos). Una pagina (en ingles) sobre el tema es Multi-Threading support in c11.

Un saludo
#302
Los errores en el programa son dos.

1) Para leer con scanf un numero de punto flotante y almacenarlo en una variable de tipo double debes utilizar el especificador "%lf", de esta forma:
printf("Introduce un valor para y2:");
scanf("%lf", &y2);
printf("El valor de f es: %f\n", y2);


2) Cuando scanf se utiliza para leer un carácter ella retorna el primero que encuentra en el bufer de la entrada estándar y en tu caso es el '\n' o avance de linea de (valga la redundancia) la linea anterior. Para descartar ese carácter y leer el siguiente debes utilizar:
printf("Introduce un caracter para z:");
scanf(" %c", &z);
printf("El valor de z es: %c\n",z);


Y por favor la próxima vez que tengas una duda o problema con un programa en lenguaje C utiliza el foro apropiado: Programación C/C++.

Un saludo
#303
Programación C/C++ / Re: juego memoria en c++
14 Junio 2014, 17:09 PM
Cita de: jperez2016 en 14 Junio 2014, 03:47 AMTengo un problema, cuando ingreso una letra en el jugador entro en un loop infinito.
Cuando tengas una duda o problema con uno de tus programas por favor publica el código fuente completo.

En el fragmento que publicas la segunda lectura (cuando el valor de "jug" es diferente de 1 y 2) es innecesaria y deberías evitar el uso de la biblioteca conio de Borland, mas información en la pagina |Lo que no hay que hacer en C/C++. Nivel basico|

Un saludo
#304
Solo para redondear el tema:

1) Cuando se declara un array se indica el numero de elementos y se accede a ellos mediante los indices 0 .. N-1 ya que en C los indices inician en cero. Con esta declaración:
char *a[2];
Declaras un array de dos elementos y se accede a ellos mediante los indices 0 y 1, al utilizar en el programa "a[2]" este puede reventar (comportamiento no definido).

2) No tiene caso (ya que no hay validaciones) almacenar el valor de retorno de la función gets ya que esta retorna el argumento pasado o bien NULL en caso de error.

3) No se recomienda el uso de gets, si apenas empiezas tu aprendizaje del lenguaje C por favor lee el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

Un saludo
#305
Programación C/C++ / Re: bug en mi codigo
11 Junio 2014, 03:37 AM
Cita de: m@o_614 en  9 Junio 2014, 22:52 PMno se bien cual podria ser la causa de que cada vez que cuando el  codigo llega a esta función para ejecutarla a veces me truena y otras no.
En mi opinión la causa mas probable es la indicada por eferion, otro escenario donde la función puede reventar se da si el total de caracteres a procesar es impar, en ese caso el bucle principal eventualmente procesara el carácter siguiente al '\0'.

Cita de: m@o_614 en  9 Junio 2014, 22:52 PMno se si  el sprintf y el strcat sean la mejor opcion para usarlos en la función
Con todo respeto no son, ni de lejos, las mejores opciones. Eso ya lo había comentado en varios de tus temas.

Para el caso es mejor utilizar aritmética de punteros y sscanf para leer cada uno de los bytes (base 16, dos dígitos). Un ejemplo sin las validaciones recomendadas (de malloc y sscanf):
unsigned char chk(char *lon, char *dir, char *cod)
{
   size_t nb = strlen(lon) + strlen(dir) + strlen(cod);
   size_t i;
   
   char *p = malloc(nb + 1);
   unsigned total = 0;
   unsigned byte;
   
   sprintf(p, "%s%s%s", lon, dir, cod);
   for (i = 0; i < nb; i += 2){
      sscanf(p + i, "%2x", &byte);
      total += byte;
   }
   
   return ~total & 0xFF;
}

El tipo de retorno es unsigned char para evitar la reserva de memoria.

Tal vez se pueda mejorar pero ello depende de cierta información que no provees, por ejemplo si el numero de caracteres de cada cadena esta garantizado a ser par se puede evitar la reserva de memoria (mediante malloc) y en su lugar utilizar un array de punteros y dos bucles anidados.

Un saludo
#306
Cita de: MessageBoxA en 10 Junio 2014, 04:06 AMhice unas modificaciones. dejo el codigo para que si ven que tiene algun bugs escondido me lo hagan saber.
Hay algunas partes que se pueden mejorar.

* No tiene caso almacenar dos valores de forma consecutiva en una variable, la primera asignacion (para ser preciso inicializacion) sobra:
int k=0; /* 1 */

scanf("%d",&k); /* 2 */

En su lugar hay que verificar que la lectura sea exitosa (mediante el valor de retorno de la funcion) y que el numero este en el rango valido.

* Declarar un array cuyo numero de elementos se calcula en tiempo de ejecucion:
scanf("%d",&k);

/* ... */

datos datos_estruct[k];

Solo esta garantizado en el estandar C99, una opcion sin ese problema es el uso de malloc para reservar el bloque de memoria.

* Ya que todos los campos de la estructura son arrays de caracteres no es necesario utilizar el operador "direccion de" (el '&') en las llamadas a scanf y fprintf.

* scanf con el especificador "%s" tiene el mismo problema que gets (no se limita la lectura de caracteres) en su lugar es mejor utilizar fgets o scanf con "%Ns" donde "N" es la capacidad del array de caracteres (menos uno).

Un saludo
#307
Hay que realizar una cantidad importante de cambios al programa. Comentarios:

* No es necesario incluir los encabezados <windows.h> y "fcntl.h" en el programa, eliminalos.

* Se debe evitar el uso de fflush(stdin) y las funciones como getch parte de la biblioteca conio de Borland. Mas información en la pagina |Lo que no hay que hacer en C/C++. Nivel basico|.

* Evita macros como esta:
#define PRS(x) printf ("%s\n",x)
Ya que no facilitan la lectura del código fuente, en su lugar utiliza printf directamente.

* Salvo "nouTreballador" en todas las funciones falta el valor de retorno y ya que este no se utiliza deberías cambiar los prototipos indicando que el tipo de retorno es void.

* También debes indicar que las funciones (salvo una) no reciben argumentos mediante la palabra reservada void entre paréntesis:
int nouTreballador(void);
int GravarDades(int num_regs);
int mostrarTreballadors(void);
int modificarDades(void);
int ficheroLog(void);

No debes utilizar "()" ya que ello indica un numero no determinado de argumentos

* En la función main al pedir la opción:
printf("Escoge una opcion: ",opc);
scanf("%d",&opc);

En la llamada a printf el segundo argumento "opc" y la coma antes de este están de mas, eliminalos.

* En la misma función las variables "continua", "i" y "dadesVector" no se utilizan, eliminalas.

* En la definición de la función "GravarDades" falta indicar el tipo del parámetro.

* El error que mencionas se genera (supongo ya que no puedo ejecutar tu programa) en la función "mostrarTreballadors", en ella tienes un error lógico (la falta de llaves para indicar el cuerpo del bucle):
int mostrarTreballadors(void)
{
   treballadors treb;
   system("cls");
   FILE *fp;
   
   if ((fp = fopen ("treballador.dat","rb")) == NULL){
      puts("\nNo puc obrir l'arxiu clubs.dat");
      system("pause");
   }else {
      /* bucle */
      while (fread (&treb, mida, 1, fp) == 1)
         printf("______________________________________________________________________________\n\n");
      /* bucle */
     
      printf("TRABAJ.\tCLIENTE\t   DNI  \tANYO\tCATEGORIA\tSUELDO\n");
      printf("______________________________________________________________________________\n");
      printf("\n%s \t%s \t %i \t%i \t%s   \t%i ", treb.nomTreballador, treb.cognomClient, treb.dni, treb.any, reb.categoria, treb.sou);
     
      printf("\n_____________________________________________________________________________\n");
      printf("\n\n\nEstos son todos los trabajadores leidos del fichero treballador.dat");
      getch();
      fclose(fp);
   }
}


* La variable "mida" la declaras en dos ocasiones una de forma "global" al inicio del programa y otra vez con el mismo valor en la función "modificarDades", hay que eliminar esta ultima.

* En la misma función no es necesario utilizar strlen para conocer si la cadena almacenada es una cadena vacía, en su lugar basta con verificar si el primer elemento de la cadena es '\0'.

* Algunos mas ...

Un saludo
#308
Cuando tengas una duda con uno de tus programas por favor publica el código fuente de este, la idea es demostrar un esfuerzo significativo. De no hacerlo el tema puede ser cerrado si se considera que es una petición de código fuente "en bandeja".

También debes indicar el lenguaje de programación ya que la aproximación a tomar depende de este.

En el caso de C ...

----

El programa que comentas es relativamente fácil, la parte mas complicada es buscar el primer y ultimo carácter que cumplan con el criterio indicado, para ello hay varias aproximaciones (por ejemplo una sentencia de selección switch, funciones parte de la biblioteca estándar de C como strcspn o sscanf, etc.).

Una forma sencilla consiste en utilizar la función strchr en la forma strchr("set", caracter) para conocer si el carácter en cuestión forma parte del set (conjunto) indicado.

Un ejemplo del uso de esa función para encontrar la primera y ultima vocal de una cadena es:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
   char *linea = "sta es solo una cadena de pruebA";
   int i;
   int j;
   int k;
   
   j = -1; /* centinela */
   for (i = 0; linea[i] != '\0'; i++)
      if (strchr("aeiouAEIOU", linea[i]) != NULL){
         if (j == -1)
            j = i;
         k = i;
      }
   
   if (j != -1)
      printf("Primera y ultima vocal: %c, %c\n", linea[j], linea[k]);
   
   return EXIT_SUCCESS;
}


Con el resto (analizar las dos cadenas y realizar el intercambio si aplica) no debes tener problemas.

Un saludo
#309
Con solo ese fragmento no es posible conocer donde se genera el error, hay que revisar todo el código fuente en particular las otras funciones que acceden al archivo (por ejemplo donde se crea y escribe en el).

En cuanto a la función "mostrarTreballadors" falta indicar el valor de retorno (si no piensas utilizarlo hay que cambiar este a void) y algunos detalles todos ellos menores.

Un saludo
#310
Cita de: Juan821 en  5 Junio 2014, 04:19 AMPero cuando lo hago asi me aparece el error de compilacion ya lo intente
Pues habra que revisar tu codigo fuente actualizado ya que las indicaciones de Drewermerc deben solucionar el problema siempre y cuando las apliques correctamente.

Explicando un poco mas a detalle el problema se genera en los casos de (la sentencia condicional) switch:
Código (cpp) [Seleccionar]
switch (s) {
case 1: {
   int His();
   break;
}
case 2: {
   int Cien();
   break;
}
case 3: {
   int Depor();
   break;
}
case 4: {
   int Geo();
   break;
}
}

El detalle ahí es que no estas llamando a las funciones, las estas declarando.

Para solucionarlo se debe cambiar a:
Código (cpp) [Seleccionar]
// Las funciones no requieren de argumentos
int His();
int Cien();
int Depor();
int Geo();

// ...

switch (s){
case 1:
   His();
   break;
case 2:
   Cien();
   break;
case 3:
   Depor();
   break;
case 4:
   Geo();
   break;
}


Otras partes que se deben modificar en el programa son:

* Utilizar el nombre correcto de los encabezados en C++: <cstdlib> y <ctime>, el encabezado <stdio.h> no es necesario en el programa y su directiva de inclusión debe eliminarse.

* Evitar el uso de la biblioteca conio de Borland, mas información en la pagina |Lo que no hay que hacer en C/C++. Nivel basico|.

* La llamada a srand hay que colocarla justo al principio de la función main pero fuera del bucle.

* No es necesaria la variable "s" ya que puedes utilizar la expresión "rand() % 4 + 1" directamente para controlar la rama de ejecución en el condicional:
Código (cpp) [Seleccionar]
switch (rand() % 4 + 1){
// ...


Un saludo