Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2012, 13:49   #1
RENXFIL
 
Аватар для RENXFIL
 
Регистрация: 19.11.2012
Сообщений: 7
По умолчанию MemAvail и MaxAvail

MemAvail и MaxAvail, может кто знает полный код функции, в инете искал не нашёл, или другие варианты замены данных функций, очень надо, в Lazarus-е не работает данная функция!
MemAvail - Возвращает количество всей свободной памяти в куче.
MaxAvail - Возвращает размер самого большого непрерывного свободного блока в куче.
Код:
program ptr_prog;
{$mode objfpc}{$H+}
uses DOS,CRT,Windows,renxfiltrus,RenWin; {renxfiltrus,RenWin - это моё}
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
const max = 1000;
type vector_ptr = ^vector;
     vector = array[1..max] of longint;
var VP: vector_ptr;
    i,j: Int64;
    k: word;
    q: string;
begin
  clrscr;
  RenxWin(3,11,1); {Razmer okna, Color linii, Color fona}
  GotoXY(29,2); xfil_ruslazdos('Использование указателей',true);
  q:=xfil_ruslazdos(' байт',false);
  i:=MemAvail;
  GotoXY(3,5); write(xfil_ruslazdos('Перед размещением свободно ',false),i:7,q);
  New(VP);
  j:=MemAvail;
  GotoXY(3,6); write(xfil_ruslazdos('После размещения свободно ',false),j:7,q);
  k:=i-j;
  GotoXY(3,7); write(xfil_ruslazdos('Разрешено ',false),k:7,q);
  for k:=1 to max do VP^[k]:=2*k+1;
  Dispose(VP);
  VP:=nil;
  i:=MemAvail;
  GotoXY(3,8); write(xfil_ruslazdos('После освобождения свободно ',false),i:7,q);
  GotoXY(3,23); xfil_ruslazdos('Нажмите <Enter>:',true);
  readln;
end.
RENXFIL вне форума Ответить с цитированием
Старый 19.11.2012, 14:26   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

В каком смысле - "Полный код"? Исходник, штоле?

Код:
в Lazarus-е не работает данная функция!
Естественно, в fpc их нет, а Лазарь - вроде тот же fpc.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 19.11.2012 в 14:29.
Sciv вне форума Ответить с цитированием
Старый 19.11.2012, 14:31   #3
RENXFIL
 
Аватар для RENXFIL
 
Регистрация: 19.11.2012
Сообщений: 7
По умолчанию

Их по моему заменили чем-то что-ли, я не знаю чем, как сделать так что бы данный параметр заставить работать
RENXFIL вне форума Ответить с цитированием
Старый 19.11.2012, 15:26   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

RENXFIL, я вообще не уверен, что в Лазарусе есть такое понятие, как "свободная" память.. Да и главное, ЗАЧЕМ вам проверять, СКОЛЬКО памяти?
Используйте try except для обработки нештатных ситуаций.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 20.11.2012, 21:08   #5
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Их по моему заменили чем-то что-ли
Да, директивами компилятора. Причем не теми директивами, которые в коде, а теми, которые опционально в командной строке задаются
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 21.11.2012, 01:28   #6
RENXFIL
 
Аватар для RENXFIL
 
Регистрация: 19.11.2012
Сообщений: 7
По умолчанию

Ладно, фиг с ним, придётся пропустить это место, я так то изучаю сам по книге =)
RENXFIL вне форума Ответить с цитированием
Старый 21.11.2012, 09:22   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Ладно, фиг с ним, придётся пропустить это место, я так то изучаю сам по книге =)
смотрите, какую ошибку Вы делаете.
Вы взяли руководство по управлению гужевой повозкой, сели в автомобиль, и теперь не можете найти, где же вожжи... (простите мне за столь драматическую аллегорию).
Так вот, либо возьмите тот продукт, пособие (книгу) по которому Вы читаете, например, Turbo Pascal (только учтите, что эта среда разработки уже мертва, и труп тормошат исключительно в учебных целях!),
либо, возьмите книгу по тому продукту, который Вы изучаете (кстати, если Вы уж учите Паскаль, то изучение Delphi намного полезней и перспективнее),

либо, уж как минимум, не заморачивайтесь с теми отличиями, на которые Вы уже наткнулись (и наткнётесь ещё далее)...

А так — успехов в обучении!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.11.2012, 13:20   #8
RENXFIL
 
Аватар для RENXFIL
 
Регистрация: 19.11.2012
Сообщений: 7
По умолчанию

Модуль System не воспринимается почему?
ptr_prog.pas(3,21) Error: Duplicate identifier "SYSTEM"


------
Спасибо за совет(я об этом знаю!), не кто наверно не любит когда ему указывают, каждый преследует свои цели

Последний раз редактировалось RENXFIL; 21.11.2012 в 13:35.
RENXFIL вне форума Ответить с цитированием
Старый 21.11.2012, 14:46   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

либо вы его дважды написали, либо модуль System в uses вообще не нужно указывать! (он там уже есть незримо!)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.11.2012, 08:31   #10
RENXFIL
 
Аватар для RENXFIL
 
Регистрация: 19.11.2012
Сообщений: 7
По умолчанию

Перевод, не корректен, но понятен.

Старые функции Turbo Pascal MemAvail и MaxAvail функции не доступны в Free Pascal, начиная с версии 2.0. Причина этой несовместимости ниже:

На современных операционных систем, 4 идею "доступной памяти" не подходит для приложений. Причинами являются:

Один процессор цикла после применения спросил OS, сколько памяти свободно, другое приложение может быть выделено все.
Пока не ясно, что "свободная память" означает: оно включает подкачки памяти, имеет ли он дисковый кэш памяти (дисковый кэш может увеличиваться и уменьшаться на современном OS'es), она включает памяти, выделенной для других приложений, но которые могут быть выгружается из памяти, и т.д.

Таким образом, программы, использующие MemAvail и MaxAvail функции должны быть переписаны, чтобы они больше не использовать эти функции, потому что оно не имеет смысла на современных ОС. Есть 3 варианта:

Используйте исключения ловить вне ошибок памяти.
Установить глобальную переменную "ReturnNilIfGrowHeapFails", чтобы правда и проверить после каждого распределении ли указатель отличается от Нила.
Не волнует и объявить манекен функция называется MaxAvail, которая всегда возвращает High (LongInt) (или некоторые другие константы).

Всё спасибо, ответ был дан)
RENXFIL вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Аналог MaxAvail pupilMartyr Общие вопросы Delphi 4 01.06.2011 19:23