(решено) SIGSEGV do arrBitmap[b].Free; - что не так?

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Re: SIGSEGV do arrBitmap[b].Free; - что не так?

Сообщение zub » 25.01.2017 12:26:45

Всё может быть))
Придется всетаки разобраться, а не тупо хватать любую чушь
zub
долгожитель
 
Сообщения: 2048
Зарегистрирован: 14.11.2005 23:51:26

Re: SIGSEGV do arrBitmap[b].Free; - что не так?

Сообщение vitaly_l » 25.01.2017 12:33:00

zub писал(а):Придется всетаки разобраться, а не тупо хватать любую чушь


Давайте разберёмся, вот полный код вместе с обработкой в середине.

Код: Выделить всё
private
arrBitmap : array[0..33] of TBitmap;


procedure TFormMain.FormCreate(Sender: TObject);
var
  b:byte;
begin
  for b := 0 to 22 do arrBitmap[b] := TBitmap.Create;
end; 


procedure TFormMain.someName();
var
  b:byte;
begin

for b := 0 to 22 do begin
   // ......
   Image1.Picture.Bitmap.LoadFromFile('xxx'+IntToStr(b)+'.png');
   arrBitmap[b].Assign(Image1.Picture.Bitmap);
   Canvas.StretchDraw(aRect,arrBitmap[b]);
   end;

end;


procedure TFormMain.FormClose(Sender: TObject; var CloseAction: TCloseAction);
var
  b:byte; 
begin
  try

  finally
    for b := 0 to 22 do arrBitmap[b].Free; // <== вот на этом коде вылетает SIGSEGV - почему?
  end;
end;



:?: Что-то может там УДАЛЯТЬСЯ без моего ведома и потом в конце программы выдавать SIGSEGV при for b := 0 to 22 do arrBitmap[b].Free; ?
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 2824
Зарегистрирован: 31.01.2012 16:41:41

Re: SIGSEGV do arrBitmap[b].Free; - что не так?

Сообщение zub » 25.01.2017 12:39:04

Я не знаю LCL и не могу сказать приводит ли Assign к ссылкам внутри arrBitmap[] на одно и тоже. Думаю не должен.
Дальнейшие разбирательства с моим участием только при наличии минимального компилируемого примера с ошибкой.
zub
долгожитель
 
Сообщения: 2048
Зарегистрирован: 14.11.2005 23:51:26

Re: (решено) SIGSEGV do arrBitmap[b].Free; - что не так?

Сообщение pupsik » 25.01.2017 12:47:32

Код: Выделить всё
arrBitmap : array[0..33] of TBitmap;
- это динамический массив? :shock:
Код: Выделить всё
arrBitmap : array of TBitmap;
а что тогда это?

Упс... сам наплутал (решение верное но не в данном варианте).
Но: Бородатый Пупсик - оказался прав!
я ошибся... Не ведитесь на бородатых :)
Придется всетаки разобраться, а не тупо хватать любую чушь
во..во.

Код: Выделить всё
FreeAndNil(arrBitmap[b]);

или
Код: Выделить всё
(arrBitmap[b] as TBitmap).Free;



п.с.
По идее, при закрытии формы массив удаляется.
Плюс: если вы хотите хранить что то в массиве то не надо так делать. Т.е. сами обрабатывайте запись в массив и удаление. А не наляписто
Код: Выделить всё
arrBitmap[b] := TBitmap.Create;

Или воспользуйтесь модулем fgl - для хранения объектов (если не охота писать работу с массивом).
pupsik
энтузиаст
 
Сообщения: 940
Зарегистрирован: 20.08.2014 16:20:13

Re: SIGSEGV do arrBitmap[b].Free; - что не так?

Сообщение grot » 25.01.2017 12:51:23

зачем вообще здесь нужен массив ???
grot
новенький
 
Сообщения: 43
Зарегистрирован: 13.02.2010 16:33:03

Re: SIGSEGV do arrBitmap[b].Free; - что не так?

Сообщение zub » 25.01.2017 12:56:11

>>а что тогда это?
Я имел ввиду что нет разницы статический или динамический - в этом случае у них одинаковое поведение, но чето не сложилось и "перередактировал" сообщение

Дело не в массиве а в ссылках на одно и тоже. как не заверни - дин\стат массив, список, чтото из fgl - ошибка не уйдет пока будет "двойной" вызов деструкторов
zub
долгожитель
 
Сообщения: 2048
Зарегистрирован: 14.11.2005 23:51:26

Re: SIGSEGV do arrBitmap[b].Free; - что не так?

Сообщение vitaly_l » 25.01.2017 13:03:38

zub писал(а):Дело не в массиве а в ссылках на одно и тоже. как не заверни - дин\стат массив, список, чтото из fgl - ошибка не уйдет пока будет "двойной" вы зов деструкторов


В общем я попробовал сделать пример, но в примере ошибка исчезла...

Код: Выделить всё
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls, Grids;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    StringGrid1: TStringGrid;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
    arrBitmap : array[0..33] of TBitmap;
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
var
  b:byte;
begin
  for b := 0 to 22 do arrBitmap[b] := TBitmap.Create;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  b:byte;
  aRect:TRect;
begin
  aRect.Top := 0;
  aRect.Left := 0;
  aRect.Bottom := Height;
  aRect.Right := Width;

for b := 0 to 22 do begin
   Image1.Picture.LoadFromFile('1.png');
   arrBitmap[b].Assign(Image1.Picture.Bitmap);
   Canvas.StretchDraw(aRect,arrBitmap[b]);
   end;
end;


procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
var
  b:byte;
begin
  try

  finally
    for b := 0 to 22 do arrBitmap[b].Free; // <== вот на этом коде вылетает SIGSEGV - почему?
  end;
end;


end.     



В вышеприведённом примере - ошибка не выскакивает.
Сбой - где-то в другом месте :((


Только assign остаётся... попробую по другому предать битмап, и нарисовать его... рисование явно не assign - может повезёт...

grot писал(а):зачем вообще здесь нужен массив ???

Массив хранит картинки, которые используются очень часто на протяжении работы программы.


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 2824
Зарегистрирован: 31.01.2012 16:41:41

Re: SIGSEGV do arrBitmap[b].Free; - что не так?

Сообщение zub » 25.01.2017 13:08:36

>>но в примере ошибка исчезла...
к вопросу о пользе минимальных примеров, а не к обрывком какойто лабуды в стартовых постах

Добавлено спустя 5 минут 43 секунды:
>>Только assign остаётся... попробую по другому предать битмап, и нарисовать его... рисование явно не assign - может повезёт...
Остается например посмотреть на каком индексе вылет, или например "распечатать" массив и посмотреть нет ли сразу в массиве ссылок на одно и тоже?. Потом глянуть стек и таки узнать на освобождении чего вылет... А вот гадать ассигн это или не ассигн не остается...
zub
долгожитель
 
Сообщения: 2048
Зарегистрирован: 14.11.2005 23:51:26

Re: SIGSEGV do arrBitmap[b].Free; - что не так?

Сообщение vitaly_l » 25.01.2017 13:16:46

zub писал(а):о пользе минимальных примеров

ну... ошибка-то, где то, здесь прячется...
pupsik писал(а):FreeAndNil(arrBitmap[b]);

Вот так, точно, перестала выскакивать: for b := 8 downto 0 do FreeAndNil(arrBitmap[b]); Проверил несколько раз.
:idea: :?: :arrow: Программисты дают добро на FreeAndNil(arrBitmap[b]) вместо arrBitmap[b].Free; ???
Последний раз редактировалось vitaly_l 25.01.2017 13:17:34, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 2824
Зарегистрирован: 31.01.2012 16:41:41

Re: SIGSEGV do arrBitmap[b].Free; - что не так?

Сообщение pupsik » 25.01.2017 13:17:00

zub интересует: насколько правильный данный код...
И можно ли его по другому написать?

Добавлено спустя 2 минуты 45 секунд:
Программисты дают добро на FreeAndNil(arrBitmap[b]) вместо arrBitmap[b].Free;
по идее: дело в другом.
Вложения
im_col.7z
(59.24 КБ) Скачиваний: 20
pupsik
энтузиаст
 
Сообщения: 940
Зарегистрирован: 20.08.2014 16:20:13

Re: SIGSEGV do arrBitmap[b].Free; - что не так?

Сообщение zub » 25.01.2017 13:25:33

Я не специалист по правильным кодам. вылетов вроде нет, утечек вроде нет - потянет. Но имхо для классов генерики никаких плюсов не несут

Добавлено спустя 1 минуту 2 секунды:
>>дают добро на FreeAndNil(arrBitmap[b]) вместо arrBitmap[b].Free; ???
Дают, но после того как ты устранишь ошибки
zub
долгожитель
 
Сообщения: 2048
Зарегистрирован: 14.11.2005 23:51:26

Re: SIGSEGV do arrBitmap[b].Free; - что не так?

Сообщение pupsik » 25.01.2017 13:30:36

Я не специалист по правильным кодам.
а я по иной причине спросил. Вы же, если не ошибаюсь, с ними плотно работаете.
Но имхо для классов генерики никаких плюсов не несут
в принципе да.

п.с.
Код не несет полезности, тем более пара строчек. Просто стало интересно...
pupsik
энтузиаст
 
Сообщения: 940
Зарегистрирован: 20.08.2014 16:20:13

Re: SIGSEGV do arrBitmap[b].Free; - что не так?

Сообщение vitaly_l » 25.01.2017 13:37:42

pupsik писал(а): im_col.7z

Так как в примере, более правильно создавать массивы картинок? Не понимаю, почему?

zub писал(а):Дают, но после того как ты устранишь ошибки

Нет никаких ошибок, всё работает.

zub писал(а):посмотреть на каком индексе вылет,
или например "распечатать" массив и посмотреть нет ли сразу в массиве ссылок на одно и тоже?.
Потом глянуть стек и таки узнать на освобождении чего вылет...

Вот на эти действия можно получить инструкцию? ( только, пожалуйста, без отправки в гууугл, я не хочу стоять в гуу-углу )


/
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 2824
Зарегистрирован: 31.01.2012 16:41:41

Re: SIGSEGV do arrBitmap[b].Free; - что не так?

Сообщение zub » 25.01.2017 13:40:32

Что значит плотно? Обычно. использую в виде велосипедов и в виде fpc-stl.
zub
долгожитель
 
Сообщения: 2048
Зарегистрирован: 14.11.2005 23:51:26

Re: SIGSEGV do arrBitmap[b].Free; - что не так?

Сообщение Дож » 25.01.2017 13:51:14

Но имхо для классов генерики никаких плюсов не несут

Статическая проверка типа значения, присваиваемого элементу коллекции
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 661
Зарегистрирован: 12.10.2008 16:14:47

Пред.След.

Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 1

Рейтинг@Mail.ru