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

#201
Hola, gracias a ambos por las respuestas, muy esclarecedoras por cierto. -
Una cosita más, la memoria asignada a la pila y el montón es monitoreada por el SO, hay alguna manera con C saber cuanta memoria se le asigna a estas 2 areas de memoria de un determinado programa(cuantos bytes). -

CitarLos arrays y las tablas són siempre más eficientes, pues son datos que se guardan en la pila y el código que se genera para acceder a ellos es más rápido que acceder el montón. Por otra parte la memoria de la pila es bastante más limitada, en tamaño que la del montón y para un gran número de elementos te podrías quedar sin pila de programa rápidamente.
No hay contradicciones en esta descripción, digo.



Saludos.
#202
Hola a todos.
Copie el código de la siguiente página que me indico Eternal Idol, referente a realloc:
http://www.cplusplus.com/reference/cstdlib/realloc/

Y grande fue mi sorpresa cuando descubrí que utilizando memoria dinámica se podía hacer lo mismo que con un array, digo sorpresa porque considero haber leído bastante sobre punteros y en ninguno hace referencia a esto. -
Si esto es correcto, tengo 1 pregunta para hacerles. -
¿Que es más eficiente, utilizar array o memoria dinámica?, para el caso. -  

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

int main ( void ){
size_t ingresos, n, contador = 0, ok, ch;
int* numeros = NULL;
int* mas_numeros = NULL;

do{
do{
printf("\n Ingresa un numero entero(maximo %d  => 0 finaliza )....: ", INT_MAX);
ok = scanf("%u", &ingresos) == 1 && ingresos >= 0 && ingresos <= INT_MAX;
while( (ch = getchar()) != EOF && ch != '\n' );
if( ok == 0 ){
printf( "\n El ingreso es incorrecto, intentelo nuevamente...\n\n\t Pulse una tecla para continuar..." ); getchar();
}
}while(!ok);

contador++;

mas_numeros = (int*)realloc( numeros, contador * sizeof(int) );

if( mas_numeros!=NULL ){
numeros=mas_numeros;
numeros[contador-1]=ingresos;
}
else{
free( numeros );
puts( "Error (re)allocating memory" );
exit(1);
}
}while (ingresos!=0);

printf ("\n Numeros introducidos.....: ");
for( n=0; n < contador - 1; n++ )
printf( "%d ",numeros[n] );

free (numeros);

return 0;
}


Es redundante decir que al código original le efectué bastante modificaciones, pero la esencia es la misma.

Saludos.
#203
Hola y que tengan un muy buen día.
Voy a intentar un resumen, lo que este equivocado, por favor, corríjanlo. -
Con liberar la memoria de string2, es suficiente dado que de string1 se encarga realloc, si no es el fin del programa deberíamos igualar los punteros string1 y string 2 a NULL. -
En el futuro voy a hacer preguntas más interesante, me agrada cuando participa el "jefe". -

Muchas gracias a todos y un abrazo.
#204
En definitiva, lo que pregunte parecería que tendría una respuesta obvia, solo que quería estar más seguro teniendo la palabras de Uds. los expertos.-
AlbertoBSD, gracias nuevamente.

Un abrazo.
#205
Muchas gracias a los 3 por ocuparse, si entendí bien con hacer free(string2) es suficiente. -
Al releer el tema en un momento dice que si string2 es menor a string1 el administrador del montón tratara de utilizar la misma dirección de memoria y como pude comprobar con este programa la dirección de  string1 es la misma que string2, ¿esto es correcto? o interprete mal. -
Geeke, lo tuyo es lo único que no me queda claro. -

Saludos.
#206
Hola, gente. -
¿Es necesario liberar los 2 punteros por separado?, como lo hago en el código que dejo a continuación o es suficiente con liberar el puntero que devuelve malloc (tengo claro que malloc retorna un puntero void). -

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main( void ){
char *string1, *string2;
string1 = (char*) malloc(16);
strcpy(string1, "0123456789AB");

string2 = realloc(string1, 8);
printf("string1 Valor: %p [%s]\n", string1, string1);
printf("string2 Valor: %p [%s]\n", string2, string2);


free(string1);
free(string2);

return 0;
}


Bueno es todo, espero aclaración.
Un abrazo.
#207
Hola.
Si sirve de algo dejo la manera que yo utilizo para lograr más o menos lo mismo. -

#include <stdio.h>
#include <string.h>

int main( void ){
char a[5], *p = NULL;
size_t ch;

printf( "\n Ingrese una frase...:" );
fgets( a, 5, stdin );
if((p=strchr(a, '\n'))){
*p='\0';
}
else{
while((ch = getchar()) !='\n' && ch!=EOF);
}

printf("\n %s", a);

return 0;
}






Saludos.
#208
Hola, Geeke.
Muchas gracias por el aporte, te voy a hacer una confesión, no tengo la más pálida idea del inglés y lo estoy traduciendo utilizando 4 traductores en línea (la tradución que me parece más acertada la paso a un borrador para estudiarlo luego) y como te imaginaras por momento entre la traducción que no es exacta y las ganas de disipar mis dudas ocurren estas cosas. -
Lo de no saber nada del idioma es por mis 64 años, en mis tiempos de estudio casi no se le daba importancia al inglés, pero como todos en los foros (cuando se da la oportunidad) me dicen que los mejores contenidos están en ese idioma, bueno estoy asiendo el esfuerzo.

Te envio un abrazo.
#209
MAFUS, no seas tan duro con mi manual, es interesantisimo.-



Saludos.
#210
Hola, MAFUS. -
Por favor y antes de que tenga que hacer meditación para tranquilizarme, ¿que tiene que ver mi programas con los archivos?

FILE *f = fopen(ruta, modo);

CitarEn verdad no sé que manual estás siguiendo pero tíralo.
jajajajajajajajaja.....

No obstante, ya descubrí por donde viene la mano: