UTNianos

Versión completa: ayudenme con tp algoritmos
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
hola como les va?...mi problema es que al ejecutar un programa en turbo pascal 7.0 borland en el cual uso nodos, listas, punteros, me salta error "203 heap overflow error"
se que es por falta de memoria, pero no se como agrandarla, a menos que mi programa este mal, se los dejo para que lo vean y me digan.

uses
crt,graph;
const
CANT_STAR = 25;
type
str12 = string[12];
str20 = string[20];
str30 = string[30];
tregStar = RECORD
nomStar : str20;
coordX,
coordY : word;
nroOrden : byte
end;
tvStar = ARRAY [1..CANT_STAR] of tregStar;
tregCnstStar = RECORD
nomCnstlcn : str30;
cjtoStar : tvStar;
end;
tarcCnstStar = file of tregCnstStar;
tregSeg = RECORD
ptoOrigen,
ptoDestino : byte
end;
tvSeg = ARRAY [1..CANT_STAR] of tregSeg;
tregCnstSeg = RECORD
nomCnstSeg : str30;
cjtoSeg : tvSeg;
end;
tarcCnstSeg = file of tregCnstSeg;
tinfoSt = tregStar;
tlistaSt = ^tnodoSt;
tnodoSt = RECORD
info : tinfoSt;
sgte : tlistaSt
end;
tinfoSg = tregSeg;
tlistaSg = ^tnodoSg;
tnodoSg = RECORD
info : tinfoSg;
sgte : tlistaSg
end;
rVecCns = RECORD
nomCnstlcn : str30;
lstSt : tlistaSt;
lstSg : tlistaSg
end;
tVecCns = ARRAY [1..15] of rVecCns;

PROCEDURE insnodoSt( var lista:tlistaSt; valor:tregStar);
var
p : tlistaSt;
begin
new(p);
p^.info := valor;
p^.sgte := lista;
lista := p;
end;

PROCEDURE insnodoSg(var lista:tlistaSg; valor:tregSeg);
var
p : tlistaSg;
begin
new(p);
p^.info := valor;
p^.sgte := lista;
lista := p
end;

PROCEDURE armar_lstSg(var vec:tVecCns; n:byte; reg2: tregCnstSeg);
var
x:byte;
begin
vec[n].lstSg:=nil;
x := 1;
while reg2.cjtoSeg[x].ptoOrigen <> 0 do
begin
insnodoSg(vec[n].lstSg,reg2.cjtoSeg[x]);
inc(x)
end;
end;
PROCEDURE armar_lstSt(var vec:tVecCns; n:byte; reg: tregCnstStar);
var
x:byte;
begin
vec[n].lstSt:=nil;
x := 1;
while reg.cjtoStar[x].nomStar <> ' *' do
begin
insnodoSt(vec[n].lstSt,reg.cjtoStar[x]);
inc(x)
end;
end;

PROCEDURE armarVector(var vec:tVecCns; var n:byte;nombre:str30;nombre2:str30);
var
cons : tarcCnstStar;
reg : tregCnstStar;
cons2: tarcCnstSeg;
reg2 : tregCnstSeg;
begin
assign(cons,nombre+'.dat');
reset(cons);
assign(cons2,nombre2+'.dat');
reset(cons2);
n := 0;
while not(eof(cons)) do
begin
read(cons,reg);
read(cons2,reg2);
inc(n);
vec[n].nomCnstlcn := reg.nomCnstlcn;
armar_lstSt(vec,n,reg);
armar_lstsg(vec,n,reg2);
end;
close(cons);
close(cons2);
end;

PROCEDURE ordenar(var vec:tVecCns; n:byte);
var
aux: rvecCns;
i,
j: byte;
begin
for i:=1 to (n-1) do
begin
for j:=(i+1) to n do
begin
if vec[i].nomCnstlcn > vec[j].nomCnstlcn then
begin
aux := vec[i];
vec[i] := vec[j];
vec[j] := aux;
end
end
end
end;

FUNCTION Menu( vec:tVecCns; n:byte):byte;
var
i,
j,
opc : byte;

begin
clrscr;
i := 5;
gotoxy(16,i);
writeln('Elija una constelacion a graficar:');
for j := 1 to n do
begin
gotoxy(16,i+j);
writeln(j,'.-',vec[j].nomCnstlcn);
end;
readln(opc);
menu := opc
end;

PROCEDURE buscarenlista(list:tlistaSt;
valor:byte;
var p:tlistaSt);
var
q : tlistaSt;
begin
q := list;
p := NIL;
while ((q<>NIL)and(p=NIL)) do
begin
if valor <> q^.info.nroOrden then
q := q^.sgte
else
p := q
end
end;
PROCEDURE graficar(vec:tVecCns; opc:byte);
var
q: tlistaSg;
p: tlistaSt;
x1,y1,
x2,y2,
i:word;
nOrd,
ori,
des: string; {----------------------------------}
begin
setgraphmode(getgraphmode);
q := vec[opc].lstSg;
while q <> NIL do
begin
buscarenlista(vec[opc].lstSt,
q^.info.ptoOrigen,
p);
x1 := p^.Info.coordX;
y1 := p^.Info.coordY;
buscarenlista(vec[opc].lstSt,
q^.info.ptoDestino,
p);
x2 := p^.Info.coordX;
y2 := p^.Info.coordY;
str(q^.info.ptoOrigen,ori);
str(q^.info.ptodestino,des);
q := q^.sgte
end;
p := vec[opc].lstSt;
i := 0;
while p <> NIL do
begin
str(p^.info.nroOrden,nOrd);
i := i + 20;
p := p^.sgte
end
end;
PROCEDURE ProcCnstlcns;
var
vecCns : tvecCns;
nombre : str30;
nombre2: str30;
n,
opc : byte;
begin
clrscr;
gotoxy(16,8);
writeln('ingrese el nombre del archivo binario de estrellas');
gotoxy(16,9);
readln(nombre);
gotoxy(16,10);
writeln('ingrese el nombre del archivo binario de segmentos');
readln(nombre2);
gotoxy(16,11);
armarVector(vecCns,n,nombre,nombre2);
ordenar(vecCns,n);

opc := menu(vecCns,n);

graficar(vecCns,opc);
{readln();}
readkey;
end;
begin
ProcCnstlcns;
end.

Ha, si alguien sabe como hacer funcionar bien los graficos...lo voy a preguntar en otro tema. grax.
Es mucho código para leer.¿Podés darnos una idea general de lo que se supone que hace el programa?
Es apenas lo ejecutas ?
yo use el dev-pascal, que viene con nose.que compilador (creo que el free pascal)

y lo ejecuta, y sale

Cita:ingrese el nombre del archivo binario de estrellas
15
ingrese el nombre del archivo binario de segmentos
12

Runtime error 2 at 0x00401318
0x00401318
0x0040189B
0x004018FC
0x00409D69

el error 2 es "file not found"
y eso es porque usas assign y reset, y no tengo los archivos =P
vos tenes los archivos ? capaz por eso..
desp al menos hasta ahi llega.
si tengo los archivos binarios, el problema viene cundo trata de hacer el vector de listas, tal parece que no me da el tamaño del heap, para crear la listas(maximo 15 listas), como sabran estas lista se hacen en el heap.
Quiero saber como agrandar el tamaño del heap en turbo pascal 7.0 borland, para el que conoce, ya pase el dentination de memory a disk, pero nada todavia. Les dejo los archivos binarios(no me deja subirlos).
el error que me salta es 203 heap overflow error.

AYUDA¡¡¡¡
GOOGLE



Cita:Si se obtienen errores de Desbordamiento del Heap mientras se ejecuta el programa desde dentro del IDE, puede probar saliendo de Turbo Pascal y ejecutar el programa desde la línea de comandos del DOS.

Véase el error de run-time número 1: Out of Memory para sugerencias sobre como recuperar memoria.


--------------------------------------------------------------------------------

ah, de paso, cuando compile en el dev (esta bueno como IDE) me tiro como 10 variables que las declarabas y no las usabas nunca; te conviene sacarlas porque ahi estas comiento memoria al pedo de paso..
Desp miro mas por arriba, estoy desde el laburo =P


sobre como recuperar memoria (que dice mas arriba ver "..")

Cita:Descripción:

Este error ocurre cuando el compilador se queda sin memoria.

Probar estas soluciones, en este orden:

1.Arregle el problema fuera del IDE:
◦Eliminar TSRs de memoria.
◦Modificar CONFIG.SYS para eliminar controladores innecesarios; también reducir ficheros y buffers (SET FILES = 20, SET BUFFERS = 20).
2.Reconfigurar Turbo Pascal:
◦Establecer Compile -> Destination a Disk.
◦Establecer Options -> Linker -> Link buffer a Disk.
◦Conmutar Graphics Screen Save OFF.
3.Modificar el código fuente:
◦Poner units en overlay en el programa
◦En Options -> Memory Sizes, reducir Stack Size y Low Heap Limit.
◦En Options -> Compiler...:
*Conmutar Range Checking y Stack Checking OFF.
*Conmutar Emulation OFF mientras se depura.
4.Intente usar el IDE para editar el programa, y luego usar el compilador en línea de comandos (TPC.EXE o TPCX.EXE) para compilarlo y el Turbo Debugger para depurarlo.
pero por lo que entendi de cuello en el heap se crean las variables dinamicas, he hice los calculos y la cantidad de memoria que nececito es 15000 bytes, es un poco menos que esto,y el heap lo tengo en maxima capacidad, segun turbo pascal de borland en 655345 bytes, me tendria que sobrar espacio, pero no. paso mail s c o t t 2 6 8 9 1 @ h o t m a i l . c o m (va todo junto por si no me dejan publicarlo).
Esto puede ser una pregunta extraña pero...cuanta RAM tenés?
2 gb 2gb 2 gb
6gb? ¿O solo estabas reiterando? =P.
Que raro,se me había ocurrido que se te lleno la RAM.Creo que me paso cuando probe un procedimiento recursivo de pablo <apellidoraro> que me termino cancelando el programa para la mierda.

Anyway proba usando linea de comandos con el .exe.Es decir ejecutar-->CMD y de ahi te posicionas en la carpeta donde esta el programa y de ahi le mandas el nombre del programa y enter y fijate.

Igual hace lo que posteo gonnza primero y despues postea los errores que te tira.También fijate si no tenés la RAM ocupada en otra cosa.No se mucho del tema,pero puede que haya otros programas comiendo RAM a lo loco y por eso te quedan menos de 15000 bytes (de otro modo,para tu capacidad de RAM debería ser un chiste 15MB).
Cita:Anyway proba usando linea de comandos con el .exe.Es decir ejecutar-->CMD y de ahi te posicionas en la carpeta donde esta el programa y de ahi le mandas el nombre del programa y enter y fijate.

eso lo hice yo, y me pasaba lo que le dije ahi (que no tenia los archivos)


igual me paarece raaaaaaaaaarisimo que le coma toda la RAM, por no decir imposible (salvo que entre en un bucle infinito por algo mal escrito)
Por eso estaria bueno q tires los archivos asi lo pruebo en mi casa, asi veo si solo es tu maquina ! y de paso vemos una solucion
No,hablaba de un proceso loco/virus no del programa en sí.
Eso! Tira los archivos che!
URLs de referencia