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

#241
@paris2312, tu acercamiento en este caso es totalmente erroneo, para afrontar este tipo de problemas tienes que usar tipos de datos dinamicos, en tu caso por lo que veo deberías crearte una estructura:

typedef struct CONTACTO{
    char nombre[MAX_PATH];
    char apellido[MAX_PATH];
    char direccion[MAX_PATH];
    char tel[MAX_PATH];
}


Luego necesitas un contenedor para almacenar cada contacto por separado, puedes usar arrays, listas, etc...aunque por lo que veo no debes tener mucho dominio de estructuras de datos, en fin, buena suerte
#242
Cita de: NicoSanhueza en 25 Junio 2018, 04:15 AM
Código (cpp) [Seleccionar]

dat func(dat* x)
{
    x->aa=78.9;
    x->pp=&f;

    return x;
}


Primero, la función esta mal planteada. No tiene mucho sentido lo que haces en este código, pero aun siguiendo tu lógica tienes un error, ya que segun el prototipo la función devuelve un tipo de dato struct en cambio tu estas devolviendo un puntero. En todo caso debes desreferenciar el puntero al retornarlo:
Código (cpp) [Seleccionar]
return *x;
#243
Como ya te han dicho antes, en c no hay tipo de datos string, luego solo queda trabajar con arreglos de chars (lo que viene siendo la propia imp!ementacion del tipo string). Ahora, si intentas devolver una variable local en una funcion los datos retornados seran inconsistentes e impredecibles ya que dicha variable local al salir de su ambito (funcion) sera eliminada del stack. Para lograr lo que quieres tienes un par de opciones:

1- Creas la variable en la funcion padre y la pasas como parametro por referencia

2- Usas variables globales, estáticas o memoria dinamica (como dijeron antes tienes que estar seguro de eliminarla cuando no la necesites)

3- Haces una copia de la variable retornada justo al salir de la funcion:
   Si es una cadena puedes usar strcpy, strncpy, etc. Para cualquier otro tipo de datos memcpy, copy, etc
   
Código (cpp) [Seleccionar]
char mystr[MAX_PATH];
char *ptr = MyFunction();
if(ptr != null)
// evita bof
strncpy(mystr, ptr, sizeof(mystr));


BONUS- Si trabajar estrictamente con char* no es un requisito entonces usa std::string al retornar de la funcion:
Código (cpp) [Seleccionar]
std::string mystr = MyFunction();

Saludos
#244
Ahora mismo no te tengo ningún link pero supongo que cualquier libro o curso de c++ avanzado que trate tema de punteros te servirá, supongo que google te podría dar algunos urls. Los paréntesis son usados más que nada para el casting y la dereferencia del puntero.
#245
la linea

Código (cpp) [Seleccionar]
irc = *((ircs *)param);

simplemente hace un casting del parametro enviado (param) a tipo puntero de variable "ircs" y luego dereferencia dicho puntero  a una variable tipo ircs (irc), por lo que en otras palabras terminas teniendo una variable "irc" del parametro "param"
#246
C++ no tiene soporte nativo para la impresion de documentos (al menos que yo sepa), la impresión está condicionada por el sistema operativo que uses, en este caso windows tiene sus drivers y un sistema de spooling, etc. Aqui tienes alguna informacion

https://msdn.microsoft.com/en-us/library/windows/desktop/dd162861(v=vs.85).aspx
https://msdn.microsoft.com/en-us/library/windows/desktop/ff819270(v=vs.85).aspx

De cualquier forma necesitas usar las APIs que te brinda tu sistema operativo y hacer las llamadas desde tu codigo c++. He encontrado este codigo por ahi pero no se si funcionara del todo, igual te podria servir

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <windows.h>
#include <string.h>

void printer(char text[])
{

// Bring up a dialog to choose the printer
PRINTDLG pd = {0};
pd.lStructSize = sizeof( pd );
pd.Flags = PD_RETURNDEFAULT | PD_RETURNDC;
pd.nCopies=1;

// Show the printer Dialog
PrintDlg( &pd );


// Zero and then initialize the members of a DOCINFO structure.
DOCINFO di = {0};
di.cbSize = sizeof(DOCINFO);
di.lpszDocName = "Scribble Printout";
di.lpszOutput = (LPTSTR) NULL;
di.lpszDatatype = (LPTSTR) NULL;
di.fwType = 0;

// Begin a print job by calling the StartDoc function.
StartDoc(pd.hDC, &di);

// Inform the driver that the application is about to begin sending data.
StartPage(pd.hDC);

//here we put images\text or other DC things;)

//send some text
TextOut(pd.hDC,800,800,text, strlen(text));


//Lets close  the printer
// Inform the driver that the page is finished.
EndPage(pd.hDC);

// Inform the driver that document has ended.
EndDoc(pd.hDC);
}

int main ()
{
printer("Hello world");
return 0;
}


Igual puedes buscarte la vida con alguna libreria, estas por ejemplo:

https://www.gtkmm.org/es/index.html
https://developer.gnome.org/gtkmm-tutorial/unstable/sec-printing-example.html.en#sec-printing-example-simple
https://www.codeproject.com/Articles/89/Printing-Class-Library

Saludos y buena suerte
#247
Programación C/C++ / Re: Duda con punteros
7 Junio 2018, 15:50 PM
Cita de: SrMcLister en  7 Junio 2018, 13:58 PM
Buenas ThunderCls.

Si, entiendo que el Nodo que creo que es el que le meto el numero y apunta a primero es la misma dirección de memoria.
Y si, en el tema de punteros he incidido bastante.
El tema del destructor también lo controlo y está bien hecho.
Sigo investigando, cuando tenga la solución la pongo por aquí.
Un Saludo y gracias por tu respuesta!

Hola

Pues si dominas todos estos aspectos que te comento entonces no entiendo donde tienes el problema. Tu pregunta inicial era "como gestionar bien la memoria en una lista simplemente enlazada"...bueno, pues creo que ya tienes la respuesta. Es sencillo, resumiendo, no puedes usar codigo de liberacion de memoria en el mismo metodo "Insertar", a no ser que uses copia de objecto en vez de copia de puntero. Necesitas crearte una funcion en la clase Lista que se encargue de liberar la memoria dinamica una vez hayas terminado de usarla. Al final de mi post anterior te puse un pseudocodigo como ejemplo.
Saludos
#248
Programación C/C++ / Re: Duda con punteros
5 Junio 2018, 22:52 PM
Si haces lo siguiente:

Código (cpp) [Seleccionar]

Nodo *nodoaux = new Nodo;
nodoaux->n = n;
this->primero=nodoaux;
delete nodoaux;


Es lo mismo que si hicieras algo como esto:
Código (cpp) [Seleccionar]

Nodo *nodoaux = new Nodo;
nodoaux->n = n;
this->primero=nodoaux;
delete this->primero;


No hay diferencias. Primero tienes que entender bien el concepto de punteros. En esta linea:
Código (cpp) [Seleccionar]
this->primero=nodoaux;

Solo estas copiando una direccion de memoria donde esta alojado un objeto "Nodo" y NO el objeto "Nodo" en si. Lo que seria lo mismo:

Código (cpp) [Seleccionar]
nodoaux=0x00001->Nodo
this->primero=0x00001->Nodo


Por lo que si destruyes el objeto Nodo, dicha direccion de memoria (puntero) estara apuntando a basura en ambas variables, ya que ambas contenian la misma direccion de memoria (apuntaban al mismo objeto). En este caso debes implemetar la liberacion de memoria directamente en tu Lista ya sea en el destructor y/o en algun otro metodo destinado a ello (Clear, Free, etc).

Código (cpp) [Seleccionar]
while ((actual = primero) != NULL) {
    primero = primero->siguiente;         
    delete actual;
    actual = null;
}
#249
Código (cpp) [Seleccionar]
string path2 = "ESTA_ES_OTRA_RUTA";
#250
Programación C/C++ / Re: array
22 Marzo 2018, 21:05 PM
Pues creas un vector de dos dimensiones y listo

Código (cpp) [Seleccionar]
double coches[][3];

Saludos