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

#681
Otros dos comentarios:

* En C no es necesario ni se recomienda la conversión explicita al llamar a las funciones calloc, malloc o realloc (para el caso cualquiera que retorne un valor de tipo "void *") ya que esa conversión es automática.

* El programa revienta después de crear la lista cuando se trata de agregar un nodo con la función "insertar_detras".

1) Después de crear la lista el valor de los campos last y pdi de la variable *l es el mismo, apuntan al mismo objeto (ultimo nodo en la lista).

2) Las lineas que causan el "Segmentation fault" son dos:
temporal->next = l->pdi->next;
/*
** l->pdi y l->last apuntan al mismo nodo, el ultimo. Su campo
** "next" es igual a NULL por razones obvias. El punto clave aqui
** es: temporal->next es NULL
*/

l->pdi->next = temporal; /* No impacta */

temporal->next->prev = temporal;
/*
** temporal->next->prev ==> NULL->prev ==> el error que mencionas
*/


Un saludo
#682
Programación C/C++ / Re: problema con getc()
27 Septiembre 2013, 03:05 AM
Problemas con el programa hay dos:

1) Cuando abres un archivo en modo texto no debes utilizar la función fseek para calcular su tamaño (numero de caracteres). En su lugar para procesar cada uno de los caracteres en el archivo puedes utilizar un bucle como este:
FILE *entrada;
int ch;

/* apertura del archivo */

while ((ch = fgetc(entrada)) != EOF){
   /* ... */
}


2) El valor de retorno de las funciones getchar, getc y fgetc es de tipo int.

----

El error que mencionas se genera en esta parte del programa:
if((car = fgetc(fd))== 'd');
   cont++;

Revisa el fragmento con cuidado, lo solucionas en cuestión de minutos.

Un saludo
#683
Programación C/C++ / Re: problema con sprintf()
25 Septiembre 2013, 19:30 PM
La función fgets lee una linea y la almacena incluyendo el avance de linea en la dirección indicada. Para solucionarlo solo tienes que eliminar ese carácter. Para ello puedes utilizar la función strchr (prototipo en <string.h>), de esta forma:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 100

int main(void)
{
   FILE *fd;
   char nombre[MAX];
   char archivo[MAX];
   char *p;
   
   printf("Dame el nombre del archivo: ");
   fflush(stdout);
   if (fgets(nombre, MAX, stdin) == NULL)
      return EXIT_FAILURE;
   if ((p = strchr(nombre, '\n')) != NULL)
      *p = '\0';
   
   sprintf(archivo,"%s.txt",nombre);
   if((fd = fopen(archivo,"r")) != NULL){
      puts("Si se pudo abrir archivo");
      fclose(fd);
   }else {
      perror(nombre);
      return EXIT_FAILURE;
   }
   
   return EXIT_SUCCESS;
}

La llamada a sprintf la debes modificar, ello depende de donde se encuentre (en tu caso, por supuesto) el archivo.

Un saludo
#684
Cita de: m@o_614 en 22 Septiembre 2013, 19:33 PMcon respecto al feof no tengo idea de que otra manera sustituirlo.
Solo tienes que verificar el valor de retorno de la función de entrada/salida, casi todas retornan un valor particular en caso de error o fin de archivo.

En el caso de fscanf esta retorna el numero de conversiones realizadas con exito o EOF en caso de error o fin de archivo, tu bucle:
i = 0;
while(!feof(entrada))
{
   fscanf(entrada,"%d",&arreglo[i]);
   i++;
}

Realiza una iteración de mas y es demasiado largo. Utilizando el valor de retorno de fscanf se puede reducir a:
for (i = 0; i < n && fscanf(entrada, "%d", arreglo + i) == 1; i++)
   ;

Se debe realizar la verificación "i < n" para asegurarnos de no leer mas de lo que se puede almacenar en el bloque de memoria.

Cita de: m@o_614 en 22 Septiembre 2013, 19:33 PMle hice unos cambios al codigo para que en vez de que me imprimiera el vector ordenado en el archivo me imprima el numero de intercambios que se hacen en el metodo de ordenamiento pero me imprime una cantidad que no es en un arreglo  desordenado me dice que solo necesita un intercambio
Si el archivo de entrada es correcto (texto plano) el programa da los resultados esperados, eso lo debes verificar en tu PC.

Un saludo
#685
Programación C/C++ / Re: serie de numeros en fichero
24 Septiembre 2013, 06:14 AM
Cita de: m@o_614 en 23 Septiembre 2013, 22:37 PMtengo el siguiente codigo que mediante un for me tiene que imprimir 1000 numeros inversamente ordenados en un archivo con el mismo nombre, el problema es que me imprime basura en el archivo y no tengo idea de por que??
Como ya te comento eferion el texto en el archivo, si lo abres con un editor de texto, es ilegible porque la función fwrite imprime sin formato: se envía al archivo la secuencia de bytes tal cual están en memoria.

Cuando utilizas fwrite para escribir en el archivo debes utilizar fread para leer de nuevo los valores:
#include <stdio.h>
#include <stdlib.h>

#define NOM_ARCHIVO  "Entrada.txt"
#define MAX  5

int main(void)
{
   FILE *stream;
   int i;
   
   if ((stream = fopen(NOM_ARCHIVO, "wb")) != NULL){
      for (i = MAX; i > 0; i--)
         fwrite(&i, sizeof(int), 1, stream);
      fclose(stream);
     
      if ((stream = fopen(NOM_ARCHIVO, "rb")) != NULL){
         while (fread(&i, sizeof(int), 1, stream) == 1)
            printf("%d\n", i);
         fclose(stream);
      }else {
         perror(NOM_ARCHIVO);
         return EXIT_FAILURE;
      }
   }else {
      perror(NOM_ARCHIVO);
      return EXIT_FAILURE;
   }
   
   return EXIT_SUCCESS;
}


O bien puedes utilizar fprintf para enviar al archivo los valores como texto con formato, en ese caso la lectura la realizas con fgets, fscanf, etc., dependiendo de los datos enviados.

Un saludo
#686
Si todos lo campos tienen la misma longitud no es necesario el separador (la coma), si se elimina el contenido del archivo seria:
000000000000000000000000000000
000000000000000000000000000000
000000000000000000000000000000
000000000000000000000000000000
000000000000000000000000000000
111111111111111111111111111111
111111111111111111111111111111
111111111111111111111111111111
111111111111111111111111111111
111111111111111111111111111111

Y la lectura del archivo se podría realizar utilizando un vector y un bucle:
Código (cpp) [Seleccionar]
ifstream in;
vector<string> linea;
string aux;

// Apertura del archivo

while (getline(in, aux))
   linea.push_back(aux);
in.close();


Y si se debe almacenar la información en un array de arrays de caracteres la lectura que haces:
Código (cpp) [Seleccionar]
char mapa[worldWidth][worldHeight];
int x = 0, y = 0;
char c;

while(fstr.good())
{
   c = fstr.get();
   if (int(c) != -1 && c!= ',' && c!= '\n') {
       mapa[x][y] = c;
       x++;
   }
   if (c=='\n')
   {
       x = 0;
       y++;
   }
}

Tiene dos errores: almacenar el valor de retorno de get en una variable de tipo char cuando debería ser de tipo int y asumir que el valor de EOF es -1 (lo usual pero no esta garantizado).

Seria mejor cambiar ese fragmento utilizando otra versión de la función get:
Código (cpp) [Seleccionar]
char mapa[worldWidth][worldHeight];
int x = 0, y = 0;
char c;

while (fstr.get(c))
   if (c == '\n'){
      x = 0;
      y++;
   }else if (c != ','){
      mapa[x][y] = c;
      x++;
   }


Un saludo
#687
Sin animo de molestar pero ya en varias ocasiones te he indicado que:
1) No es necesario incluir el encabezado <unistd.h>.
2) No se debe utilizar la función feof para controlar un bucle.

Revisando el programa un error se encuentra en la función:
void Ordenacion_Burbuja(long v[], long n, FILE *fd)
{
   /* ... */
   
   fwrite(v, sizeof(int), n, fd);
}

Ahí indicas que el tamaño del elemento es igual a "sizeof(int)" cuando debería ser "sizeof(long)".

Ademas de eso por alguna extraña razón lees los numeros con fscanf (texto con formato) y los escribes con fwrite (bytes "crudos"). Deberías utilizar el mismo modo (de preferencia texto con formato) y publicar ejemplos de los archivos de entrada y salida.

Un saludo
#688
Falta la llamada a fstat.

Si los valores que se imprimen no son los esperados ello puede deberse a tipos incorrectos en las llamadas a printf, debes verificar cual es el tipo de los alias gid_t, uid_t, etc.

Un saludo
#689
Programación C/C++ / Re: Operadores de asignación.
21 Septiembre 2013, 21:03 PM
Toda variable local (definida dentro de un bloque y sin el calificador "static") inicia con el valor indicado en su declaración, si esto se omite el valor inicial sera no definido o basura:
int main(void)
{
   int i = 7; /* valor inicial es ... */
   int j;     /* valor inicial no definido o basura */

   return 0;
}


Lo usual con variables utilizadas para calcular un total es inicializarlas a cero:
int total = 0;

/* ... */

total += y; /* Equivalente a "total = total + y" */

Ya que de no hacerlo la variable iniciaría con solo Dios sabe que valor y la expresión "total + y" no daría el resultado esperado.

Un saludo
#690
Cita de: m@o_614 en 20 Septiembre 2013, 02:27 AMel profesor me dijo que tengo que utilizar archivos ordenados, inversamente ordenados y aleatorios, de 10, 100,1000,10000,100000,1'000,000, y ps como las cantidades son tan grandes no puedo ingresarle numero por numero y como son ordenadas y no solo aleatorias no puedo usar el rand(),voy a tener que usar archivos, pero yo todavia estoy muy verde en eso.
Es fácil, para abrir el archivo:
FILE *salida;

/* ... */

if ((salida = fopen(NOM_SALIDA, "wt")) == NULL){
   /* Manejo de error */
}


El siguiente paso es enviar los datos al archivo mediante un bucle, las tres opciones son:
/* A) Se imprime la serie 0 .. MAX-1 en el archivo */
for (i = 0; i < MAX; i++)
   fprintf(salida, "%d\n", i);

/* B) Se imprime la serie MAX-1 .. 0 en el archivo */
i = MAX;
while (i > 0){
   i--;
   
   fprintf(salida, "%d\n", i);
}

/* C) Se imprimen valores aleatorios en el archivo */
for (i = 0; i < MAX; i++)
   fprintf(salida, "%d\n", rand());


El ultimo paso es simplemente cerrar el archivo.


Cita de: m@o_614 en 20 Septiembre 2013, 02:27 AMCreo que la cosa va mas o menos asi:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

typedef struct
{
    int numero;
}Arreglo;

void Ordenacion_Burbuja(int v[],int n);

int main()
{
    FILE *fd;
    Arreglo arreglo[5];
    if((fd = fopen("F:\\Analisis_algoritmos","r"))!=NULL)
    {
        Ordenacion_Burbuja(arreglo,5);
        Ordenacion_Burbuja(arreglo,10);
        Ordenacion_Burbuja(arreglo,100);
        Ordenacion_Burbuja(arreglo,1000);
        Ordenacion_Burbuja(arreglo,10000);
        Ordenacion_Burbuja(arreglo,100000);
        Ordenacion_Burbuja(arreglo,1000000);
    }
    return 0;
}
Ese programa no va a funcionar ya que tiene varios errores, algunos de ellos graves. Por ejemplo declaras una estructura con un solo campo lo que no tiene caso, declaras un array de estructuras pero la función espera un array de enteros (tipo int), declaras un array de 5 elementos pero tratas de utilizarlo para procesar mas números de los que puede almacenar, no es necesario incluir el encabezado <unistd.h>, etc.

Un saludo