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

#501
Lo primero que debes hacer es cambiar los nombres de los encabezados por los correctos: <iostream>, <cstdio> y <cstdlib>, cambiar la definición de la función main a "int main() ..." y evitar el uso de la biblioteca conio de Borland, las razones de ello en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

Un error importante se encuentra en la primera llamada a scanf: utilizas "%u" para leer un valor de tipo "signed long" y eso no es correcto, en su lugar debes utilizar "%ld".

El error principal se encuentra en la sentencia:
Código (cpp) [Seleccionar]
fprintf(eq, "\n%u %s %s", &equipo.codigoe, equipo.marca, equipo.caract);
Al utilizar "&equipo.codigoe" el programa imprimirá el mismo valor en el archivo (la dirección en memoria de ese campo).

Un saludo
#502
Eso se debe a que la matriz la destruyes al final de la función "crear_mundo", a partir de ahí ya no puedes utilizar los datos leídos del archivo (no tiene sentido).

Siguiendo lo comentado por amchacon también debes eliminar los parámetros "i" y "j", en su lugar hay que declararlos como variables locales.

La función termina así:
Código (cpp) [Seleccionar]
char crear_mundo(char** M, int f, int c, istream& a)
{
   for (int i = 0; i != f; i++)
      for (int j = 0; j != c; j++)
         a >> M[i][j];
}


Un saludo
#503
Cita de: dato000 en 23 Enero 2014, 17:45 PMNo se recomienda???, yo habia leido justo lo contrario en un libro de johanes aguilar, y ese tipo esta al nivel de Deitel...
Habría (lo digo en buen plan) que revisar esos libros con cuidado.

Lo usual cuando se utiliza la función malloc es:
p = malloc(NUM_ELEM * sizeof *p);
Donde NUM_ELEM es el numero de elementos y "sizeof *p" indica el tamaño del objeto apuntado.

Mas información en las paginas (en ingles):
7.7 Why does some code carefully cast the values returned by malloc to the pointer type being allocated?
7.7b What's wrong with casting malloc's return value?

Un saludo
#504
Cita de: dato000 en 23 Enero 2014, 17:05 PMpensaba que tenia que convertirse esa sentencia al tipo de variable al que se le tiene que reservar memoria pues malloc o calloc devuelven un valor tipo void, pero ya lo probe y  funciona, supongo que el mismo compilador realiza la conversión para evitar inconvenientes.
Depende del lenguaje.

En C no es necesaria (y no se recomienda) la conversión de un puntero de tipo "void *" al tipo apropiado.

En C++ es obligatoria la conversión pero en lugar de malloc y calloc se recomienda el uso del operador new ya que este llama al constructor del objeto y resulta en un puntero del tipo correcto.

Un saludo
#506
Cita de: sora_ori en 22 Enero 2014, 22:05 PMEstoy haciendo un programa en C que me haga con una matriz los asientos de un cine, y me ha surgido un problema tonto. Cuando asigno un asiento reservado y muestro por pantalla me aparece así:
El problema se debe a que por alguna extraña razón estas utilizando un bucle:
printf("\nEscribe la fila: ");
scanf("%d", &fila);

printf("\nEscribe la columna: ");
scanf("%d", &columna);

for (i = 0; i < fila; i++){
   for (j = 0; j < columna; j++){
      ; /* Este es el cuerpo del bucle */
   }
   /* El valor final de "j" es "columna" */
   
   if (mat[i][j] != 1){ /* Si mat[i][columna] != 1 ... */
      mat[i][j] = 1;
   }else
      printf("Asiento ocupado");
}


Basta con eliminar el bucle, quedando así:
puts("Escribe la fila:");
scanf("%d", &fila);

puts("Escribe la columna:");
scanf("%d", &columna);

if (mat[fila][columna] != 1)
   mat[i][j] = 1;
else
   puts("Asiento ocupado");


Un saludo
#507
Debes reservar un bloque para cada una de las cadenas, con esto no debes tener problemas. Ademas la dirección donde se almacena cada una ellas la debes almacenar en otro bloque.

Un ejemplo básico sin reajuste ni validaciones:
#include <stdio.h>
#include <stdlib.h>

#define MAX_CHARS  4096

int main(void)
{
   char **linea;
   int num_lineas;
   int ch;
   int i;
   
   printf("Numero de lineas: ");
   fflush(stdout);
   scanf("%d", &num_lineas);
   while ((ch = getchar()) != EOF && ch != '\n')
      ;
   
   /* Reserva del bloque de memoria principal */
   linea = malloc(num_lineas * sizeof *linea);
   
   /* Lectura de cada una de las lineas */
   for (i = 0; i < num_lineas; i++){
      /* Reserva del bloque de memoria inicial para cada linea */
      linea[i] = malloc(MAX_CHARS);
     
      printf("Introduce la linea no %d:\n", i + 1);
      fgets(linea[i], MAX_CHARS, stdin);
   }
   
   /* Impresion de cada una de las lineas */
   for (i = 0; i < num_lineas; i++)
      printf("%2d: %s", i + 1, linea[i]);
   
   /* Primero se libera la memoria de cada linea ... */
   for (i = 0; i < num_lineas; i++)
      free(linea[i]);
   /* ... a continuacion el bloque de memoria principal */
   free(linea);
   
   return EXIT_SUCCESS;
}

Se deben agregar las validaciones de las funciones de reserva de memoria así como E/S y también se debe agregar la lógica necesaria en el caso de una linea que rebase el limite (reajuste mediante realloc).

Un saludo
#508
Se debe a que faltan paréntesis y por ello las condiciones no se evalúan en el orden correcto. Ademas no debes generar los mensajes de error cuando esa operación la puedes delegar a la función perror:
#include <stdio.h>
#include <stdlib.h>

#define NOM_ENTRADA  "C:/users/robert/desktop/entrada"
#define NOM_SALIDA   "C:/users/robert/desktop/salida"

int main(void)
{
   FILE *entrada;
   FILE *salida;
   
   if ((entrada = fopen(NOM_ENTRADA, "r")) == NULL){
      perror(NOM_ENTRADA);
      return EXIT_FAILURE;
   }
   if ((salida = fopen(NOM_SALIDA, "w")) == NULL){
      perror(NOM_SALIDA);
      fclose(entrada);
      return EXIT_FAILURE;
   }
   
   /* ... */
   
   return EXIT_SUCCESS;
}


Un saludo
#509
Cita de: NOB2014 en 16 Enero 2014, 14:17 PMTengo una duda:
¿Cuando el identificador de un array puede no ser un puntero?(el apuntador constante a el primer elemento del array).-
Si me la pudieras aclarar me seria de mucha utilidad.
Los dos casos usuales son cuando este es el operando de los operadores "sizeof" y "&", el otro es cuando una cadena literal es utilizada para inicializar un array.

Un ejemplo con "sizeof" lo tienes en mi mensaje anterior y la explicación en detalle pero en ingles en la pagina 6.3 So what is meant by the ``equivalence of pointers and arrays'' in C? parte de la comp.lang.c FAQ.

Un saludo
#510
Cita de: NOB2014 en 11 Enero 2014, 18:16 PMCuando ingreso más de 3 cifras todo funciona a la perfección
Porque si introduces como mínimo cuatro caracteres, por ejemplo:
1234{ENTER}
La función fgets al estar limitada a cinco caracteres (incluyendo el '\0') almacenara los caracteres '1', '2', '3', '4' y '\0' en el array. El carácter '\n' se queda en el bufer de la entrada estándar.

Cuando se ejecuta el bucle:
while ((ch = getchar()) != '\n')
   ;

Este procesa el resto de la linea hasta encontrar el '\n', cuando eso sucede la condición es falsa y causa la terminación del bucle.

Por cierto el bucle esta mal, la variable "ch" debe ser de tipo "signed int" y se debe verificar si el resultado de getchar es EOF. Debería ser:
int ch;

/* ... */

while ((ch = getchar()) != EOF && ch != '\n')
   ;


Cita de: NOB2014 en 11 Enero 2014, 18:16 PMpero si ingreso menos de 4 el programa se queda detenido en el bucle while de limpieza de buffer de teclado
Porque en este escenario con un máximo de tres caracteres mas el avance de linea, por ejemplo:
123{ENTER}
La función fgets almacena todos los caracteres en el array. Cuando se ejecuta el bucle para descartar el resto de la linea no hay tal (por ello se debe teclear una linea adicional).

----

En cuanto al primer programa de vangodp este da la apariencia de no funcionar correctamente, se sostiene porque varios errores se cancelan mutuamente. Por ejemplo si se ejecuta e introduce:
123{ESPACIO}{ENTER}
Su salida es:
Ingrese un entero....:123


Ingresaste..: 12   -----> longitud = 3

0 para continuar otro para salir....:

Ello porque el espacio causa que el bucle donde se descarta el resto de la linea se ejecute por lo menos una ves y con ello se pierde el ultimo carácter.

En ese programa se debe considerar que los especificadores "%s" y "%d" descartan el espacio blanco (espacio, tabulador, etc.) y por ello los bucles de soporte no son necesarios. El programa se puede reducir a:
#include <stdio.h>

int main(void)
{
   char palabra[7];
   int ok;
   
   do {
      puts("Introduce una palabra:");
      if (scanf("%s", palabra) != 1)
         break;
      printf("Ingresaste: %s\n", palabra);
     
      puts("0 para continuar otro para salir:");
   }while (scanf("%d" , &ok) == 1 && ok == 0);
   
   return 0;
}

Sin embargo "%s" se debe evitar ya que tiene el mismo defecto que la función gets (mejor utilizar "%Ns" o bien fgets).

Un saludo