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

#11
En el scanf usaste & (ampersand) y colocaste cad , eso esta mal. El nombre de un array es puntero que apunta al primer elemento del array (es una direccion de memoria). scanf trabaja con direcciones de memoria , no necesitas anteponerle el ampersand. Eso puede generar errores graves. No te estas refiriendo a la cadena cuando antepones el ampersand.
Saludos !!! suerte!
#13
Muchas veces algunos antivirus detectan ciertos virus que otros no... En toda la red dicen que al funcionar 2 antivirus en simultaneo la pc puede dejar de funcionar debido a que estos se combaten... pero si tengo 20 antivirus en la maquina y solo activo uno. En caso de que mi pc se vuelva lenta y el antivirus que tengo activado no pueda solucionarlo, hago analisis con los demas siempre activando solo uno...No creo que algun virus pueda escapar a tal cantidad de antivirus....
#14
Buen dia comunidad! Estoy tratando de imprimir un numero LONG DOUBLE pero ningun especificador lo hace. Probe con "%LF" y "%Lf" pero no hay caso... Alguno sabe cual es?
#15
Muchas gracias a todos !! tema resuelto!! Saludos!!!
#16
Cita de: MAFUS en  2 Junio 2018, 14:40 PM
Línea 47. ¿Para qué liberas movie? Lo sigues necesitando una vez fuera de la función.
Línea 29. El argumento de x debería ser un puntero a puntero ya que realloc te puede reasignar la dirección del array dinámico. Si pasas solo el puntero éste será copiado, debido a que los argumentos se pasan por valor, y aunque se modifique cuándo salgas de la función no verás ese cambio.
Hola muchisimas gracias ppr tu respuesta,ya pude resolver el problema,pero quisiera saber mas acerca del por que no se puede  pasar solo el puntero. Osea si haces realloc reservas mas espacio en memoria,por que los datos deaaparecen??? Podrias ser mas especiico
#17
Ya le agregue las etiquetas, el define no sirve, en realidad esto trbajaba con archivos y debido al problema que me genera realloc reduci el codigo para mostrarlo.
#18
Hola gente estoy volviendome loco con  realloc.... Veo que corrompe datos.. Declare una estructura, luego cree un puntero dinamico a ella con malloc. El problema es que si yo paso el puntero a una funcion y en la funcion hago realloc del puntero los datos se corrompen.... por que???????????? Por que si uso realloc con un dato que no es de la funcion mi programa funciona mal¨???

Ejemplo:



#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define MOVFILE "movies.bin"


typedef struct
{
   char titulo[50];
   int duracion;

} eMovie ;

int x(eMovie* movie);
void y(eMovie* movie, int tam);

int main()
{

   eMovie* movies = (eMovie*) malloc(sizeof(eMovie));
   int index = x(movies);
   index++;
   y(movies,index);
   free(movies);
   return 0;
}


int x(eMovie* movie)
{
   int salir = 0;
   int moves = 0;
   while(salir != 27)
   {
       printf("\nTITULO: ");
       scanf("%s", (movie + moves)->titulo);
       printf("\nDURACION: ");
       scanf("%d", &(movie + moves)->duracion);
       printf("SALIR? esc:");
       salir = getche();
       if(salir != 27)
       {
           moves++;
           movie =(eMovie*) realloc(movie,sizeof(eMovie)*(moves+1) );
       }
   }
   free(movie);
   return moves;
}

void y(eMovie* movie, int tam)
{
   for(int i = 0; i < tam; i++)
   {
       printf("\n\nTITULO: %s\n", (movie + i)->titulo);
       printf("DURACION: %d\n", (movie + i)->duracion);
   }
}


Como ven el puntero a movie se pasa a una funcion y alli se hace el realloc pruebenlo, el string se cambia... Al imprimirse...
#19
//El problema fue solucionado!!!! ya l oencontre era la variable moves
Hola gente estoy haciendo un codigo que reserva memoria dinamica y guarda la direccion del primer elemento en un puntero a estructura. Luego se abre o genera un archivo. Cargo un dato al puntero y lo escribo en el archivo.  El archivo se genera correctamente pero al cargar el dato al puntero , este se guarda en MAIN pero por alguna razon extraña al entrar a una funcion para gaurdar datos en archivo LOS DATOS DEL PUNTERO SE CONVIERTEN EN BASURA.
Miren les muestro el codigo a ver si alguien descubre el error:


//DECLARACIONES



typedef struct
{

   char title[50];
   int duracion;

} eMovies;



//MAIN

   int quantity = 1;
   int value;
   int moves = 0;
   eMovies* movies;
   movies = newMovie(); // FUNCION 1
   if( movies == NULL)
   {
       printf("ERROR INICIAL");
       system("pause");
       exit(1);
   }
   value = loadMovies(movies,&quantity,"movies.bin"); //FUNCION 2
   if( !value )
   {
       printf("ERROR");
       system("pause");
       exit(1);
   }
   while(moves < quantity)
   {
       printf("El titulo es %d y la duracion es %s\n\n", (movies + moves)->duracion,(movies + moves)->title ); //imprimo la basura de la estructura
       system("pause");
       moves++;
   }


   printf("quantity es %d\n\n",quantity); //MUESTRO LA VARIABLE
   system("pause");
   printf("Ingrese titulo: ");
   scanf("%s", (movies + moves)->title ); //SUSTITUYO LA BASURA POR UN STRING
   setbuf(stdin, NULL);
   printf("\nIngrese duracion: ");
   scanf("%d", &(movies + moves)->duracion ); //SUSTITUYO LA BASURA POR UN INT
   setbuf(stdin, NULL);
   printf("%s", (movies + moves)->title); //EL STRING GUARDAO SE VE CORRECTAMEN
   printf("%p",movies); //LA DIRECCION SE IMPRIME llamenla 0f455f
   printf("Datos cargados en la estructura.\n");
   system("pause");

   saveMovies(movies,"movies.bin"); //FUNCION 3 ERROR ALLI
   free(movies);

   return 0;

------------------------

FUNCION 1

eMovies* newMovie(void)
{
   eMovies* movie;
   movie = malloc(sizeof(eMovies));
   return movie;
}


FUNCION 2


int loadMovies(eMovies* movies, int* quantity , char* filename)
{
   FILE* file;
   eMovies* aux;
   int verify = 1;
   int moves = 0;
   int writed;

   file = fopen(filename,"rb");
   if(file == NULL)
   {
       file = fopen(filename, "wb");
       if(file == NULL )
       {
           verify = 0;
       }
   }
   else
   {
       while( !feof(file) )
       {
           writed = fread(movies + moves,sizeof(eMovies),1,file );
           if(writed != 1)
           {
               if( feof(file) )
               {
                   break;
               }
               else
               {
                   verify = 0;
                   break;
               }
           }

           moves++;
           if( moves >= *quantity )
           {
               aux =(eMovies*) realloc(movies,sizeof(eMovies)*(moves+1) );
               if(aux == NULL)
               {
                   verify = 0;
                   break;
               }
               movies = aux;
               *quantity = moves+1;
           }
       }

   }
   fclose(file);
   return verify;
}

FUNCION 3 LA PROBLEMATICA

int saveMovies(eMovies* movies, char* filename)
{
   int verify = 1;
   int moves = 0;
   int readings;
   FILE* file;
   printf("\nDireccion de memoria de title: %p\n", movies->title);
//LA DIRECCION IMPRESA ES LA MISMA DEL MAIN, ESO ES CORRECTO

   printf("\n %s", movies, (movies)->title );
//SE MUESTRA BASURA... EL DATO CARGADO EN EL MAIN YA NO ESTA OSEA WTF!!!!
   scanf("%s", movies->title );
   printf("\ndir %p, %s", movies, (movies)->title );
//MAS BASURA
   system("pause");
   file = fopen(filename,"wb");
   if(file == NULL)
   {
       verify = 0;
   }
   else
   {
       while( !feof(file) )
       {
           readings = fwrite(movies + moves,sizeof(eMovies),1,file);
//ESCRIBE BASURA Y SE CUELGA EL PROGRAMA.........
           if(readings != 1)
           {
               if( feof(file) )
               {
                   break;
               }
               else
               {
                   verify = 0;
                   break;
               }
           }
           moves++;
       }
   }
   fclose(file);
   return verify;

}
#20
Me respondieron mi duda en un chat de programacion. Por si alguien tambien necesitaba saberlo, se puede obtener el minimo valor de un flotante con la constante FLT_MIN y para poder verlo hace falta un printf con %.126f . El numero se compone de esa gigantesca cantidad de decimales.