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

#161
Loretz, el codigo que pusiste funciona, entonoces tengo un caos en la cabeza jaja...
Cuando retorna un valor puntero o un valor comun y silvestre no se pierde el valor retornado, entonoces qué pasa con la variable declarada dentro de la funcion?.. no se destruye?...

Lo digo porque, en el caso de retornar un int, supongo que pasaría una copia y no sería problema, pero cuando retornas un int * no estarías retornando una copia... estarias retornando un puntero a la declaracion hecha dentro de la funcion...

#162
Entiendo.  Pero es lógico que un puntero al ser creado dentro de una función e intentar devolverlo no sirve de nada?.. eso pienso yo, el puntero queda vacío, sin valor.. y cuando se quiera usar como valor retornado no apuntará a ninguna parte...  es asi?
#163
Gracias por las respuestas, tendré que enfocarme en qué y cuando usar punteros, lo que pasa es que en mi afán de querer usarlos, cometo errores, típicamente cuando aprendo algo nuevo, me dan ganas de usar ese algo a la fuerza, y no debería pensar asi..

saludos.
#164
Hola!
Me he topado con el siguiente escenario:

Código (cpp) [Seleccionar]


//En este fragmento al terminar la función, se destruye el contenido de suma y retorna null o vacío, y el puntero suma sigue existiendo en memoria....
int RetornaUnaSuma(int a, int b){

    int * suma = new int;
    *suma = a+b;
    return *suma;
}

//Aqui intento retornar un puntero creado dentro de la misma función...
int * RetornaUnaSuma(int a, int b){

    int * suma = new int;
    *suma = a+b;
    return suma;

    //pero al terminar la función, se destruye el contenido y retorna una dirección de memoria sin contenido, el puntero sigue existiendo..
}



Según yo es mala práctica declarar punteros que quieras retomar dentro de una función o un ámbito...  bueno aparte de mala practica no funciona el retorno...Es como lo pienso?...

Probablemente se pueda devolver punteros cuando éstos mismos ingresan como argumento...

La función sería:

Código (cpp) [Seleccionar]

//Segun yo esto debe funcionar...
int * RetornaUnaSuma(int * pSuma, int a, int b){

    *pSuma = a+b;
    return pSuma;

}



Que opinan...
Saludos.
#165
Cita de: EdePC en 10 Febrero 2019, 02:26 AM
Saludos,

- La utilidad de los punteros está más enfoca al uso eficiente de la Memoria, lo que se dice Memoria Dinámica, ya has tocado los temas de Listas Enlazadas, Variables de tamaño variable en tiempo de ejecución, etc.

- Te recomiendo este libro, en su página 155 habla sobre el uso de los Punteros y muchos ejemplos donde demuestra el porqué de su uso:
https://openlibra.com/es/book/fundamentos-de-programacion-con-el-lenguaje-de-programacion-c-ed-2017

Capítulo 12

Memoria Dinámica. Punteros

Hasta ahora, todos los programas que se han visto en capítulos anteriores almacenan su estado
interno por medio de variables que son automáticamente gestionadas por el compilador. Las varia-
bles son creadas cuando el flujo de ejecución entra en el ámbito de su definición (se reserva espacio
en memoria y se crea el valor de su estado inicial), posteriormente se manipula el estado de la varia-
ble (accediendo o modificando su valor almacenado), y finalmente se destruye la variable cuando el
flujo de ejecución sale del ámbito donde fue declarada la variable (liberando los recursos asociados
a ella y la zona de memoria utilizada). A este tipo de variables gestionadas automáticamente por el
compilador se las suele denominar variables automáticas (también variables locales), y residen en
una zona de memoria gestionada automáticamente por el compilador, la pila de ejecución, donde
se alojan y desalojan las variables locales (automáticas) pertenecientes al ámbito de ejecución de
cada subprograma.

Así, el tiempo de vida de una determinada variable está condicionado por el ámbito de su decla-
ración. Además, el número de variables automáticas utilizadas en un determinado programa está
especificado explícitamente en el propio programa, y por lo tanto su capacidad de almacenamiento
está también especificada y predeterminada por lo especificado explícitamente en el programa.
Es decir, con la utilización única de variables automáticas, la capacidad de almacenamiento de
un determinado programa está predeterminada desde el momento de su programación (tiempo de
compilación), y no puede adaptarse a las necesidades reales de almacenamiento surgidas durante
la ejecución del programa (tiempo de ejecución). (1)

La gestión de memoria dinámica surge como un mecanismo para que el propio programa, du-
rante su ejecución (tiempo de ejecución), pueda solicitar (alojar) y liberar (desalojar) memoria
según las necesidades surgidas durante una determinada ejecución, dependiendo de las circuns-
tancias reales de cada momento de la ejecución del programa en un determinado entorno. Esta
ventaja adicional viene acompañada por un determinado coste asociado a la mayor complejidad
que requiere su gestión, ya que en el caso de las variables automáticas, es el propio compilador el
encargado de su gestión, sin embargo en el caso de las variables dinámicas es el propio programa-
dor el que debe, mediante código software, gestionar el tiempo de vida de cada variable dinámica,
cuando debe ser alojada y creada, como será utilizada, y finalmente cuando debe ser destruida
y desalojada. Adicionalmente, como parte de esta gestión de la memoria dinámica por el propio
programador, la memoria dinámica pasa a ser un recurso que debe gestionar el programador, y se
debe preocupar de su alojo y de su liberación, poniendo especial cuidado y énfasis en no perder
recursos (perder zonas de memoria sin liberar y sin capacidad de acceso).

1 En realidad esto no es completamente cierto, ya que en el caso de subprogramas recursivos, cada invocación
recursiva en tiempo de ejecución tiene la capacidad de alojar nuevas variables que serán posteriormente desalojadas
automáticamente cuando la llamada recursiva finaliza.

Gracias por tu respuesta!

Entonces los punteros están enfocados a ser utilizados en casos donde se requiera solicitar memoria dinámica, por ejemplo la dimensión personalizada de una matriz o arreglo.. verdad?..  y en que otros ámbitos se puede usar?
saludos!
#166
Yo entiendo que queda feo, pero es práctico, a mi no me quedó mas remedio que recurrir a ncurses y al System...   es decir, como ultimo recurso, que mas da?... en el amor, la guerra y la programación todo se vale  ;D
#167
Hola amigos..

pues tal como se lee en el título, seguramente me creerán idiota o algo por el estilo (asumo que es muy probable que sea así después de hacer esta pregunta)..

Creí que los punteros tenían un poder enorme en la programación, referencia memoria en vez de valor, supuse que era la opción perfecta para interactuar con muchos datos, pero después de ver que los arreglos y matrices internamente se procesan como punteros (pues son las reglas que conozco al menos de manejar mucha información) no le hallé mas sentido a los punteros, es decir... si tengo :

Código (cpp) [Seleccionar]


int numero = 5;

void ConsultarNumero(){
   cout << "Numero es : " << numero << endl;
}

void ModificarNumero(){
    numero = 6;
}

void SumarUnoAlNumero(){
     numero++;
}



En vez de :

Código (cpp) [Seleccionar]


int main (){
   int * numero = new int;
   *numero = 5;
   consultarNumero(numero);
   modificarNumero(numero, 6);
   sumarUnoAlNumero(numero);

}

void consultarNumero(int * _numero){
     cout << "El numero es : " << *_numero << endl;
}

void modificarNumero(int * _numero, int _nuevoNumero){
    *_numero = _nuevoNumero;
}

void sumarUnoAlNumero(int * _numero){
    *_numero++;
}





Como verán, simplemente reemplacé el puntero por una variable global, de todas formas sin puntero estoy accediendo a una variable compartida sin la necesidad de consultar su memoria...

Alguien me podría guiar sobre el uso de punteros?
Gracias de antemano.
#168
Templates!...
Gracias amigo, voy a echarle un vistazo...
#169
Hola señores..
Estoy intentando entender la sintaxis de Unreal.. y me topé con esto que no tengo claro:

Código (cpp) [Seleccionar]

UBoxComponent * caja = CreateDefaultSubmesh<UBoxComponent>(TEXT("Cubo"));


lo que va entre < > no me queda claro que cosa es, obviamente es una clase pero por qué va entre signos mayor y menor que... y que sería CreateDefaultSubMesh ?

Gracias.
#170
Hola amigos.

Tengo una alternativa para comprimir y descomprimir archivos desde el codigo, pero es algo bruta, simplemente usando la funcion system();  donde el parámetro es la linea de comando para comprimir o descomprimir:

Código (cpp) [Seleccionar]

system("gzip archivo.txt");
system("gzip -d archivo.txt");


Sin embargo, no se, algo me dice que no debo hacerlo asi, o quiza me persigue la idea de que debo aprender a toda costa a hacerlo usando librerias como zlib o 7zip...

Algun ejemplo de como comprimir o descomprimir?.. imagino que tengo que usar la clase FILE

Gracias de antemano.