Programación General > C/C++
Problema con la segunda lista
JuanK:
Más o menos esa es la idea.
Lo más recomendable es que en cada archivo ubiques tareas especificas, por ejemplo si tienes funciones que trabajan el archivo en memoria, lo recomendable es que haya un archivo donde esten todas estas funciones, si hay funciones que solo hacen trabajos del archivo en disco..igualmente, si manejas estructuras de datos, todas estas funciones de manejo de esta estructura, desde su creacion, hasta el dezplazamiento, insercio o borrado de datos, deberian ir por aparte, todo es cuestion de que clasifiques tus funciones de acuerdo a lo que hagan.
Debes ser precabido y de preferencia todas las definiciones de tu programa meterlas en un archivo .h, asi en tu programa en vez de escribir:
--- Código: Text ---/*~-1*//*~XSF_LANGUAGE: C/C++*//*~K*//*~+:Este Programa busca en el dico duro en la carpeta que se le indique todos los archivos con estension C o H, crea una lista con ellos, y despues lee todos los archivos que estan en esta lista para buscar los "define" que hay en ellos, y realiza otra lista con estos.*//*~K*//*~+:Libresias*//*~T*/#include <alloc.h>#include <conio.h>#include <dir.h>#include <dirent.h>#include <dos.h>#include <stdio.h>#include <stdlib.h>#include <string.h> /*~K*//*~+:Estructuras de las dos Listas*//*~T*/struct ListaArchivos { char *NombreArchivo; char *NombreCarpeta; int Indentificador; ListaArchivos *Archivo_anterior_Ptr, *Archivo_siguiente_Ptr; ListaArchivos () : Archivo_anterior_Ptr(NULL), Archivo_siguiente_Ptr(NULL) {}; } ; struct ListaDefines { char *NombreDefine; int NumeroElemento; ListaDefines *Define_anterior_Ptr, *Define_siguiente_Ptr; ListaDefines () : Define_anterior_Ptr(NULL), Define_siguiente_Ptr(NULL) {}; } ;/*~K*//*~+:Variables Globales*//*~T*/struct ListaArchivos *ListaArchivos_Ptr = NULL;struct ListaDefines *ListaDefines_Ptr = NULL;int i = 0;int j = 0;int k = 0;int PrimerVez_bt = 0;int PrimerFallo_bt = 0;int Fallo = 0;int Indentificador_u16 = 0;int Numero_u16 = 0;int YaExiste = 0;int YA = 0;int YA1 = 0;/*~K*//*~+:Constantes*//*~T*/#define FinalLinea ''#define Tabulador 0x09#define Retorno 0x0A#define Espacio 0x20#define Almoadilla 0x23#define ParentesisAbierto 0x28#define ParentesisCerrado 0x29#define Punto 0x2E#define Semicoma 0x3B#define Letra_C 0x43#define Letra_H 0x48#define LlaveAbierta 0x7B#define LlaveCerrada 0x7D#define Copyright 0xA9#define MAX_LONG_D_N 14 metes todo eso dentro de un archivo .h, por ejemplo radarman.h y colocas esto en
el encabezado de tu programa asi:
#include"radarman.h"
si usas variables globales, en cada archivo que las vuelvas a usar deberas colocar: ejm
extern int mivariable;
sin embargo en el archivo donde este lña declaracion lo colocas normalmente
int mivariable;
Eso es todo por el momento
Por otro lado, seguramente esque hay codigo que no conozco en c, por eso dije que tu programa era cpp y tal vez sea algo de c que nunca he manejado, por ejemplo:
--- Código: Text ---struct ListaArchivos { char *NombreArchivo; char *NombreCarpeta; int Indentificador; ListaArchivos *Archivo_anterior_Ptr, *Archivo_siguiente_Ptr;/*--------------------------------------------------*/ ListaArchivos () : Archivo_anterior_Ptr(NULL), Archivo_siguiente_Ptr(NULL) {}; /*-------------------------------------------------*/ } ;
Me perdonas por la ignorancia pero realmenmte no se que hace la instruccion que te coloque entre lineas.
Me explicas porfa...
Juank
radarman:
Buenas otra vez,
tienes toda la razon eso es C++, no me habia dado cuenta, pero ahora si que estoy seguro que es lo unico.
Entonces esto:
struct ListaArchivos { char *NombreArchivo;
char *NombreCarpeta;
int Indentificador;
ListaArchivos *Archivo_anterior_Ptr, *Archivo_siguiente_Ptr;
/*--------------------------------------------------*/
ListaArchivos ()
: Archivo_anterior_Ptr(NULL), Archivo_siguiente_Ptr(NULL) {};
/*-------------------------------------------------*/
} ;
--------------------------------------------------------------------------------
en C es:
struct DateiElement { char *DateiName;
char *OrdnerName;
int Handler;
DateiElement *vorherige_Datei_Ptr, *naechste_Datei_Ptr;
} *vorherige_Datei_Ptr = NULL, *naechste_Datei_Ptr = NULL;
_________________________________
que me imagino ya lo conoceras.
De todas formas tengo el problema que tengo es que no puedo insertar mas de 775 elementos en la segunda lista, y necesito poder hacerlo porque tengo muchos mas.
Cuando lo miro con el Borlandc me indica que se guarda en un segmento cualquiera xxxx : yyyy ds : xyzt, pero cuando el "ds" me llega la limite se para y no se pasa a otro segmento de memoria, entonces queria saber si es posible indicarle que lo haga para que me siga creando la lista.
Un saludo.
JuanK:
1- trata de usar algo diferente a borland, ya que otros compiladores ya te tienen solucionado ese problema implicitamente.
2-Como la memoria ha llegado a su tope, deberias pensar en un medio de almecenamiento secundario, es decir cada que completes x cantidad de registros deberas bajar estos registros a un archivo en disco que puedes utilizar de manera temporal, y asi liberar los registros en memoria, mejor dicho es como hacer un reciclado de memoria... espero que me haya hecho entender...
JuanK
radarman:
Hola juank,
muchas gracias por tus aclaraciones, pero si puedo abusare un poco mas de tus conocimientos y paciencia.
Te explico lo que he cambiado, he hecho una rutina que me crea un archivo "txt" cada vez que llego a los 700 elementos, entonces segun yo despues borro la lista y creo una nueva otra vez hasta los 700 elementos, el problema viene a la hora de borrar la lista, segun yo lo tengo que hacer con el "free" ya que la creo con "malloc", pero eso no ocurre.
Entonces te pediria si puedes ver la sutina de borrar lista de defienes (es con la que estoy trabajando ahora) y ver si puedes encontrar el fallo.
Muchas gracias.
JuanK:
En las 2 rutinas don de efectuas el "borrado" lo que estas haciendo es cambiando la direccion del apuntador.
Recuerda que cuando utilizas malloc, lo que haces es "reservar" una porcion de la memoria, una vez reservada creas una variable que apunte a ese segmento.
Por ejemoplo imagina que llamas a malloc pero que no le asignas el resultado a nada, es decir:
--- Código: Text --- int main(){ . . malloc(5);} Esto no te arroja ningun error...per que paso con la memoria que llamaste con malloc?..pues que quedo reservada, entonces si tu le asignas null al puntero, le estas es cambiando su direccion, mas no liberando la memoria que ha sidio reservada, para esto necesariamente debes utilizar free();
No he estudiado muy a fondo tu programa, asi que es probable que me quede algun "agujerillo" pendiente por ahi, pero de todod modos se supone que este codigo funciona, por que es el que yo uso cuando trabajo con listas.
--- Código: Text --- int BorrarListaDefine (void){/*JUANK*/ struct ListaDefines *aux= NULL; PrincipioListaDefine (); aux = ListaDefines_Ptr; while(ListaDefines_Ptr->Define_siguiente_Ptr!=NULL) { ListaDefines_Ptr=aux; aux = aux->Define_siguiente_Ptr; free(ListaDefines_Ptr); } return 1;} Espero que te sea de utilidad.
Chau
JuanK.
Navegación
[#] Página Siguiente
[*] Página Anterior
Ir a la versión completa