elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


  Mostrar Mensajes
Páginas: 1 ... 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 [25] 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 ... 47
241  Programación / Programación C/C++ / Re: ayuda con ficheros en: 26 Junio 2018, 18:50 pm
1- Debes usar etiquetas de código en tu post o tu código directamente hará sangrar los ojos de los que intentamos leerlo  ;)

2- Este tipo de trabajos con ficheros se hace mas difícil en caso de no conocer o que los ficheros estén creados sin una estructura especifica ya que tienes que leer los ficheros como texto, manejar espacios, terminaciones de linea, divisores de datos...en fin. Lo ideal para este tipo de problemas, encima de que estas usando c (no se que tanto conozcas de estructuras de datos), es usar ficheros binarios con estructuras. Te creas la estructura que tendrán los ficheros y puedes leer y escribir en ellos con el mínimo esfuerzo.

Suerte
242  Programación / Programación C/C++ / Re: mi programa no lee las opciones del menu en: 26 Junio 2018, 18:35 pm
@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:
Código
  1. typedef struct CONTACTO{
  2.    char nombre[MAX_PATH];
  3.    char apellido[MAX_PATH];
  4.    char direccion[MAX_PATH];
  5.    char tel[MAX_PATH];
  6. }
  7.  

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
243  Programación / Programación C/C++ / Re: Consulta sobre retorno en las funciones en: 26 Junio 2018, 17:49 pm
Código
  1. dat func(dat* x)
  2. {
  3.    x->aa=78.9;
  4.    x->pp=&f;
  5.  
  6.    return x;
  7. }
  8.  

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
  1. return *x;
244  Programación / Programación C/C++ / Re: Retornar punteros char? ¿Si o si memoria dinamica? en: 26 Junio 2018, 16:41 pm
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
  1. char mystr[MAX_PATH];
  2. char *ptr = MyFunction();
  3. if(ptr != null)
  4. // evita bof
  5. 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
  1. std::string mystr = MyFunction();

Saludos
245  Programación / Programación C/C++ / Re: Ayuda con una estructura y puntero //winsock// en: 22 Junio 2018, 15:00 pm
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.
246  Programación / Programación C/C++ / Re: Ayuda con una estructura y puntero //winsock// en: 21 Junio 2018, 22:31 pm
la linea

Código
  1. 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"
247  Programación / Programación C/C++ / Re: Duda acerca de imprimir (en impresora) en: 8 Junio 2018, 20:09 pm
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
  1. #include <stdio.h>
  2. #include <windows.h>
  3. #include <string.h>
  4.  
  5. void printer(char text[])
  6. {
  7.  
  8. // Bring up a dialog to choose the printer
  9. PRINTDLG pd = {0};
  10. pd.lStructSize = sizeof( pd );
  11. pd.Flags = PD_RETURNDEFAULT | PD_RETURNDC;
  12. pd.nCopies=1;
  13.  
  14. // Show the printer Dialog
  15. PrintDlg( &pd );
  16.  
  17.  
  18. // Zero and then initialize the members of a DOCINFO structure.
  19. DOCINFO di = {0};
  20. di.cbSize = sizeof(DOCINFO);
  21. di.lpszDocName = "Scribble Printout";
  22. di.lpszOutput = (LPTSTR) NULL;
  23. di.lpszDatatype = (LPTSTR) NULL;
  24. di.fwType = 0;
  25.  
  26. // Begin a print job by calling the StartDoc function.
  27. StartDoc(pd.hDC, &di);
  28.  
  29. // Inform the driver that the application is about to begin sending data.
  30. StartPage(pd.hDC);
  31.  
  32. //here we put images\text or other DC things;)
  33.  
  34. //send some text
  35. TextOut(pd.hDC,800,800,text, strlen(text));
  36.  
  37.  
  38. //Lets close  the printer
  39. // Inform the driver that the page is finished.
  40. EndPage(pd.hDC);
  41.  
  42. // Inform the driver that document has ended.
  43. EndDoc(pd.hDC);
  44. }
  45.  
  46. int main ()
  47. {
  48. printer("Hello world");
  49. return 0;
  50. }

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
248  Programación / Programación C/C++ / Re: Duda con punteros en: 7 Junio 2018, 15:50 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
249  Programación / Programación C/C++ / Re: Duda con punteros en: 5 Junio 2018, 22:52 pm
Si haces lo siguiente:

Código
  1. Nodo *nodoaux = new Nodo;
  2. nodoaux->n = n;
  3. this->primero=nodoaux;
  4. delete nodoaux;
  5.  

Es lo mismo que si hicieras algo como esto:
Código
  1. Nodo *nodoaux = new Nodo;
  2. nodoaux->n = n;
  3. this->primero=nodoaux;
  4. delete this->primero;
  5.  

No hay diferencias. Primero tienes que entender bien el concepto de punteros. En esta linea:
Código
  1. 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
  1. nodoaux=0x00001->Nodo
  2. 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
  1. while ((actual = primero) != NULL) {
  2.    primero = primero->siguiente;          
  3.    delete actual;
  4.    actual = null;
  5. }
250  Programación / Programación C/C++ / Re: Duda de principiante... en: 22 Marzo 2018, 21:10 pm
Código
  1. string path2 = "ESTA_ES_OTRA_RUTA";
Páginas: 1 ... 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 [25] 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 ... 47
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines