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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.08.2014, 17:30   #1
Lamia
Пользователь
 
Регистрация: 24.08.2014
Сообщений: 15
По умолчанию System error Code 8 Недостаточно памяти для обработки команды

при многократном вызове функции выползает эта ошибка. Я так понимаю, что дело в том, что не высвобождается память после вызова функции, хотя вроде бы локальные переменные после завершения функции автоматически удаляются. Если это так, то как освобождать память после нее, если нет, то в чем может быть проблема?
Код:
function  SelectGreyLVL(Image: TBitMap; Step: integer):TBitMap;
var
  x,y , GrS, MaxGrs, MinGrs: Integer;
  BitMap : TBitMap;
  P : PRGBArray;
  tadr : string;
begin
  BitMap := TBitMap.create;
  tadr :=  'first_1.bmp';
  Image.SaveToFile(tadr);
  try
    BitMap.LoadFromFile(tadr);
    for y := 0 to BitMap.Height -1 do
    begin
      P := BitMap.ScanLine[y];
      for x := 0 to BitMap.Width -1 do
      begin
        GrS := round(0.299*(P[x].rgbtRed and $FF)
              +0.587*(P[x].rgbtGreen shr 8 and $FF)
              +0.114*(P[x].rgbtBlue shr 16 and $FF));
        if(GrS = Step) then
        begin
          P[x].rgbtBlue  := Grs; //255; //
          P[x].rgbtGreen := Grs; //255; //
          P[x].rgbtRed := Grs; //255; //
        end
        else
        begin
          P[x].rgbtBlue  := 255;
          P[x].rgbtGreen := 255;
          P[x].rgbtRed := 255;
        end;
      end;
    end;
  finally
    BitMap.SaveToFile(tadr);
    Result := BitMap;

  end;
end;
Изображения
Тип файла: png trouble.png (24.0 Кб, 158 просмотров)
Lamia вне форума Ответить с цитированием
Старый 24.08.2014, 18:40   #2
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Кажись FreeMem освобождает память.
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 24.08.2014, 19:56   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

BitMap создали, а осфобождается ли он где-то за пределами функции?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.08.2014, 20:02   #4
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
BitMap создали, а осфобождается ли он где-то за пределами функции?
А разве локальные объектные переменные не уничтожаются автоматом?

P.S. Попробуй в конце функции после
Код:
Result:=BitMap;
добавить
Код:
FreeAndNil(BitMap);
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 24.08.2014, 20:29   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
А разве локальные объектные переменные не уничтожаются автоматом?
Нет кончено )
И потом функция возвращает. Значит нужно для дальнейшей работы за ее пределами. А вот освобождение за ее пределами сделано или нет мы не знаем.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.08.2014, 21:04   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
А разве локальные объектные переменные не уничтожаются автоматом?
Это вам не C# и не Java где есть сборщики мусора.
Человек_Борща вне форума Ответить с цитированием
Старый 24.08.2014, 23:39   #7
Lamia
Пользователь
 
Регистрация: 24.08.2014
Сообщений: 15
По умолчанию

Цитата:
Сообщение от саша40 Посмотреть сообщение
А разве локальные объектные переменные не уничтожаются автоматом?

P.S. Попробуй в конце функции после
Код:
Result:=BitMap;
добавить
Код:
FreeAndNil(BitMap);
Простите, но эта функция вызывает такую же ошибку, как и Bitmap.Free: 'Access violation at adress ...'.

Цитата:
Сообщение от Stilet Посмотреть сообщение
BitMap создали, а осфобождается ли он где-то за пределами функции?
как освободить локальную переменную вне функции? к тому же эта функция вынесена в отдельный юнит.
Lamia вне форума Ответить с цитированием
Старый 25.08.2014, 02:46   #8
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от Lamia Посмотреть сообщение
как освободить локальную переменную вне функции? к тому же эта функция вынесена в отдельный юнит.
Локальную переменную освобождать ручками не надо. Она сама собой "освободится". Но ты в коде своём создал объект типа TBitmap, система выделила тебе память для него. Если тебе этот объект на каком-то этапе программы стал не нужным, то надо освободить память выделенную ему.

Цитата:
Сообщение от саша40 Посмотреть сообщение
P.S. Попробуй в конце функции после
Код:
Result:=BitMap;
добавить
Код:
FreeAndNil(BitMap);
Саша40, ты когда-нибудь начнешь думать перед тем как отвечать?
Внутри функции создали объект класса TBitmap, ссылку на него присвоили неявной переменной Result и сразу после этого уничтожили этот объект. Что же тогда получила программа вызвавшая эту функцию?

Последний раз редактировалось Stilet; 25.08.2014 в 09:11.
northener вне форума Ответить с цитированием
Старый 25.08.2014, 09:12   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
как освободить локальную переменную вне функции? к тому же эта функция вынесена в отдельный юнит.
А как ты используешь эту функцию?
Вообще для чего она тебе нужна и почему оформлена в функцию?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.08.2014, 16:29   #10
Lamia
Пользователь
 
Регистрация: 24.08.2014
Сообщений: 15
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Локальную переменную освобождать ручками не надо. Она сама собой "освободится". Но ты в коде своём создал объект типа TBitmap, система выделила тебе память для него. Если тебе этот объект на каком-то этапе программы стал не нужным, то надо освободить память выделенную ему.
Не понимаю, ведь битмап объявлен переменной в самой функции и, следовательно, является локальной переменной, как мне вне функции тогда ее освободить?
Цитата:
Сообщение от Stilet Посмотреть сообщение
А как ты используешь эту функцию?
Вообще для чего она тебе нужна и почему оформлена в функцию?
Она выделяет пикселы определенного уровня серой градации на изображении. Я использовал функцию, так как много раз вызываю.
Переделал в процедуру, без создания нового битмапа, больше проблемы не возникает, спасибо.
Код:
procedure SGL(Image: TBitMap; Step: integer);
var
  x,y , GrS: Integer;
  P : PRGBArray;
begin
    for y := 0 to Image.Height -1 do
    begin
      P := image.ScanLine[y];
      for x := 0 to Image.Width -1 do
      begin
        GrS := round(0.299*(P[x].rgbtRed and $FF)
              +0.587*(P[x].rgbtGreen shr 8 and $FF)
              +0.114*(P[x].rgbtBlue shr 16 and $FF));
        if(GrS = Step) then
        begin
          P[x].rgbtBlue  := Grs; //255; //
          P[x].rgbtGreen := Grs; //255; //
          P[x].rgbtRed := Grs; //255; //
        end
        else
        begin
          P[x].rgbtBlue  := 255;
          P[x].rgbtGreen := 255;
          P[x].rgbtRed := 255;
        end;
      end;
    end;
  
end;
и все же было бы неплохо понять, почему битмапы не удаляются, как локальные переменные остальные...
Lamia вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Консоль ошибка: "Недостаточно Недостаточно памяти для завершения операции. " _ZZZ000_ Visual C++ 0 01.12.2013 17:25
"Недостаточно памяти для обработки команды..." _-Re@l-_ Общие вопросы Delphi 4 19.06.2010 17:51
Недостаточно памяти для обработки команды TBitMap finder_sl Мультимедиа в Delphi 12 03.03.2010 20:40
Массив TBitmap, "Недостаточно памяти для обработки команды" Роман Радер Мультимедиа в Delphi 5 05.04.2009 18:14
Thread creation error - Недостаточно памяти RealSwift Общие вопросы Delphi 1 06.07.2008 12:27