La Web del Programador: Comunidad de Programadores
 
    Pregunta:  349 - PROBLEMAS CON MEMORIA CONVENCIONAL
Autor:  Gerardo Quiros
Soy estudiante y he tenido problemas con los programas que he desarrollado en Clipper 5.2 a la hora de ejecución pues estos son muy grandes.
He hecho el LINK usando el metodo de los OVL y de un solo EXE, sin embargo sigo teniendo las mismas dificultades.
Ademas quisiera saber que significa el numero que muestra al terminar de hacer el LINK.(ej.409K). Que puedo hacer?

  Respuesta:  Rafa
prueba a usar blinker para enlazar y el siguiente archivo lnk:
# uso de overlays
BLINKER OVERLAY FIXED

# tamaño del overlay 60k
BLINKER OVERLAY OPSIZE 60

# linkado completo OFF /o no ON
BLINKER INCREMENTAL OFF

# uso de la memoria expandida para los overlays
BLINKER OVERLAY PAGEFRAME ON

# tamaño más pequeña para un overlay
BLINKER OVERLAY THRESHOLD 256

BLINKER CACHE XMS 512, 25%
BLINKER CACHE EMS 128, 50%

OUTPUT

FILE ,

BEGINAREA
FILE
ENDAREA

LIB clipper

BEGINAREA
# C/ASM Modules from CLIPPER.LIB
MOD accept, acopy, adel, ains, appexit, appinit, atail, cmem, dbcmd0
MOD dbcmd1, dbcmd2, dbcmd3, dbcmd4, dbcmd5, dbcreate, dbgapi, dbgshado

#nuevos
MOD dbjunct, dim0, dim1, dynina, errorsys, gx, maxrow, txopen, upref
MOD vall, vblock, vdbg, xmacro

# otros
MOD dbnubs, dbstruct, delimdyn, diskio, dlm0, dlm1, emmalloc, emmcount
MOD emmfree, emminst, emmpage, emmreall, emmstat, emmvers, errsys0
MOD exactcmp, getenv, gets0, gets1, gets2, gx, initexit, instd, joinlist
MOD lupdate, memory, mrelease, msave, oldbox, oldclear, outstd, philes
MOD rddord, rddsrv, run, saverest, scroll, sdf0, sdf1, sdfdyn, send, seq
MOD sortof, squawk, startsym, tb, version

# nuevo
MOD _afields, _appini, _atpromp, _century, _dbcopy, _dbdelim
MOD _dbflist, _dbghelp, _dbginsp, _dbgmenu, _dbjoin, _dblist
MOD _dblocat, _dbsdf, _dbsort, _dbstrux, _dbtotal, _dbupdat
MOD _fledit, _helpkey, _input, _readvar, _setta, _text, _wait

MOD MEMOEDIT, MEMOTRAN, MEMOREAD, MEMOWRIT, MEMOLINE, MLCOUNT
MOD MLPOS, ACHOICE, ASCAN, ASORT, ARRAY, DIRECTRY, DBSTRUCT
MOD DBCREATE, JOINLIST, SORTOF, COPYFILE, TYPEFILE, SCROLL, GETE
MOD DISKSPAC, EXAMPLEA, EXAMPLEP

ALLOCATE extend # Overlay all of EXTEND.LIB
ENDAREA

LIB terminal
LIB

Otra opción en que lo enlaces en modo protegido con este fichero lnk:
BLINKER INCREMENTAL OFF
BLINKER LINK VERSION 3.0
BLINKER LINK XMS ON
BLINKER LINK EMS ON
BLINKER CACHE XMS 50%
BLINKER HOST DPMI ON
BLINKER HOST VCPI ON
BLINKER HOST XMS ON
BLINKER EXECUTABLE EXTENDED
BLINKER MESSAGE WINK
OUTPUT
WORKFILE temporal.TMP
FILE
//u1
FILE
FILE
LIB \BLINKER4\LIB\BLXCLP52
LIB \BLINKER4\LIB\BLXRATEX
LIB CLIPPER
LIB EXTEND
LIB TERMINAL

  Respuesta:  Nodgard Seguias
escribeme yo te puedo ayudar

  Respuesta:  Gerardo A. Mendoza
Hola:
Muchas veces los problemas de memoria no son del programa, si no de la programación. Deberías considerar seriamente las propuesta de clipper en cuanto a los siguientes puntos:
-Utiliza variables "Local" y "Static" olvidate de las Public y Private lo más posible, salvo en casos que sean absolutamente necesarias, y creéme, no son tan necesarias.
-Independientemente del tipo de variable que utilices declárala.
-Recuerda que se propone una programación modular, con lo cual debes utilizar rutinas (function/procedure) "Static", que solo son visibles dentro del .PRG que existen. Hay muchas rutinas que son de apoyo.
-Trata de utilizar los arreglos, ya que estos solo generan "un" nombre de variable en la tabla de símbolos. Por ejemplo para realizar un proceso entre un rango de fechas y alguna clave (evita 3 variables con un arreglo que contenga estos datos).
-Procura que tus rutinas no sean demasiado grandes, por aquello de la paginación de memoria que utiliza el VMM de Clipper.
-Declara los parámetros de tu rutina dentro de la declaración de ésta, para que sean locales.
Static Function FuncionX(param1, param2, ...)
en vez de
Statif Function FuncionX
Parameters param1, param2, ...
-Crea rutinas genéricas que puedas utilizar más de una o dos veces a lo largo de tu aplicación. Utiliza LIB para crear tu propia librería.
-Aunque es demasiado tarde, los campos de las tablas (.DBF) son considerados como variables Public, lo cual significa que aunque cierres la tabla los campos existen. Por eso es recomendable utilizar los mismos nombres de campos en las diferentes tablas, por ejemplo las claves de los catálogos y las tablas de transacciones.
-Usa el Alias de las tablas para referenciar los campos y que sea fácil distinguirlos de las variables CLIENTES->claveclien.

Y en lo que pueda seguir ayudándote. Saludos. :-)


  Respuesta:  Juan Reyes
... Ademas quisiera saber que significa el numero que muestra al terminar de hacer el >LINK.(ej.409K). Que puedo hacer?

Veo que ninguno de mis amigos anteriores te respondió esto, ya que no es común que se informe por allí.

Este número amigo indica el TAMAÑO DE CARGA de tu aplicación.

Es decir, la cantidad de memoria convencional que requiere tu aplicación para cargarce en la memoria convencional, en el caso de tu ejemplo, debes de informarle a tus clientes que tu sistema requiere 409Kb de memoria convencional para ejecutarce.
Nunca antregues este valor exacto, siempre auméntale 50Kb :-)

Si estas enlazando con blinker, utiliza al final de tu LNK una de las siguientes líneas :

// Reemplaza la ruta que corresponda

@e:\lib\bl41\clp\lnk\CL520Max.Lnk
@e:\lib\bl41\clp\lnk\CL520Mid.Lnk
@e:\lib\bl41\clp\lnk\CL520Min.Lnk

Enlaza tu aplicación, anota el número que te aparece al final ( como los 409kb de tu ejemplo ).
Prueba con cada uno de los LNK que te mencioné, y date cuenta que cuando utilices el MAX, el ahorro de memoria es al máximo y el valor del tamaño de carga disminuye, no así cuando utilizas el MIN, tu valor de carga aumenta :-)
Lógico.
Como recomendación por lo general utiliza CL520Mid, ( nivel medio de optimización )

Este valor te aparecerá en modo real o dual, fíjate que en modo extendido no te aparece, lógico, ya que exigencia de memoria convencional no hay en este modo extendido ( BLINKER EXECUTABLE EXTENDED ).

:-) Juan Reyes
http://members.xoom.com/manuales http://members.xoom.com/jonysoft